[英]Getting VESA video information with Digital Mars compiler, which doesn't support GNU C packed structs
我正在嘗試將 VESA 視頻卡檢測添加到我的系統信息程序中,但似乎甚至無法將有效的代碼組合在一起。 我看過這個線程: 如何獲取 VESA BIOS 信息和 OSDev 上的這個頁面: 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 注釋下方的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.