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

问关于 VGA 12h 直接写屏解决方法

2012-03-13 
问关于 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;
}

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

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


[解决办法]
路过。

现在这样编写应该非常少了,连各种嵌入的设备,都有彩色屏幕了。不过,方法值得学习。
[解决办法]
http://www.netyi.net/resource/938a1e08-65a3-4777-b74f-a62b4358b74e
EGA/VGA程序员手册
[解决办法]
参看:http://www.implight.net/node/2623

热点排行