问关于 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 之类的