Прежде, чем кто-либо скажет мне, что in86 и VESA — это то, что нужно, и оно не будет работать на современной системе. Я знаю, я работаю над игрой, которая работает как на старых, так и на новых системах. Моя игра работает на Windows 9x с SDL1, но она очень медленная (166 МГц, 640×480 при 256 цветах и всего 25 кадров в простом «движке» рисования тайлов), поэтому я подумал об использовании режимов VESA напрямую. Я знаю, как их использовать, но мой вопрос … Возможно ли получить int86 и int86x в mingw, чтобы я мог скомпилировать свою игру на моем компьютере с Linux и получить .exe, который будет работать на windows9x. Мой код работает, если я использую старый компилятор MS, но я должен использовать Windows на виртуальной машине, чтобы сделать это. Я хотел бы получить это в Mingw.
Вот пример. Я как-то обрезал, но вы должны понять.
union REGS r;
struct SREGS s;
char* VbeInfo = malloc(512);
VbeInfo[0] = 'V';
VbeInfo[1] = 'B';
VbeInfo[2] = 'E';
VbeInfo[3] = '2';
r.x.ax = 0x4F00;
r.x.di = FP_OFF(VbeInfo);
s.es = FP_SEG(VbeInfo);
int86x(0x10,&r,&r,&s);
if (r.x.ax != 0x004F)
{
// vbe_get_info_error
}
if (*(u16*)(VbeInfo+4) < 0x200)
{
// vbe version too low, has to be 2.0+
}
u32 video_mode_table = *(u32*)(VbeInfo+14);
char* videoInfo = malloc(256);
while (1)
{
u16 video_mode_number = *(u16*)(video_mode_table);
if (video_mode_number == 0xFFFF)
{
break;
}
video_mode_table +=2;
r.x.ax = 0x4F01;
r.x.cx = video_mode_number;
r.x.di = FP_OFF(videoInfo);
s.es = FP_SEG(videoInfo);
int86x(0x10, &r, &r, &s);
/*
..
check for resolution, bit depth and
if this mode can do linear frame buffer
if yes, get a pointer to the framebuffer and quit
...
*/
}
Задача ещё не решена.
Других решений пока нет …