CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

求助:关于屏幕显示的问题

楼主kix(kix)2004-12-01 21:48:56 在 C/C++ / C语言 提问

最近在读一个程序,里面有一个像屏幕上输出的函数,有几点不太懂,希望高手指点  
  1     c函数void   outportb(int   port,   char   byte)是往指定的硬件端口输出字节,0x3c0-0x3cf都是屏幕寄存器,那么0x3c4,0x3c5有什么区别?  
  2     程序里面的0xa0000D21l,0xa0008D21l表示什么意思?  
   
  同时那个达人明白这个函数的意思,还请指点一二,不胜感激!!!  
   
  void   frame(int   flagpa)  
    {register   long   i,j;  
      char   far   *   ptr;  
      outportb(0x3c4,2);//?  
      outportb(0x3c5,7);//?  
      if(flagpa==0)  
          ptr=(char   far   *)0xa0000D21l;//??  
      else  
          ptr=(char   far   *)0xa0008D21l;//??  
   
      for(i=0;i<280;i++)  
          {   for(j=0;j<75;j++)  
              {*ptr=0xFF;  
          ptr++;  
              }  
            ptr+=5;  
        }  
    if(flagpa==0)  
          ptr=(char   far   *)0xa0000D21l;  
    else  
          ptr=(char   far   *)0xa0008D21l;  
    outportb(0x3c4,2);  
    outportb(0x3c5,8);  
    for(i=0;i<280;i++)  
          {for(j=0;j<75;j++)  
              {*ptr=0;  
                ptr++;  
              }  
          ptr+=5;  
        }  
    outportb(0x3c5,0xf);  
  }  
  问题点数:0、回复次数:4Top

1 楼kix(kix)回复于 2004-12-02 09:35:28 得分 0

那个达人帮忙解答一下阿?Top

2 楼superman421(38度的雪)回复于 2004-12-02 10:02:27 得分 0

0xA0000000L显存的起址是这么多。  
  寄存器是什么就不记得了,以前很少用到这两个。给你一段程序自己看看。  
  #include<dos.h>  
   
  #define   VGA256   0x13  
  #define   TEXT_MODE   0x03  
  #define   PALETTE_MASK   0x3c6  
  #define   PALETTE_RD       0x3c7  
  #define   PALETTE_WR       0x3c8  
  #define   PALETTE_DATA   0x3c9  
   
  void   setVideoMode(int);  
  void   setPalette(int   ,int   ,int   ,int);  
  void   vLine(int   ,int   ,int   ,int   );  
  void   getPalette(int*,int*,int*,int);  
  void   H_Line(int   ,int   ,int   ,int   );  
  void   Rectangle(int   ,int   ,int   ,int   ,int   );  
   
  unsigned   char   far   *videoBuffer=(char   far*)0xA0000000L;  
   
  void   setVideoMode(int   mode)  
  {  
  union   REGS   inregs,outregs;  
  inregs.h.ah=0;  
  inregs.h.al=(unsigned   char)mode;  
  int86(0x10,&inregs,&outregs);  
  }  
   
  void   setPalette(int   r,int   g,int   b,int   index)  
  {  
  outp(PALETTE_MASK,0xff);  
  outp(PALETTE_WR,index);  
  outp(PALETTE_DATA,r);  
  outp(PALETTE_DATA,g);  
  outp(PALETTE_DATA,b);  
  }  
   
   
   
  void   VLine(int   y1,int   y2,int   x,int   color)  
  {  
  unsigned   int   lineOffset,index;  
  lineOffset=((y1<<8)+(y1<<6))+x;  
  for(index=0;index<=y2-y1;index++)  
  {  
  videoBuffer[lineOffset]=color;  
  lineOffset+=320;  
  }  
  }  
   
  void   HLine(int   x1,int   x2,int   y,int   color)  
  {  
  unsigned   int   lineOffset,index;  
  lineOffset=((y<<8)+(y<<6))+x1;  
  for(index=0;index<=x2-x1;index++)  
  {  
  videoBuffer[lineOffset]=color;  
  lineOffset++;  
  }  
  }  
   
  void   Rectangle(int   x1,int   x2,int   y1,int   y2,int   color)  
  {  
  HLine(x1,x2,y1,color);  
  HLine(x1,x2,y2,color);  
  VLine(y1,y2,x1,color);  
  VLine(y1,y2,x2,color);  
   
  }  
   
  void   clearBk(int   x1,int   x2,int   y1,int   y2)  
  {  
  for(;y1<=y2;y1++)  
  HLine(x1,x2,y1,0);  
  }  
   
  void   bar(int   x1,int   x2,int   y1,int   y2,int   color)  
  {  
  for(;y1<y2;y1++)  
  HLine(x1,x2,y1,color);  
  }  
   
  void   getPalette(int*r,int*g,int*b,int   index)  
  { outp(PALETTE_RD,index);  
  *r=inp(PALETTE_DATA);  
  *g=inp(PALETTE_DATA);  
  *b=inp(PALETTE_DATA);  
  }  
   
   
  //。。。。。。。。。  
  #include"SCREAN.H"  
   
  void   frame(int   flagpa)  
    {register   long   i,j;  
      char   far   *   ptr;  
        outportb(0x3c4,2);  
      outportb(0x3c5,7);  
      if(flagpa==0)  
          ptr=(char   far   *)0xa0000D21l;  
      else  
          ptr=(char   far   *)0xa0008D21l;  
   
      for(i=0;i<280;i++)  
          {   for(j=0;j<75;j++)  
              {*ptr=100;  
          ptr++;  
              }  
            ptr+=5;  
        }  
        getch();  
    if(flagpa==0)  
          ptr=(char   far   *)0xa0000D21l;  
    else  
          ptr=(char   far   *)0xa0008D21l;  
    outportb(0x3c4,2);  
    outportb(0x3c5,8);  
    for(i=0;i<280;i++)  
          {for(j=0;j<75;j++)  
              {*ptr=100;  
                ptr++;  
              }  
          ptr+=5;  
        }  
    outportb(0x3c5,0xf);  
  getch();  
  }  
   
  main(){  
  setVideoMode(VGA256);  
  VLine(0,100,10,100);  
  frame(0);  
  VLine(0,100,100,100);  
  getch();  
  setVideoMode(TEXT_MODE);  
  }Top

3 楼kix(kix)回复于 2004-12-02 10:52:45 得分 0

有没有详细点的答复阿???Top

4 楼sunlu_eric(天使预备役)回复于 2004-12-02 13:40:47 得分 0

那个不应该叫寄存器吧,应该叫端口号,用来做不同的判断和造作!  
  例如:我有的端口用来判断是不是可以传送数据,有的用来传数据,还有的表示这个  
  通讯口是不是及接收又传送数据!!!  
  这只是“相形”的说!Top

相关问题

  • win98 屏幕显示问题
  • 如何在手机屏幕上显示屏幕大小???
  • 显示器屏幕脏了怎么办??
  • 显示器屏幕抖动的问题...
  • 请问如何不让屏幕显示?
  • 还是全屏幕显示的问题?
  • 多屏幕显示的问题?
  • 屏幕上无法正常显示?
  • 求助:显示器屏幕变形
  • 获取屏幕(显示器的宽度)

关键词

  • 屏幕
  • 函数
  • x3c
  • d21l
  • palette
  • outp
  • inregs
  • outportb
  • xa
  • char far

得分解答快速导航

  • 帖主:kix

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo