我正在做一些有趣的复古编程。我想要创建的是一个使用 EGA 图形的 DOS 游戏,但我在网上找到一个好的参考资料时遇到了一些麻烦。每个谈论做 DOS 编程的人都假设程序员将使用模式 13h,虽然有些页面提到了其他图形模式,但我还没有找到讨论它们正确使用的一个。
这是我现在正在尝试的工作:
//------------------------------------------------------------------------------
// DOS graphics test
//
// Thanks to the following links:
// http://gamebub.com/cpp_graphics.php
//
// Written for Digital Mars C compiler to be compiled as a DOS 16 bit binary.
//------------------------------------------------------------------------------
#include <dos.h>
#include <stdio.h>
#define SCREEN_WIDTH 320;
#define SCREEN_HEIGHT 200;
unsigned char far *vram = (unsigned char far *)0xA0000000L;
//------------------------------------------------------------------------------
void set_video_mode(unsigned char mode)
{
union REGS in, out;
in.h.ah = 0;
in.h.al = mode;
int86(0x10, &in, &out);
}
//------------------------------------------------------------------------------
void plot_pixel(unsigned int x, unsigned int y, unsigned char color)
{
// this is wrong because it's only 4 bpp not 8
vram[y * 320 + x] = color;
//vram[((y<<8)+(y<<6))+x] = color;
}
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
// EGA 320 x 200 x 16
set_video_mode(0x0d);
for (unsigned char i = 0; i < 255; i++)
{
vram[i] = i;
}
//plot_pixel(10, 10, 1);
getc(stdin);
return 0;
}
如果您将 set_video_mode() 更改为 0x13 而不是 0x0d,则此示例代码效果很好,但就像我说的那样,我试图在这里获取 EGA 图形,而不是 VGA。:) 我意识到,为了做到每像素四位,我要么需要假设 plot_pixel 同时写入两个像素,要么进行一些操作以确保我只写入我自己写的四个位其实想要。
我的问题是我没有看到我期望的输出——特别是没有颜色!一切似乎都是单色的,这根本不是我想要的。在这种图形模式中使用调色板与在 13h 中使用调色板有什么不同的过程吗?还是我以某种方式调用了与我想要的完全不同的图形模式?指导将不胜感激。
我不认为我的编译器参数是相关的,但以防万一:
..\dm\bin\dmc test.c -o test -mm