簡體   English   中英

使用不支持 GNU C 打包結構的 Digital Mars 編譯器獲取 VESA 視頻信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM