guoshimin 发表于 2007-4-7 18:02

非标准VGA模式(VESA)下的图形编程问题

<P>在117H模式(可参看最后边提供的附录)下编写了一个图形初始化并画一条斜线的小程序,如下所示:</P>
<DIV class=htmlcode>
<P>#include&lt;dos.h&gt;<BR><BR>unsigned char far *screen=(unsigned char far *)0xA0000000L; /*显存首地址*/</P>
<P>int VesaOn(int mode)/*初始化117H模式*/<BR>{<BR>  union REGS r;<BR>  r.x.ax=0x4f02;<BR>  r.x.bx=mode;<BR>  int86(0x10,&amp;r,&amp;r);<BR>  return(r.h.ah);<BR>}</P>
<P>void VesaOff(void)/*返回到文本模式*/<BR>{ union REGS r;<BR>  r.x.ax=0x0003;<BR>  int86(0x10,&amp;r,&amp;r);<BR>}</P>
<P>void Put_Pixel(int x,int y,int color)/*画点*/<BR>{<BR>  screen[1024*y+x]=color;<BR>}</P>
<P>main()<BR>{ int i,j,k;<BR>  k=VesaOn(0x117);<BR>  for(i=0;i&lt;768;i++)/*画一条135度的斜线*/<BR>    Put_Pixel(i,i,5);<BR>  getch();<BR>  VesaOff();<BR>  if(k==0)printf("OK");<BR>}<BR></P></DIV>
<P>但实际显示出来的是多条平行的斜线,而且都集中在屏幕上部!不知是什么问题呢?<BR><BR>附录:<BR><BR>1。VESA 标准定义的图像显示模式号(非标准VGA模式)  <BR>            16色    256色    32768色    65536色    16777216色<BR>320×200                     10DH       10EH       10FH<BR>640×400            100H            <BR>640×800            101H     110H       111H       112H<BR>800×600    102H    103H     113H       114H       115H<BR>1024×768   104H    105H     116H       117H       118H<BR>1280×1024  106H    107H     119H       11AH    <BR>1600×1200          120H            </P>
<P>2。显示模式类型的识别<BR>彩色数       16    256    32768    65536    16777216<BR>每像素位数    4    8      15       16       24(32)<BR>位平面数      4    1      1        1        1</P>
<P>3。VESA BIOS只是标准VGA BIOS的扩充,也是通过中断INT  10H来实现。其功能号为4FH,VESA标准各功能则是它的子功能。调用方法如下:<BR>AH=4FH  AL=VESA的子功能号(0~7)<BR>其它入口参数按需要输入BX、CX、DX、ES、DI等寄存器中。<BR>每一功能的调用返回信息都放在AX中,格式为:<BR>AL=4FH则属支持此功能,否则不支持;<BR>AH=0则功能调用成功,否则失败。<BR>输出参数放在BX、CX、DX寄存器中。<BR></P>

guoshimin 发表于 2007-4-12 15:50

<P>在网上搜了许久,发现了问题的症结:<BR><BR>DOS的采用16位寻址,即寻址空间为64K。而117H模式需要的存储器大小为1024*768*4&gt;64K。因此超出64K的内容就无法正常显示了,需要换页才行,如下:<BR><BR>[CODE]selectpage(register   char   page) /*换页函数*/   <BR>  {union   REGS   r;   <BR>    r.x.ax=0x4f05;   <BR>    r.x.bx=0;   <BR>    r.x.dx=page; /*选择页面*/   <BR>    int86(0x10,&amp;r,&amp;r);   <BR>  }[/CODE]<BR>不过,查不到“r.x.bx=0; ”是什么意思、页号page为什么要存在r.x.dx里。谁能指点一下呢?</P>

lyood 发表于 2007-4-12 22:19

二、  子功能1:获取当前窗口<BR>入口参数:<BR>    AX=4f05H<BR>    BH=01H:获取当前窗口<BR>    BL:窗口号<BR>    =OOH;窗口A<BR>    =01H:窗口B<BR>出口参数:<BR>AX=VBE返回值<BR>Dx=以页粒度为单位的显示内存中的页面号<BR>

页: [1]

编程论坛