![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 14:55 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » DOS下640*480*256色显示程序 |
| 可打印版本 1,677 / 8 |
| 第1楼 dsysps | 发表于 2007-09-26 12:14 |
| 初级用户 发帖 34 积分 98 | |
|
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; } } /*文件结束**************************************************************/ |
|
| 第2楼 BA_WANG_MAO | 发表于 2007-09-27 09:04 |
| 初级用户 发帖 13 积分 147 | |
|
历害
|
|
| 第3楼 tangtai | 发表于 2007-09-27 13:34 |
| 等待验证用户 发帖 314 积分 640 | |
|
没有下载链接啊?
|
|
| 第4楼 store88 | 发表于 2007-09-28 22:51 |
| 中级用户 发帖 125 积分 416 | |
|
这个原理可以实现1024*768吗
|
|
| 第5楼 dsysps | 发表于 2007-09-29 14:05 |
| 初级用户 发帖 34 积分 98 | |
|
可以,但相应要改动的地方较多
|
|
| 第6楼 jxfengzi | 发表于 2007-10-17 17:24 |
| 新手上路 发帖 4 积分 8 | |
|
up 我写的总有问题,
改天试试你的 |
|
| 第7楼 wangxy200696 | 发表于 2007-10-19 13:55 |
| 初级用户 发帖 22 积分 52 | |
|
用的是vbe吧?有没有关于调节点时钟成功的例子,最好是汇编语言的,c的也可以
|
|
| 第8楼 liutong2000 | 发表于 2007-12-15 11:03 |
| 新手上路 发帖 2 积分 4 | |
|
:o厉害
|
|
| 第9楼 AlexZhang | 发表于 2007-12-16 14:35 |
| 系统支持 发帖 440 积分 1,028 | |
|
不错 加分支持
不过...c说实话我看不懂..._-_-P |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |