问关于 VGA 12h 直接写屏

cnStreamlet 2007-06-06 03:30:39
我在写一个 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;
}

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

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

...全文
144 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
SCUM 2007-06-11
  • 打赏
  • 举报
回复
12h 的直写要用到页切换 只是直接写入显存显示肯定是不正常的
不过 这些东西早就忘了
国外的上有很多老资料
我以前有连接 不过公司电脑上没有
去google搜索下吧 搜vesa vga 12h 之类的
cnStreamlet 2007-06-06
  • 打赏
  • 举报
回复
13h 是简单,可是太小了阿,除了游戏画面,要显示一点点文字都几乎容不下了

是古老了点,可是既然做古老的东西,想趁机了解一下下。。。
subzero 2007-06-06
  • 打赏
  • 举报
回复
12h阿?太古老了!12h是640x480x4bit?写位面是很麻烦,还是13h比较简单。

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧