gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:24:28 25 4
gpt4 key购买 nike

我正在尝试将 VESA 视频卡检测添加到我的系统信息程序中,但似乎无法将有效的代码放在一起。我看过这个线程:How to get VESA BIOS Information OSDev 上的这个页面:https://wiki.osdev.org/VESA_Video_Modes其中包含使用 __attribute__ ((packed)) 为与我的 Digital Mars 编译器不兼容的 gcc 编译器编写的代码。

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

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

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

最佳答案

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

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 注释下方的信息。

关于c++ - 使用不支持 GNU C 打包结构的 Digital Mars 编译器获取 VESA 视频信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72297024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com