直接写屏技术在DOS下面很容易实现,调用BIOS的10h中断的00h功能即可进入视频模式,对于VGA、VESA的显示模式,显存的起始地址都是A000:0000H(是一个16位地址的段址+偏移形式)
进入视频模式,并且用一个far指针指向视频显存的首地址,然后你就可以在显存里面为所欲为了,比如画点什么的
例子:
#define MODE_VGA13H 0x13
#define MODE_TEXT 0x03
void setmode(char mode) //设置视频模式的函数
{
asm mov ah,0x00 //调用00h功能设置视频模式
asm mov al,mode //AL寄存器放欲设置的视频模式号,这里以13h视频模式为例
asm int 0x10 //调用10h中断
}
char far * vediobuf=(char far*)0xa0000000L; //指向显存地址的指针
void putpixel(int x,int y,int c) //画点的函数
{
*(vediobuf+x+320*y)=c;
}
int getpixel(int x,int y) //取点的函数
{
return *(vediobuf+x+320*y);
}
void main(void)
{
int i;
int j;
//设置VGA13H视频模式
setmode(MODE_VGA13H);
//用一个二重循环画满屏幕
for(i=0;i<20;i++)
for(j=0;j<320;j++)
putpixel(j,i,j);
getch();
//返回DOS文本模式
setmode(MODE_TEXT);
}
以上只是给出了很简单的实现直接写屏的代码,VGA13H视频模式是320*200*256的,即320*200的现实分辨率256色的最大颜色数。这个模式已经很落后了……当然你也可以设置其它的显示模式,在VESA标准中能支持多种高分辨率高色彩的视频模式,编程的原理都差不多,要注意的就是对分页的处理
网上有不少相关资料,找找看吧,比如有关中文DOS显示系统都有讲解