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。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)換為真實的地址。
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"}
....
后面使保留位。