1

在有人告诉我 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
    ...
    */
}
4

0 回答 0