读书人

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

发布时间: 2012-03-13 11:21:11 作者: rapoo

问关于 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

读书人网 >C语言

热点推荐