#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:
Я задал вопрос тем, кто испытывает трудности с режимом 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;
}