在有人告诉我 in86 和 VESA 是 dos 的东西之前,它不会在现代系统上工作。我知道,我正在开发一款适用于新旧系统的游戏。我的游戏可以在带有 SDL1 的 Windows 9x 上运行,但速度很慢(166Mhz,640x480@256 色,在简单的平铺绘图“引擎”中只有 25 帧)所以我想直接使用 VESA 模式。我知道如何使用它们,但我的问题是......是否有可能在 mingw 中获得 int86 和 int86x,所以我可以在我的 linux 机器上编译我的游戏并获得一个可以在 windows9x 上运行的 .exe。如果我使用旧的 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
...
*/
}