使用不支持GNU C打包结构的数字火星编译器获取VESA视频信息



我正试图将VESA视频卡检测添加到我的系统信息程序中,似乎甚至无法将有效的代码放在一起。我看过这个线程:如何在OSDev上获得VESA BIOS信息和此页:https://wiki.osdev.org/VESA_Video_Modes,其中使用__attribute__ ((packed))为gcc编译器编写的代码与我的数字火星编译器不兼容。

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

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

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

我能够使用以下代码获得所有相关的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注释。

相关内容

最新更新