首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

问关于 VGA 12h 直接写屏,该怎么解决

2012-02-09 
问关于 VGA 12h 直接写屏我在写一个DOS小游戏,要用TC2.0编译。目前我用的是VESA101h图形模式,但好像兼容性

问关于 VGA 12h 直接写屏
我在写一个   DOS   小游戏,要用   TC   2.0   编译。目前我用的是   VESA   101h   图形模式,但好像兼容性不是很好,我考虑换成标准   VGA   模式。VGA   13h   虽然操作上比较理想,但是分辨率太小,何况我现在已经采用了   640*480   的分辨率,改成   320*200   的话,要修改太多东西。剩下的只有   VGA   12h   模式了,但是这个直接写屏好像很麻烦的样子,网上找到的资料说得不清楚,例子都不是很典型,我摸索了一上午,还是搞不清楚:

void   InitGraph()
{
        union   REGS   r;
        r.x.ax=0x0012;
        int86(0x10,   &r,   &r);       //   进入   VGA   12h   模式
        outportb(0x03ce,   5);     //   选择   5   号图形寄存器
        outportb(0x03cf,   0);     //   选择写模式   0
}

void   PutPix(unsigned   int   nX,   unsigned   int   nY,   unsigned   char   byColor)
{
                outportb(0x03c4,   2);     //   选择2号时序寄存器
/*
                outportb(0x03c5,   0x0f);     //开放所有位平面
                g_pbyVideoBuffer[(nY < <6)+(nY < <4)+(nX> > 3)]&=~(0x80> > (nX&0x07));   //清除目标点的位(四个位平面都清除掉)
*/
                outportb(0x03c5,   byColor&0x0f);     //   根据颜色开放某些位平面
                g_pbyVideoBuffer[(nY < <6)+(nY < <4)+(nX> > 3)]|=(0x80> > (nX&0x07));     //向目标点的位写入   1   (根据上一行的设定,不需要的位平面会被屏蔽)
}

int   main()
{
        int   i,   j;

        InitGraph();
       
        for(i=10;i <14;i++)
                for(j=10;j <40;j++)
                        PutPix(i,   j,   10);

        for(i=10;i <18;i++)
                for(j=40;j <80;j++)
                        PutPix(i,   j,   14);

        bioskey(0);
        return   0;
}

可是跟我预期的不一样啊,只出现了一条竖线和两条竖线,而不是两个区域

我上面写点函数哪里不对?



[解决办法]
12h阿?太古老了!12h是640x480x4bit?写位面是很麻烦,还是13h比较简单。
[解决办法]
12h 的直写要用到页切换 只是直接写入显存显示肯定是不正常的
不过 这些东西早就忘了
国外的上有很多老资料
我以前有连接 不过公司电脑上没有
去google搜索下吧 搜vesa vga 12h 之类的

热点排行