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图形系统相关参数
typedef struct vbe_info {
char VBESignature[4]; // 字符串"VESA"
uint16 VBEVersion; // VBE版本号,BCD码
char /*far*/ *OEMStringPtr; // 指向OEM厂商的标志串的指针
uint32 Capabilities; // 显示卡特性
uint16/*far*/ *VideoModePtr; // 指向所支持显示模式列表的指针
uint16 VRAMMemory; // 显示内存大小,单位为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;
打印版本号和内存大小
// 打印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码表示。高字节为主版本号,低字节为副版本号。例如:VBE 2.0的VESA VESA Version为0200h,VBE1.2的VESA Version为0102h。注意,0102h表示V1.2版本,而不是V1.02版。显存大小
:16384/1024 = 16 MB。虚拟机设置的显存大小就是16 MB
char far* 地址转换
物理地址 = 段地址*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指针,要转换为真实的地址。
OEMStringPtr:以NULL结尾的指向OEM厂商的标志串的
实模式指针
。字符串表明显示卡上的显存芯片的制造厂商,没有固定的格式,可用来标志IEM对特定硬件所支持的特性。该指针可能指向ROM,也可能指向RAM。该指针的长度也没有限制,但VESA组织推荐在256字节以内。字符串以NULL结尾。
打印显示卡特性
// 打印显示卡特性
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宽度可切换时,设置一个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"}
....
后面使保留位。
网友评论