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;
}
}
/*文件结束**************************************************************/
|
|