| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2076 人关注过本帖, 1 人收藏
标题:吴进的TC256源程序256basic.h阅读笔记(1)
只看楼主 加入收藏
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
收藏(1)
 问题点数:0 回复次数:3 
吴进的TC256源程序256basic.h阅读笔记(1)

注释是我加上去的,不知道不明确的正确与否,请指正。

/***********************************************************************************************
// 640*480*256写点函数,允许使用点模式。
***********************************************************************************************/
void putpixel(register int x,register int y,register unsigned char color)
{
register unsigned char n;
register unsigned char far *descpoint;
register long temp=(((unsigned long)y<<9L)+((unsigned long)y<<7L)+((unsigned long)x));
register unsigned int nowVpage,nowEmap;

if (x<screen_cut.left||x>screen_cut.right||y<screen_cut.top||y>screen_cut.bottom)
return;
if(SurfaceMode) // 如果缓冲形式为:无缓冲页
{
nowVpage = temp>>16; // 像素点转换成BIOS Video页号(64K为单位)
if(nowVpage!=lastVpage)
{
selectpage(nowVpage); // BIOS Video 换页
lastVpage=nowVpage;
}
temp&=0xffff; // 像素点相对 BIOS Video 页中的偏移
descpoint=VPoint; // 基地址 = 0xA000
}
else // 缓冲形式为:单缓冲页
{
nowEmap=temp>>14; // 像素点转换成EMS 逻辑页号(16K为单位)
if (nowEmap!=lastEmap[0])
emap(nowEmap,0); // 物理页号0与逻辑页号nowEmap建立射关系
temp&=0x3fff; // 像素点相对EMS逻辑页号中的偏移
descpoint=EmsPoint; // 基地址 = EMS基地址
}
switch(PIXEL_MODE) // (基地址+偏移)位置按照下述方式填充
{
case COPY_PUT :*(descpoint+(int)temp)=color;break;//直接传输
case INVERT_PUT :*(descpoint+(int)temp)=~*(descpoint+temp);break; //目标取反传输
case OR_PUT :*(descpoint+(int)temp)=*(descpoint+temp)|color;break;//或传输
case AND_PUT :*(descpoint+(int)temp)=*(descpoint+temp)&color;break;//与传输
case XOR_PUT :*(descpoint+(int)temp)=*(descpoint+temp)^color;//异或传输
}
}


/***********************************************************************************************
// 640*480*256读取像素颜色函数
***********************************************************************************************/
unsigned char getpixel(register int x,register int y)
{
register long temp=(((unsigned long)y<<9L)+((unsigned long)y<<7L)+((unsigned long)x));
register int nowEmap,n;

if (SurfaceMode) // 如果缓冲形式为:无缓冲页
{
selectpage(temp>>16); // BIOS Video 换页
temp&=0xffff; // 像素点相对 BIOS Video 页中的偏移
lastVpage=(temp>>16);
return (peekb(0xa000,temp)); // 获取BIOS Video当前页+偏移位置的颜色
}
else // 如果缓冲形式为:单缓冲页
{
nowEmap=temp>>14; // 像素点位置转换成 EMS 逻辑页号
if (nowEmap!=lastEmap[0])
emap(nowEmap,0); // 物理页号0和逻辑页号nowEmap建立映射关系
temp&=0x3fff; // 像素点相对EMS逻辑页nowEmap的偏移
return(*(EmsPoint+temp)); // 获取(EMS基地址+偏移)位置的颜色
}
}


/***********************************************************************************************
// 加载中文字体文件到EMS,初始化BMP图像数据区起始指针
***********************************************************************************************/
void LoadChinease()
{
unsigned int i;
int HZK;

BmpStackStart=EMS_DATA_SEEK;
if ((HZK=_open("HZK12",1))!=-1) // 加载HZK12点阵汉字库
{
for (i = 0 ; i < 11 ; i++)
{
emap(80+i,0); // EMS的80+i逻辑页和物理页0建立映射关系
_read(HZK,EmsPoint,16384); // 读16K点阵字模到EMS的80+i逻辑页中
}
emap(80+i,0); // EMS的91逻辑页和物理页0建立映射关系
_read(HZK,EmsPoint,16048); // 读最后15.7K点阵字模到EMS的80+11逻辑页中
HZK12_DATA+=EMS_DATA_SEEK; // 修正HZK12的EMS数据指针
BmpStackStart+=LENGTH_HZK12;
_close(HZK); // 关闭HZK12字库文件
}
if((HZK=_open("HZK16",1))!=-1) // 加载HZK16点阵汉字库
{
if(HZK12_DATA>0) // 如果HZK12不空
{
/********************************************************************************************************************************************
// 由于读HZK12字库文件时,EMS第80+11逻辑页只读了16048字节,还剩下336字节,
// 因此将HZK16字库文件的前336字节点阵字模读到第80+11逻辑页余下空间中
********************************************************************************************************************************************/
_read(HZK,EmsPoint+16048,336); // 读HZK16字库最初336字节点阵字模到EMS的91逻辑页剩余空间
for(i=0;i<16;i++)
{
emap(92+i,0); // EMS的92+i逻辑页和物理页0建立映射关系
_read(HZK,EmsPoint,16384);// 读16K点阵字模到EMS的92+i逻辑页中
}
emap(92+i,0); // EMS的108逻辑页和物理页0建立映射关系
_read(HZK,EmsPoint,5136); // 读HZK16字库最后5136点阵字模到EMS的108逻辑页
HZK16_DATA+=HZK12_DATA+LENGTH_HZK12;// 修正HZK16的EMS数据指针
}
else // HZK12字库如果空
{
for (i=0;i<16;i++)
{
emap(80+i,0); // EMS的80+i逻辑页和物理页0建立映射关系
_read(HZK,EmsPoint,16384);// 读HZK16字库文件16K点阵字模到EMS的80+i逻辑页中
}
emap(80+i,0); // EMS的80+16逻辑页和物理页0建立映射关系
_read(HZK,EmsPoint,5472); // 读HZK16字库文件5472字节点阵字模到EMS的96逻辑页中
HZK16_DATA=EMS_DATA_SEEK; // 修正HZK16的EMS数据指针
}
BmpStackStart+=LENGTH_HZK16;
_close(HZK); // 关闭HZK16字库文件
}
}


/***********************************************************************************************
// 清屏函数
// 由于640*480=307200/1024=300K/64=5页
// 入口参数:color = 清屏颜色
***********************************************************************************************/
void cls(unsigned char color)
{
register unsigned int i,n;
register char buffer[1024],*p=MK_FP(0xa000,0);

memset(buffer,color,1024);
if(SurfaceMode) // 如果缓冲形式为:无缓冲页
{
for (n = 0 ; n < 5 ; n++)
{
selectpage(n); // 选择BIOS Video n页(n=0-4)
for(i=0;i<64;i++) // BIOS Video每页64K
memcpy(p+i*1024,buffer,1024);// 每次给VRAM送1K
//movedata(FP_SEG(buffer),FP_OFF(buffer),0xa000,i*1024,1024);
}
}
else // 如果缓冲形式为:单缓冲页
{
for(n = 0 ; n < 300 ; n++) // 640X480X256色共需300K,共计容纳19个EMS逻辑页
{
i=n/16; // EMS每个逻辑页为16K
if (n%16==0)
emap(i,0); // 当i为16的整数倍则逻辑页i和物理页0建立内存映射关系
//*********************************************************************************************************************
// 依次将buffer中存储的1024字节清屏颜色送到EMS空间:EmsPoint + i*1024(i=0-15),其中EmsPoint为EMS空间基地址
//*********************************************************************************************************************
memcpy(EmsPoint+n%16*1024l,buffer,1024);// 将buffer数组中存储的清屏颜色送至EMS空间,每次送1024字节
}
}
}


/***********************************************************************************************
// Video Bios 换页函数
***********************************************************************************************/
selectpage(register char page)
{
union REGS r;

r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page; // 选择页面
int86(0x10,&r,&r);
lastVpage=page;
}

/***********************************************************************************************
// 刷新页面(将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像素到显存前32K中
memcpy(VPoint+32768,EmsPoint+32768,32768);// 拷贝EMS物理页2,3中存储的32k像素到显存后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)建立映射
}
}
}

搜索更多相关主题的帖子: 吴进 register 笔记 unsigned 
2006-12-30 16:54
lyood
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2006-6-15
收藏
得分:0 
[em01]辛苦了~~

2007-01-10 15:55
feixiang569
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-3-30
收藏
得分:0 

多谢了!

2007-04-01 09:59
yg_1031
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-5-10
收藏
得分:0 
为什么我的在TC3下编译出现很多错误啊???
求解答
2012-10-15 22:45
快速回复:吴进的TC256源程序256basic.h阅读笔记(1)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018370 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved