私は楽しみのために少しレトロなプログラミングをしています。私が作成したいのは、EGA グラフィックスを使用した DOS ゲームですが、Web 上で適切なリファレンスを見つけるのに少し苦労しています。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() を 0x0d の代わりに 0x13 を取るように変更するとうまく機能しますが、前述したように、ここでは VGA ではなく EGA グラフィックを取得しようとしています。:) ピクセルあたり 4 ビットを実行するには、plot_pixel が同時に 2 つのピクセルを書き込むと仮定するか、少しいじって、4 ビットのみを書き込むようにする必要があることを認識しています。実際に欲しい。
私の問題は、期待どおりの出力が表示されないことです。特に、色がありません。すべてが単色に見えますが、これは私が望んでいるものではありません。このグラフィック モードでカラー パレットを使用するには、13h とは異なる手順がありますか? それとも、意図したものとはまったく異なるグラフィック モードを何らかの方法で呼び出したのでしょうか? ガイダンスをいただければ幸いです。
コンパイラの引数は関係ないと思いますが、念のため:
..\dm\bin\dmc test.c -o test -mm