中国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
系统支持





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

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

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

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


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



论坛跳转: