置256色图形模式 要使用256色图形模式,使用TC的界面模式是不行的,因为它为VGA16色的文本模式,要使用256图形模式,则要调用显卡BIOS进行图形界面初始化。具体是调用10H的显示中断,将功能号AH置为0,子功能号AL置为要使用的模式号,以调用IBM兼容显卡的320×200的256色模式为列,程序如下。 #include "dos.h" void init256(int Vmode) { union REGS r; r.h.ah=0; r.h.al=Vmode; int86(0x10,&r,&r); } main() { init256(0x13); getch(); init256(0x3); } 运行后,屏幕进行了一次闪烁,实际上,这是屏幕显示模式切换引起的。切换模式后,屏幕一片黑暗,因为切换模式后,未对屏幕进行任何操作。接下来,我将演示在256色模式下对显卡的操作。 访问显存 初始化得到了256色图形模式的屏幕,接下来要做的就是向屏幕显示图像了。在显示图像之前,我要介绍一个很重要的far指针。也许你在16色VGAHI模式里用过,那就是内存中的图形模式显存映像指针0xa0000000,说它是映像指针,是因为显示器只与显示卡直接打交道,所以要更改屏幕内容还需更改显存内容。因此,内存中提供一块64k的区域,通过显示中断可以使它映射为显存的不同区域,更改该内存中的值即更改了相应映射区域的显存。让我们先试一下下面的程序:(注意:运行时,最好将内存模式设置为large,否则可能出错,以后我不再提示) #include "dos.h" main() { long i; char far *p=MK_FP(0xa000,0000); union REGS r; r.x.ax=0x13; int86(0x10,&r,&r); for(i=0;i<320*200L;i++)*(p+i)=i/320; getch(); r.x.ax=0x3; int86(0x10,&r,&r); } 看见了什么,你会惊诧地发现:多么丰富的色彩!DOS模式下的256色显示实现了! 显示卡换页 前面将过由于内存只提供64k的内存进行显存操作,在320×200的256模式下尚可访问所有的屏幕像素点。但是在320×200以上的256模式下就不行了,因为在此模式下,比如在640×480的256模式下,存储一屏所有的像素点需要640×480byte=300k的存储单元。比如使用以下程序: #include "dos.h" main() { long i; char far *p=0xa0000000; union REGS r; r.x.ax=0x5f;/*TNT2、GeForce2的640×480的256色模式均使用该模式号*/ int86(0x10,&r,&r); for(i=0;i<640*400L;i++)*(p+i)=(i/640)%256; getch(); r.x.ax=0x3;/*恢复为16色文本模式*/ int86(0x10,&r,&r); } 程序用意是将屏幕400行依次填上不同的颜色。然而结果却只更改了屏幕1/4还不到的区域。剩下的3/4区域如何去操作呢?这就要用到VESA显卡换页的功能。让0xa0000000开始的这64k显存映射到屏幕显存的其他3/4以下的区域。换页中断使用如下: void selectpage(char page) /*换页函数*/ { union REGS r; r.x.ax=0x4f05; r.x.bx=0; r.x.dx=page; /*选择页面*/ int86(0x10,&r,&r); } 使用该换页函数后,即可操作显存其他图像区域(默认的页面为0)。将该函数插入到前一程序的main函数之前,并在for循环前使用:selectpage(1),看看屏幕有什么结果。 640×480的屏幕按64k为划分为5块,因此,换页函数如果使用4以上的参数,屏幕上将无法显示。但是对显存的修改依然是存在的,只是不是在显示页上了而已。 前面的640×480的256色模式如果无法初始化,因为前面说过不同的显示卡制造商生产的显卡模式号不同。可以参考此表修改r.x.ax的参数: 640×480的256色模式模式号参照表
注:中断模式:640×480 256colors GraphicsMode 回显模式:640×480 16colors TextMode 芯片型号 中断模式号 回显模式号 SIS集成芯片 0x2e ? 3D Image系列芯片 0x5d ? Intel 81x集成芯片 0x79 0x7 TNT2系列显示芯片 0x5f 0x3 GeForce2显示芯片 0x5f 0x3 带?是因为我还没有测试出来,如果你测试出来了可以在论坛上公布 |