中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: DOS下640*480*256色显示程序 上一主题 | 下一主题
dsysps
初级用户





积分 98
发帖 34
注册 2006-11-3
状态 离线
『楼 主』:  DOS下640*480*256色显示程序

/*************************************************************** 文件名 :DOS256C.CPP 描 述 :DOS下256色显示程序 作 者 :*** 日 期 :2005/07/12 说 明 : 最后修改日期:2006/08/30 ***************************************************************/ #include "Includes.h" /**************************************************************/ BYTE far *p;//显存指针 #define MAXX 640//水平分辨率 #define MAXY 480//垂直分辨率 static WORD spage=0;//当前显示页号 BYTE vga_mode[64*2]; BYTE mode_bak[64*2]; /*************************************************************** 函数名称:SelectPage256(WORD page) 函数功能:显示换页函数 传入参数:page:要切换到的显示页号 返 回 值:无 ***************************************************************/ static void SelectPage256(WORD page) { union REGS r; r.x.ax=0x4f05; r.x.bx=0; r.x.dx=page; spage=page; int86(0x10,&r,&r); } /*************************************************************** 函数名称:OpenCloseDisp(BYTE bClose) 函数功能:打开或关闭显示 传入参数:bClose=1:关闭显示;bClose=0:打开显示 返 回 值:无 ***************************************************************/ void TestVga() { union REGS r; r.x.ax=0x4f04; r.x.dx=0x0001; r.x.cx=0x0001; _ES=FP_SEG(vga_mode); r.x.bx=FP_OFF(vga_mode); int86(0x10,&r,&r); } void OpenCloseDisp(BYTE bClose) { BYTE far * pp; pp=mode_bak; if(bClose==0) { pp=vga_mode; } union REGS r; r.x.ax=0x4f04; r.x.dx=0x0002; _ES=FP_SEG(pp); r.x.bx=FP_OFF(pp); r.x.cx=0x0001; int86(0x10,&r,&r); } /*************************************************************** 函数名称:InitColPal(void) 函数功能:用base\\ColPal.col文件的调色值,初始化显示调色板 传入参数:无 返 回 值:无 ***************************************************************/ void InitColPal(void) { FILE *fp; register r,g,b; if((fp=fopen("c:\\base\\ColPal.col","rb"))==NULL) return; for(int i=0;i<256;i++) { b=fgetc(fp); /*获取R、G、B分量*/ g=fgetc(fp); r=fgetc(fp); /*获取R、G、B分量*/ outportb(0x3c8,i); /*调色板寄存器索引号*/ outportb(0x3c9,r>>2);/*传入红色分量,6bit*/ outportb(0x3c9,g>>2);/*传入蓝色分量,6bit*/ outportb(0x3c9,b>>2);/*传入绿色分量,6bit*/ fgetc(fp); } fclose(fp); for(i=0;i<64*2;i++) mode_bak[i]=0x00; } /************************************************************** 函数名称:Init256Mode(void)//WORD mode) 函数功能:显示模式初始化 传入参数:mode:要设置的显示模式,在此固定为0X101 返 回 值:无 ***************************************************************/ void Init256Mode(void)//WORD mode) { p=(BYTE far*)0xa0000000L; union REGS r; r.x.ax=0x4f02; r.x.bx=0x101;//mode;//0x101:640*480 0x103:800*600 ...... int86(0x10,&r,&r); InitColPal(); } /*************************************************************** 函数名称:Exit256Mode(void) 函数功能:退出显示模式,回到默认显示模式 传入参数:无 返 回 值:无 ***************************************************************/ void Exit256Mode(void) { union REGS r; r.x.ax=0x003; int86(0x10,&r,&r); } /*************************************************************** 函数名称:SetPixel256(WORD x,WORD y,BYTE c) 函数功能:设置指定象素点的显示颜色 传入参数:x:X坐标位置 y:Y坐标位置 c:显示颜色 返 回 值:无 ***************************************************************/ void SetPixel256(WORD x,WORD y,BYTE c) { DWORD i; WORD tt; i=(DWORD)y*MAXX+x; tt=(WORD)(i>>16); if(spage!=tt) SelectPage256(tt); *(p+i)=c; } /*************************************************************** 函数名称:GetPixel256(WORD x,WORD y) 函数功能:取得指定象素点的显示颜色 传入参数:x:X坐标位置 y:Y坐标位置 返 回 值:指定象素点的显示颜色 ***************************************************************/ BYTE GetPixel256(WORD x,WORD y) { DWORD i; WORD tt; i=(DWORD)y*MAXX+x; tt=(WORD)(i>>16); if(spage!=tt) SelectPage256(tt); return (BYTE)*(p+i); } /*************************************************************** 函数名称:Draw256HL(int sx,int ex,int y,BYTE c) 函数功能:在指定位置画横线 传入参数:sx:X坐标开始位置 ex:X坐标结束位置 y:Y坐标位置 c:画线的颜色 返 回 值:无 ***************************************************************/ void Draw256HL(int sx,int ex,int y,BYTE c) { WORD tt; DWORD offs=(DWORD)y*MAXX+sx; for(int i=0;i<ex-sx;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } *(p+offs)=c; offs++; } } /*************************************************************** 函数名称:Draw256VL(int sy,int ey,int x,BYTE c) 函数功能:在指定位置画竖线 传入参数:sy:Y坐标开始位置 ey:Y坐标开始位置 x:X坐标位置 c:画线的颜色 返 回 值:无 ***************************************************************/ void Draw256VL(int sy,int ey,int x,BYTE c) { WORD tt; DWORD offs=(long)sy*MAXX+x; for(int i=0;i<ey-sy;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } *(p+offs)=c; offs+=MAXX; } } /*************************************************************** 函数名称:Box256(int sx,int sy,int ex,int ey,BYTE c) 函数功能:在指定位置画长方形 传入参数:sx:左上角X坐标 sy:左上角Y坐标 ex:右下角X坐标 ey:右下角Y坐标 c:画线的颜色 返 回 值:无 ***************************************************************/ void Box256(int sx,int sy,int ex,int ey,BYTE c) { Draw256HL(sx,ex,sy,c); Draw256HL(sx,ex,ey,c); Draw256VL(sy,ey,sx,c); Draw256VL(sy,ey,ex,c); } /*************************************************************** 函数名称:BoxFill256(int sx,int sy,int ex,int ey,BYTE c) 函数功能:在指定位置画实心长方形 传入参数:sx:左上角X坐标 sy:左上角Y坐标 ex:右下角X坐标 ey:右下角Y坐标 c:填充颜色 返 回 值:无 ***************************************************************/ void BoxFill256(int sx,int sy,int ex,int ey,BYTE c) { for(int j=sy;j<=ey;j++) Draw256HL(sx,ex,j,c); } /*************************************************************** 函数名称:PlotCircle 函数功能: 传入参数:sy: ey: x: color: 返 回 值:无 ***************************************************************/ /*static void PlotCircle(int x,int y,int xc,int yc,BYTE c) { for(int i=0;i<=x;i++) { SetPixel256(xc-x+i,yc+y,c); SetPixel256(xc+x-i,yc+y,c); SetPixel256(xc-x+i,yc-y,c); SetPixel256(xc+x-i,yc-y,c); } }*/ /*************************************************************** 函数名称:Circle256(int xc,int yc,int r,BYTE c) 函数功能:画圆 传入参数:xc:圆心X坐标 yc:圆心Y坐标 r:半径 c:画线的颜色 返 回 值:无 ***************************************************************/ void Circle256(int xc,int yc,int r,BYTE c) { int x,y; static double sind[]={0.1,0.2,0.3,0.39,0.48,0.56,0.64,0.72,0.78,0.84,0.89,0.93,0.96,0.99,1.00}; static double cosd[]={1,0.98,0.95,0.92,0.88,0.83,0.76,0.70,0.62,0.54,0.45,0.36,0.27,0.17,0.07}; for(int j=0;j<15;j++) { x=sind[j]*r; y=cosd[j]*r; for(int i=0;i<=x;i++) { SetPixel256(xc-x+i,yc+y,c); SetPixel256(xc+x-i,yc+y,c); SetPixel256(xc-x+i,yc-y,c); SetPixel256(xc+x-i,yc-y,c); } } } /*************************************************************** 函数名称:CircleFill256(int xc, int yc, int r, BYTE c) 函数功能:画实心圆 传入参数:xc:圆心X坐标 yc:圆心Y坐标 r:半径(8) c:填充颜色 返 回 值:无 ***************************************************************/ void CircleFill256(int xc, int yc,/* int r, */BYTE c) { for (int i = 0; i < 8; i++) { Circle256(xc, yc, i, c); } } /*************************************************************** 函数名称:Get256Blk(int sx,int sy,int ex,int ey,BYTE* pBuf) 函数功能:保存指定矩形区域的屏幕显示信息到缓冲区 传入参数:sy: sy: ex: ey: color: 返 回 值:无 ***************************************************************/ /*void Get256Blk(int sx,int sy,int ex,int ey,BYTE* pBuf) { WORD tt; BYTE* ppBuf=pBuf; long off=(long)sy*(long)MAXX+(long)sx; for(int j=sy;j<=ey;j++) { long offs=off+(long)MAXX; off=offs; for(int i=0;i<ex-sx;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } *ppBuf=*(p+offs); offs++; ppBuf++; } } } */ /*************************************************************** 函数名称:Set256Blk(int sx,int sy,int ex,int ey,BYTE* pBuf) 函数功能:从缓冲区恢复指定矩形区域的屏幕显示信息 传入参数:sx: sy: ex: ey: pBuf: 返 回 值:无 ***************************************************************/ /*void Set256Blk(int sx,int sy,int ex,int ey,BYTE* pBuf) { WORD tt=0; BYTE* ppBuf=pBuf; long off=(long)sy*(long)MAXX+(long)sx; for(int j=sy;j<=ey;j++) { long offs=off+(long)MAXX; off=offs; for(int i=0;i<ex-sx;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } *(p+offs)=*ppBuf; offs++; ppBuf++; } } } */ /*************************************************************** 函数名称:Save256BlkToXms(int sx,int sy,int ex,int ey,unsigned long pos) 函数功能:把指定矩形区域的屏幕显示信息保存到扩展内存 传入参数:sx: sy: ex: ey: pos: 返 回 值:无 ***************************************************************/ void Save256BlkToXms(int sx,int sy,int ex,int ey,unsigned long pos) { WORD tt; long off=(long)sy*(long)MAXX+(long)sx; long x=0; char buf[640]; for(int j=sy;j<=ey;j++) { long offs=off+(long)MAXX; off=offs; for(int i=0;i<ex-sx;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } buf[i]= *(p+offs); offs++; } x+=(ex-sx); xms_write(x+pos-(ex-sx), buf, ex-sx); } } /*************************************************************** 函数名称:Load256BlkFrXms(int sx,int sy,int ex,int ey,unsigned long pos) 函数功能:从扩展内存恢复指定矩形区域的屏幕显示信息 传入参数:sx: sy: ex: ey: pos: 返 回 值:无 ***************************************************************/ void Load256BlkFrXms(int sx,int sy,int ex,int ey,unsigned long pos) { WORD tt; long off=(long)sy*(long)MAXX+(long)sx; long x=0; for(int j=sy;j<=ey;j++) { char* pch=(char*)xms_read(x+pos, ex-sx); x+=(ex-sx); DWORD offs=off+(long)MAXX; off=offs; for(int i=0;i<ex-sx;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } *(p+offs)=*pch; pch++; offs++; } } } /*************************************************************** 函数名称:Line256(int x1, int y1, int x2, int y2, BYTE c) 函数功能:画线 传入参数:x1: y1: x2: y2: c: 返 回 值:无 ***************************************************************/ void Line256(int x1, int y1, int x2, int y2, BYTE c) { int dx=x2-x1,dy=y2-y1,sx,sy,che; if(dx<0) { dx=-dx; /*从右向左画线*/ sx=-1; } else sx=1; /*从左向右画线*/ if(dy<0) { dy=-dy; /*从下向上画线*/ sy=-1; } else sy=1; /*从上向下画线*/ if(dx>dy) /*x改变得比y快*/ { che=dx>>1; while(x1!=x2) { SetPixel256(x1,y1,c); x1+=sx; che+=dy; if(che>dx) { y1+=sy; che-=dx; } } } else /*y改变得比x快*/ { che=dy>>1; while(y1!=y2) { SetPixel256(x1,y1,c); y1+=sy; che+=dx; if(che>dy) { x1+=sx; che-=dy; } } } SetPixel256(x2,y2,c); } /*************************************************************** 函数名称:ShowBmp256 函数功能:在指定位置显示256色位图文件 传入参数:FileName: x: y: 返 回 值:无 ***************************************************************/ /*void ShowBmp256(char* FileName,int x,int y) { char buffer[640];BYTE page_new=0; register int i,j,k; DWORD position,opos; DWORD width,length; FILE *fp; if((fp=fopen(FileName,"rb"))==NULL) return; fseek(fp,28,SEEK_SET); fread(&i,2,1,fp); if(i!=8) //检查是否为256色位图 { fclose(fp); return; } fseek(fp,18,SEEK_SET);//位图的宽度,以像素为单位 fread(&width,4,1,fp); fread(&length,4,1,fp);//位图的高度,以像素为单位 fseek(fp,1078,SEEK_SET);//显示点所在位置 k=int((width%4)?(4-width%4):0);//宽度修正值 opos=(length+y)*640l+x; for(j=(int)length+y;j>y;j--) { position=opos-640l; opos=position; fread(buffer,(int)width,1,fp); for(i=0;i<width;i++) { position++; //计算要显示点的显存位置 page_new=(BYTE)(position>>16); //计算显示页 if(page_new!=spage) //当显示页不同时更换页面 { SelectPage256(page_new); } *(p+position)=buffer[i]; //写到显存位置 } fseek(fp,k,SEEK_CUR); //每行绘制完后修正宽度 } fclose(fp); }*/ /*************************************************************** 函数名称:Show256BmpFrXms(int x,int y,unsigned long pos) 函数功能:从扩展内存显示位图 传入参数:x: y: pos: 返 回 值:无 ***************************************************************/ void Show256BmpFrXms(int x,int y,unsigned long pos) { WORD tt; long off=(long)y*(long)MAXX+(long)x; DWORD *pDw=(DWORD*)xms_read(pos, 8); DWORD width=*pDw; pDw++; DWORD length=*pDw; DWORD xmsPos=8; long offs=off; for(int j=0;j<length;j++) { char* pch=(char*)xms_read(xmsPos+pos, width); xmsPos+=width; off=offs; for(int i=0;i<width;i++) { tt=(WORD)(offs>>16); if(spage!=tt){ SelectPage256(tt); } *(p+offs)=*pch; pch++; offs++; } offs=off+(long)MAXX; } } /*文件结束**************************************************************/


   此帖被 +12 点积分      点击查看详情   
评分人:【 AlexZhang 分数: +12  时间:2007-12-16 14:34


2007-9-26 12:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
BA_WANG_MAO
初级用户




积分 147
发帖 13
注册 2005-3-25
状态 离线
『第 2 楼』:  

历害


2007-9-27 09:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tangtai
高级用户




积分 640
发帖 314
注册 2006-8-13
状态 离线
『第 3 楼』:  

没有下载链接啊?


2007-9-27 13:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
store88
中级用户




积分 416
发帖 125
注册 2005-6-9
状态 离线
『第 4 楼』:  

这个原理可以实现1024*768吗


2007-9-28 22:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dsysps
初级用户





积分 98
发帖 34
注册 2006-11-3
状态 离线
『第 5 楼』:  

可以,但相应要改动的地方较多


2007-9-29 14:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jxfengzi
新手上路





积分 8
发帖 4
注册 2007-5-11
状态 离线
『第 6 楼』:  up

我写的总有问题, 改天试试你的


2007-10-17 17:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangxy200696
初级用户





积分 52
发帖 22
注册 2007-3-25
状态 离线
『第 7 楼』:  

用的是vbe吧?有没有关于调节点时钟成功的例子,最好是汇编语言的,c的也可以


2007-10-19 13:55
查看资料  发送邮件  发短消息 网志  OICQ (125639626)  编辑帖子  回复  引用回复
liutong2000
新手上路





积分 4
发帖 2
注册 2007-12-15
状态 离线
『第 8 楼』:  

:o厉害


2007-12-15 11:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
AlexZhang
系统支持





积分 972
发帖 417
注册 2007-2-8
状态 离线
『第 9 楼』:  

不错 加分支持 不过...c说实话我看不懂..._-_-P


2007-12-16 14:35
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: