吴进的TC256源程序256basic.h阅读笔记,不知我的注释加的正确与否?
/***********************************************************************************************
// 刷新页面(将EMS存储的信息写到VRAM屏幕上)
// 对于640X480X256色需要5页VRAM;对于800X600X256色需要8页VRAM
***********************************************************************************************/
void vpost(void)
{
register unsigned int i,j;
if (!SurfaceMode) // 如果缓冲形式为:单缓冲页
{
for (j = 0 ; j < 5 ; j++) // 640X480X256共计5页BIOS Video
{
for (i = 0 ; i < 4 ; i++) // 1页EMS为16K,1页BIOS Video为64K
emap(j*4+i,i); // EMS逻辑页j*4+i和物理页i建立内存映射关系
selectpage(j); // BIOS Video 换页
memcpy(VPoint,EmsPoint,32768);// 拷贝EMS物理页0,1中存储的32K像素到VRAM前32K中
memcpy(VPoint+32768,EmsPoint+32768,32768);// 拷贝EMS物理页2,3中存储的32k像素到VRAM后32K中
}
}
}
/***********************************************************************************************
// 单字节的图像数据字节传输函数,desc(目标)和src(源)均为传输的EMS相对偏移
// 功能:将EMS空间中的单字节传输到VRAM(BIOS Video)。
// dest: 目标EMS相对偏移
// src : 源EMS相对偏移
// mode>=0 :使用mode颜色掩码(过滤掉mode颜色)
// mode=COPY_PUT :直接传输(也可以换OR_PUT等)
***********************************************************************************************/
void byte_emstov(unsigned long desc,unsigned long src,char mode)
{
register unsigned int vpage=desc>>16, // 目标转换成BIOS Video页号
voffset=desc&0xffff, // 目标相对VRAM页的偏移
emsmap=src>>14, // 源转换成EMS逻辑页号
emsoffset=src&0x3fff; // 源相对逻辑页的偏移
register unsigned char c1,c2;
if(lastEmap[0]!=emsmap)
emap(emsmap,0); // EMS逻辑页emsmap和物理页号0建立内存映射关系
if(lastVpage!=vpage)
selectpage(vpage); // BIOS Video 换页
c1=*(VPoint+voffset); // 取目标位置像素点颜色
c2=*(EmsPoint+emsoffset); // 取源位置像素点颜色
if (mode>=0)
{
if (c2!=mode)
*(VPoint+voffset)=c2; // (源)直接传输模式
}
else
{
switch(mode)
{
case COPY_PUT :*(VPoint+voffset)=c2;break;// (源)直接传输模式
case INVERT_PUT :*(VPoint+voffset)=~c2;break;// (源)取反模式
case OR_PUT :*(VPoint+voffset)=c1|c2;break;// (源和目标)或模式
case AND_PUT :*(VPoint+voffset)=c1&c2;break;// (源和目标)与模式
case XOR_PUT :*(VPoint+voffset)=c1^c2;break;// (源和目标)异或模式
default :*(VPoint+voffset)=c2;break;// (源)直接传输模式
}
}
}
/***********************************************************************************************
// BIOS Video 换页或者 EMS换页函数
***********************************************************************************************/
void MySelectpage1(unsigned int page,char mode)
{
if (mode) // BIOS Video换页
{
if (lastVpage!=page)
selectpage(page); // 调用BIOS Video 换页函数
}
else // EMS换页
{
char n;
for (n = 0 ; n < 4 ; n++)
{
if (page*4+n!=lastEmap[n])
emap(page*4+n,n); // EMS逻辑页page*4+n与物理页n(n=0-4)建立映射
}
}
}