我在dos环境中并且具有64k的段内存(在16位dos中,以:0xA000:0000开头),直接映射到svga卡的帧缓冲区。
我可以通过将数据写入该段来操纵屏幕上显示的像素(并且还借助于选择页面的功能,以便仅使用64k来访问整个视频内存)。
putpixel函数类似于:
char far* scr = 0xA0000000
addr = (unsigned long)y*((unsigned long)COLS*4)+((unsigned long)x*4);// offset bytes
scr+=addr; // scr will be limited in one segment
if((NewPage=addr>>16)!=OldPage) { // equal to:addr/65536
OldPage = NewPage;
SelectPage(NewPage);
}
// color--4bytes,store the value of the pixel
*scr++=color;
*scr++=color>>8;
*scr++=color>>16;
The question is,how can I avoid flickering if I need to putpixels and clear them very often on the screen?(For example,I need to make a small piece of image move on the screen fluently).
我听说过双缓冲,但在dos中,我不知道如何处理页面更改(因为你直接将64k复制到0xA0000000)。
有没有人有dos的svga编程经验?我应该在调用putpixel之前等待CRT的垂直消隐吗?
我找到了该文件,但不知道如何直接在svga显卡的注册表上编程:
https://web.stanford.edu/class/cs140/projects/pintos/specs/freevga/vga/crtcreg.htm#15
对于vga卡,很多人用这个来等待:
while(!inportb(0x3da)&0x08);
有没有人知道如何为svga编程做到这一点?(或者可能有另一种解决方法?)