DOS EGA Graphics Программирование в режиме 0Dh - PullRequest
6 голосов
/ 18 января 2010

Я занимаюсь ретро-программированием для развлечения. Я хочу создать игру для 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

Ответы [ 3 ]

3 голосов
/ 26 января 2010

Хммм .. не знаю, если это достойный ответ, если я помню, вам нужно использовать inport, inportb, outport, outportb для портов для управления регистрами EGA, это было взятопревосходный FAQSYSW (обширная коллекция материалов, начиная от графической демонстрации, математики, фракталов до сжатий), оригинальный архив был найден здесь и здесь .

3 голосов
/ 18 января 2010

Режим 0x0d равен планарный , в то время как 0x13 нет (без специальной конфигурации, как в режиме X) Вы должны проверить больше документов, чтобы увидеть, как работать в плоском режиме.

0 голосов
/ 24 июня 2018

Он одноцветный, потому что записывает все четыре цветовых плоскости одновременно. Режим D является плоским, как указывают другие ответы, и регистр контролирует, какой из них записывается в вашем цикле. По умолчанию он выбирает запись во все плоскости одновременно, следовательно, моно.

Чтобы выбрать «красную» плоскость и «интенсивную», например, вы можете сделать:

mov dx, 3C4h       ; address of sequencer address register
mov al, 2h         ; index of map mask register
out dx, al

mov dx, 3C5h       ; address of sequencer data register
mov al, 00001100b  ; turn on the 'red' and 'intense' planes
out dx, al

Последующие записи в VRAM создадут ярко-красный пиксель для каждого записанного бита (1 бит = 1 пиксель). Цвет предполагает, конечно, что палитра не была изменена по умолчанию, что вы также можете сделать.

...