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