Почему ничего не отображается, когда я использую режим VGA с компилятором Digital Mars?

#c #dos #vga

#c #dos #vga

Вопрос:

Я пытаюсь создать свою собственную игру для DOSBox, и у меня возникают проблемы с записью в память VGA. Я использую компилятор Digital Mars, и я использую флаг компиляции -mmd.

Вот мой код:

 /*headers*/
#define VGA256 0x13
#define TEXT_MODE 0x03
#define SCREEN_RAM_START 0xA0000000L
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
#define SCREEN_SIZE 320 * 200

void set_mode(int mode)
{
    asm mov AH, 0;
    asm mov AL, mode;
    asm int 10h;
}

void set_pixel(int x, int y, char pixel_color)
{
    unsigned char *ptr = (unsigned char *)SCREEN_RAM_START;
    ptr[(y * SCREEN_HEIGHT)   x] = pixel_color;
}

int main()
{
    set_mode(VGA256);
    set_pixel(100, 150, 1);
    while (!kbhit()) {}
    set_mode(TEXT_MODE);
}
 

Комментарии:

1. digitalmars.com/ctg/ctgMemoryModel.html

Ответ №1:

Я задал вопрос тем, кто испытывает трудности с режимом VGA и DMC при создании игр для DOSBOX.

Необходимо изменить функцию set_pixel . Компилятор DM использует дальние и ближние указатели при компиляции для 16-разрядной архитектуры. Кроме того, это должно быть y*SCREEN_WIDTH .

Новая версия:

 void set_pixel(int x, int y, char pixel_color)
{
    unsigned char __far *ptr = (unsigned char __far *)SCREEN_RAM_START;
    ptr[(y * SCREEN_WIDTH)   x] = pixel_color;
}