Я занимаюсь ретро-программированием для развлечения. Я хочу создать игру для DOS, использующую графику EGA, но у меня возникли некоторые проблемы с поиском хорошей ссылки в Интернете. Все, кто говорит о программировании 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