c++ - 使用不支持 GNU C 打包结构的 Digital Mars 编译器获取 VESA 视频信息

我正在尝试将 VESA 视频卡检测添加到我的系统信息程序中,但似乎甚至无法将有效的代码组合在一起。我看过这个帖子:https://stackoverflow.com/questions/50822889/how-to-get-vesa-bios-information 和 OSDev 上的这个页面:https://wiki.osdev.org/VESA_Video_Modes 其中使用 __attribute__ ((packed)) 为 gcc 编译器编写的代码与我的 Digital Mars 编译器不兼容。

我真正想要的是 VESA 版本、OEMString、总内存,如果支持 VESA 2.0,OEMModel 字符串,但如果我必须处理整个 ES:DI 堆栈以获取该信息,那就这样吧。但是,这就是我卡住的地方。尽管给出了示例代码,但我根本不知道如何获取该信息并将其放入结构中。

我知道这个网站不是为提问者编写代码的,但我希望有人可以帮助我开始,这样我就可以研究工作代码并学习如何完成这个。我不在乎它是在 assembly 还是 C++ 中,尽管我对 C++ 有更多的经验。

我正在使用 MARS C/C++ 编译器。生成的程序将是 16 位 DOS 程序。

回答1

我能够使用以下代码获取所有相关的 VESA 信息,而无需 PACK

typedef struct _VBE_INFO
{
    char VbeSignature[4];
    uint16 VbeVersion;
    char FAR *fpOemString;
    uint32 Capabilities;
    uint16 FAR *fVideoMode;
    uint16 TotalMemory;
    /* VESA 2.x */
    uint16 OemSoftwareRev
    char FAR *fpOemVendorName;
    char FAR *fpOemProductName;
    char FAR *fpOemProductRev;
    char Reserved[222];
    char OemData[256];
} VBE_INFO;

VBE_INFO FAR *VbeInfo;
inregs.x.ax = 0x4F00;
sregs.es    = FP_SEG( VbeInfo );
inregs.x.di = FP_OFF( VbeInfo ):
int86x( 0x10, &inregs, &outregs, &sregs );

那么你所有的数据都放在 VbeInfo->? 哪里?在结构中定义。例如。 VbeInfo->fpOemString 包含卡的 VESA v1.x Oem 字符串数据。对于 VESA 2.x 信息,请使用以下代码:

VBE_INFO FAR *VbeInfo;
_fstrncpy( VbeInfo->VbeSignature, "VBE2", 4 );
inregs.x.ax = 0x4F00;
sregs.es    = FP_SEG( VbeInfo );
inregs.x.di = FP_OFF( VbeInfo );
int86x( 0x10, &inregs, &outregs, &sregs );

然后将填充结构中 VESA 2.x 注释下方的信息。