VirtualBox探究VESA SVGA 2

type.h

typedef unsigned int    uint32;
typedef unsigned short  uint16;
typedef unsigned char   uint8;

打印以下看看和我們預期是否一致!

sprintf(buf, "uint8[%d], uint16[%d], uint32[%d], long[%d], char*[%d]", sizeof(uint8), sizeof(uint16), sizeof(uint32), sizeof(long), sizeof(char *));
print_str_fix_pos((80*(startLine + 3)+0)*2, buf);
驗證大小

參考

VBEInfo:https://www.cnblogs.com/zyl910/archive/2006/11/14/2186633.html
char far:https://zhidao.baidu.com/question/550069401.html

// vbe info:VGA圖形系統(tǒng)相關(guān)參數(shù)
typedef struct vbe_info {       
    char          VBESignature[4];            // 字符串"VESA"          
    uint16        VBEVersion;                 // VBE版本號,BCD碼
    char /*far*/  *OEMStringPtr;              // 指向OEM廠商的標志串的指針        
    uint32        Capabilities;               // 顯示卡特性  
    uint16/*far*/ *VideoModePtr;              // 指向所支持顯示模式列表的指針
    uint16        VRAMMemory;                 // 顯示內(nèi)存大小,單位為64KB      
    // 以下為VESA VBE 2.0版本以上定義
    uint16        OemSoftwareRev;             // VBE軟件的OEM修訂版本號,BCD碼
    char /*far*/  *OemVendorNamePtr;          // 指向顯示卡制造廠商的字符串指針
    char /*far*/  *OemProductNamePtr;         // 指向顯示卡制造商的字符串的指針
    char /*far*/  *OemProductRevPtr;          // 指向顯示卡修訂版本號或唱片等級的字符串的指針
    uint8          reserved[222];             // 保留
    uint8          OEMData[256];              // VESA2.0版以上定義
} __attribute__((packed)) VBEINFO;

打印版本號和內(nèi)存大小

    // 打印VbeVersion
    sprintf(buf, "VbeVersion       : 0x%4.4X", vbeInfo->VBEVersion);
    print_str_fix_pos((80*(startLine++)+0)*2, buf);
    // 打印VRamMemory
    sprintf(buf, "TotalMemory      : 0x%4.4X (%ldKB)", vbeInfo->VRAMMemory, vbeInfo->VRAMMemory * (uint32)64);
    print_str_fix_pos((80*(startLine++)+0)*2, buf);

版本號和顯存大小

VBEVersion:VBE版本號,以BCD碼表示。高字節(jié)為主版本號,低字節(jié)為副版本號。例如:VBE 2.0的VESA VESA Version為0200h,VBE1.2的VESA Version為0102h。注意,0102h表示V1.2版本,而不是V1.02版。
顯存大小:16384/1024 = 16 MB。
虛擬機設(shè)置的顯存大小就是16 MB

char far* 地址轉(zhuǎn)換

物理地址 = 段地址*10H + 偏移地址

uint32 getAddrFromCharfar(uint32 far){
    return (far >> 16)/*高16位*/*0x10 + (far & 0xFFFF)/*低16位*/;
}

打印OEM廠商的標值串的指針

    // 打印OEMStringPtr
    sprintf(buf, "OEMStringPtr     : %s", (char*)getAddrFromCharfar((uint32)(vbeInfo->OEMStringPtr)));
    print_str_fix_pos((80*(startLine++)+0)*2, buf);

注意:不能直接打印far指針,要轉(zhuǎn)換為真實的地址。

打印OEM廠商的標志串

OEMStringPtr:以NULL結(jié)尾的指向OEM廠商的標志串的實模式指針。字符串表明顯示卡上的顯存芯片的制造廠商,沒有固定的格式,可用來標志IEM對特定硬件所支持的特性。該指針可能指向ROM,也可能指向RAM。該指針的長度也沒有限制,但VESA組織推薦在256字節(jié)以內(nèi)。字符串以NULL結(jié)尾。

打印顯示卡特性

    // 打印顯示卡特性
    sprintf(buf, "Capabilities     : 0x%8.8lX", vbeInfo->Capabilities);
    print_str_fix_pos((80*(startLine++)+0)*2, buf);
打印顯示卡特性

Capabilities:顯示卡能力特性。各位定義如下:
D0 = 0:DAC為固定寬度,每種顏色各占6位寬度;
1:DAC寬度可切換到每種顏色各占8位。
注:當DAC寬度可切換時,設(shè)置一個VESA顯示模式后DAC寬度將還原為每種顏色6位。用VBE功能08h的子功能BL=0H可將DAC寬度切換為每種顏色占8位。
D1 = 0:顯示卡兼容VGA;
= 1:顯示卡不兼容VGA。
注:顯示卡是否兼容VGA表明是否支持VGA模式、字體和I/O端口,但不能保證支持所有的VGA兼容模式、不能保證支持8x14點陣的字庫。
D2 = 0:普通的RAMDAC操作
= 1:當對大塊RAMDAC操作時,在VBE功能09h中使用BL=80H位屏蔽,使操作在CRT顯示器垂直回掃期間按進行。
const DETAIL_BIT detailCapabilities[] ={
{0, "DAC is fixed width, with 6 bits per primary color", "DAC width is switchable to 8 bits per primary color"},
{1, "Controller is VGA compatible", "Controller is not VGA compatible"},
{2, "Normal RAMDAC operation", "When programming large blocks of information to the RAMDAC, use the blank bit in Function 09h."},
{3, "No hardware stereoscopic signaling support", "Hardware stereoscopic signaling supported by controller"},
{4, "Stereo signaling supported via external VESA stereo connector", "Stereo signaling supported via VESA EVC connector"}
....
后面使保留位。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容