热情软件屋

 

VESA标准显卡如何分页


编号:QA003132
建立日期: 2000年7月10日 最后修改日期:2002年1月20日
所属类别:

zz_cc_2000:
    操作系统:DOS
    编程工具:TC
    问题:我是一名福州大学的学生,我写信是想请您们帮忙的。我正在DOS操作系统下用Turbo C语言编一个图形程序,我的计算机的显卡附合VESA标准,具有800*600,64K色的显示能力。我用以下语句成功的将显卡设置成了800*600,64K色的显示模式。
     ...
     union REGS regs;
     regs.x.ax=0x4f02;
     regs.x.bx=0x114;
     int86(0x10,@regs,@regs);
     ...
    可在画点时发现一个大问题。画点时不是要每隔64K个字节都要进行一下分页,我用VGA模式的分页方式进行了分页,语句如下:
     ...
     outportb(0x03c4,0x0e);
     outportb(0x0xc5,a^0x02);/*a 就是第几页*/
     ...
    可并不成功。在万般无奈下,我向您们写信求助。求求您们了!这对我真的很重要,如果问题得不到解答,一功都无法进行。所以还请您们勿必帮忙!如果得到您们的帮助,我将感激不尽!谢谢!谢谢了!

回答:

    saga0036_cn的意见:
    注意:
    分页不一定是64k/页,trident 8900 卡是32k/页,64k color :2 bytes/pixel。不同的显卡,控制分页的端口不一样,但付合vesa的显卡可以通过获取分页中段函数地址直接对它调用或用分页中断,前者稍快。祥情请查vesa标准。
    If you have any questions,please contact me.=) my email saga0036_cn@sina.com
    s_w_y的意见:
    800*600分辨率并不支持分页,用tc只有300*200还有其它几个分辨率提供分页支持.
    另外屏幕只显示800*600象素,超出的部分也不必用分页,要显示的话把显示地址移到要显示的地方就行了。不知道对你有没有帮助,欢迎给我发邮件s_w_y@sina.com。
    L.Y.M的意见:
    对于你的问题其实可以利用Turbo C 的SVGA-BGI驱动(包括了vesa标准的各种显卡),然后就可以使用turbo C的initgraph及各种标准画点(pixel)画线(line)函数。如果一定要自己写底层函数,可参考VESA使用说明。现成的底层函数源程序及SVGA-BGI请imlym@email.com.cn。
    VRCAT的意见:
    使用vesa bios调用代替直接端口输出。直接端口输出兼容性不好,每种显卡都不一样。具体调用号请参阅vesa的rfc文档。
    王有翦的意见:
    你去找针对tc/bc的图形驱动程序(.BGI)开发包,开发出对应你的显卡的驱动程序后,再编程就非常简单了。你也可以到显卡的厂商的网站去找。
    
    马领先的意见:
    其实在VESA模式下,可以按照颜色模式的不同来进行分页:
     1、16色模式下:
     在此模式下同640*480*16的标准VGA显示模式,整个显存分为四个位平面,但是你不需要对它进行分页操作。
     2、256色模式下:
     此模式也与标准VGA卡的256色模式一样,每像素点8位,整个地址空间按行性连续存放,超过一定范围(如64KB)的VRAM地址空间用页面映射机制分块映射到主机提供的地址上,然后就像VGA的256色模式一样进行操作。下面就介绍以下256色模式下的分页操作:
     方法1:
     首先用VBE(VESA BIOS EXTENSION)功能4F01H返回VBE特定模式信息(IN:AX_4F01H,CX_模式号,ES:DI_指向VBE特定模式信息块的指针;OUT:AX_VBE返回值),返回值中从第13字节开始的指针指向的地址即为换页功能。入口:AX_4F05H,BH=0(SETBANK),BH=1(GETBANK),BL=00H(PAGE_A),BL=01H(PAGE_B),DX=PageNumber,出口:AX=RETURN,在调用时,注意要保存AX和DX。此方法速度要比方法2要快。
     方法2:
     调用4F05H功能,出入口参数与方法一中的一样。
     页面的计算:
     点的地址=纵坐标*分辨率(页粒度如640,800,1024等)+横坐标*每点所占的字节数
     页 面 号=(INT)(点的地址/65536)
     3、更高颜色模式:
     基本上与256色模式下一致,只不过像素点所占用的位数不同。
    如果你还需要更详细的资料或程序,请与我联系:BLACKH@YEAH.NET
    BLACKH@BYAIR.COM
    0535-6666744 6643048
    13053572449
    
    逍遥的意见:
    试试以下的分页方式:
    outportb(0x3cd,page);/*EVGA 800X600X256 显示模式AX=0x0030*/
    页号=(800*y+x)/65536;
    page:b0~b2 要读的页号
     b3~b5 要写的页号
    b7b6:01 每页64K
    我自己也没有用过这种显卡,不知道对你有没有帮助,请与我联系。
    E-mail:qtld_cn@sina.com
    QQ:3829246

此问题由saga0036_cn等回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio