当我连续放置像素并清除像素时,如何避免闪烁?(SVGA / DOS)

时间:2015-11-01 12:19:51

标签: graphics dos 16-bit

我在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编程做到这一点?(或者可能有另一种解决方法?)

0 个答案:

没有答案