注册 登录
编程论坛 C图形专区

求助:直接写显存方式中的换页是怎么回事?

hotover 发布于 2010-05-17 15:54, 1334 次点击
看了《编写自己的图形开发包》里面的代码,在640*480,256的模式下,直接写内存需要换页,例如下面的画点函数:
/* 画点函数         */
void Dot(INT16 x, INT16 y, UINT8 color)
{
    UINT32  PageAll1, PageAll2;
    UINT8   PageIndex;

    if (x > -1 && x < COLS && y > -1 && y < ROWS)
    {
        PageAll1 = PageAll2 = (UINT32)y*(UINT32)COLS+(UINT32)x;//这是将屏幕看做一个坐标系算出的偏移,在//320*200模式里面就是这样算的。
        PageIndex = PageAll1 >> 16;//这里是将整个空间按照64K一小块这样分割的index。
        SelectPage(PageIndex);//但是为什么要换页,然后下面那句代码还是VideoBuffer[PageAll2] = color;
//我试过不换页,然后输出的图形是不对的

        VideoBuffer[PageAll2] = color;
    }
}

/* 换页函数         */
void SelectPage(register UINT8 page)
{
    _BX = 0;
    _DX = page;
    _AX = 0x4f05;
    __int__(0x10);
}

谁能给解释一下上面那段红色的代码么?
还有,在640*480模式下,屏幕应该是分割成几块小区域的对吧?这些小区域是怎么在屏幕上分布的?
谢谢!
4 回复
#2
forever742010-05-17 17:45
因为实模式显存地址段只有64K大小,放不下一屏幕640*480*1=307200这么多字节,所以要表示这么多字节就得换页。
从屏幕左上角开始横向每行640点,那么64K=65536字节就能表示65536点,也就是102个整行再加上第103行的前256点,这些点属于第0页。
于是接下来的65536点属于1页,再接下来的65536点属于2页,依此类推。
整个屏幕的640*480的256色的图像总共307200字节,要占4个整个64K的页,外加第5页的前45056字节。
#3
hotover2010-05-17 20:39
回复 2楼 forever74
那换页这个过程作了什么呢?
SelectPage(PageIndex);
VideoBuffer[PageAll2] = color;
第二句代码还是VideoBuffer[PageAll2],难道换页那个过程改变了VideoBuffer的值?
#4
forever742010-05-18 15:49
显存指针作为一个16位的段内偏移量,它应该符合unsigned short int类型的运算法则,也就是说按照整数溢出规则,65535+1=0
VideoBuffer[PageAll2]也就是*(VideoBuffer+PageAll2)在实际寻址的时候因为实模式的限制从而会把计算结果溢出的部分丢掉,相当于对64K取模

[ 本帖最后由 forever74 于 2010-5-18 15:58 编辑 ]
#5
hotover2010-05-18 18:25
回复 4楼 forever74
好的 ,其实昨晚问完后实验了一下,搞得差不多了。谢谢啊~
结贴!
1