VirtualBox探究VESA SVGA

先展示结果

VESA SVGA

VBE功能调用和返回值

VBE功能调用的共同点有5个:
1.AH必须等于4FH,表明是VBE标准;
2.AL等于VBE功能号,其中,0<=AL<=0Bh;
3.BL等于子功能号,也可以没有子功能;
4.调用int 10h;
5.返回值。
VBE功能调用的返回值一般均在AX中,其含义如下:
1.AL=4FH:支持该功能;
2.AL!=4FH:不支持该功能;
3.AH=00H:功能调用成功;
4.AH=01H:功能调用失败;
5.AH=02H:当前的硬件配置不支持该功能;
6.AH=03H:当前的显示模式不支持该功能。
它适用于所有VBE功能调用和VBE扩展功能调用,对VBE功能调用一般需检查AX中返回值,常见的返回值如下:
1.功能调用成功,返回AX=004FH;
2.不支持该功能,一般返回AX=4F00H;
3.支持该功能但该功能调用失败,返回AX=014FH。

VBE功能00h:返回VBE信息

入口:
AX=4F00H
ES:DI=指向VBE信息块的指针
出口:
AX=VBE返回值
其中,VBE信息块数据结构如下:

// vbe info:VGA图形系统相关参数
typedef struct vbe_info {       
    char          VBESignature[4];            // 字符串"VESA"          
    unsigned      VBEVersion;                 // VBE版本号,BCD码
    char /*far*/  *OEMStringPtr;              // 指向OEM厂商的标志串的指针        
    long          Capabilities;               // 显示卡特性  
    char /*far*/  *VideoModePtr;              // 指向所支持显示模式列表的指针
    unsigned      VRAMMemory;                 // 显示内存大小,单位为64KB      
    // 以下为VESA VBE 2.0版本以上定义
    unsigned      OemSoftwareRev;             // VBE软件的OEM修订版本号,BCD码
    char /*far*/ *OemVendorNamePtr;           // 指向显示卡制造厂商的字符串指针
    char /*far*/ *OemProductNamePtr;          // 指向显示卡制造商的字符串的指针
    char /*far*/ *OemProductRevPtr;           // 指向显示卡修订版本号或唱片等级的字符串的指针
    char         reserved[222];               // 保留
    char         OEMData[256];                // VESA2.0版以上定义
} __attribute__((packed)) VBEINFO;

BOOTINFO,传递一些参数

// boot info:VGA图形系统相关参数
typedef struct boot_info    {       /* 共 12 个字节 */
    char    cyls;               
    char    leds;               
    char    vmode;              
    char    reserve;                    
    short   scrnx;
    short   scrny;
    short   di; 
    char    *vram;              
} __attribute__((packed)) BOOTINFO;

BOOT中进行的操作

; 在boot中给c传递BOOTINFO参数
; // boot info:VGA图形系统相关参数
; typedef struct boot_info  {       /* 共 12 个字节 */
;   char    cyls;               
;   char    leds;               
;   char    vmode;              
;   char    reserve;                    
;   short   scrnx;
;   short   scrny;  
;   char    *vram;              
; } __attribute__((packed)) BOOTINFO;

; 结构体的起始位置是0x0ff0
CYLS   equ  0x0ff0
LEDS   equ  0x0ff1
VMODE  equ  0x0ff2
SCRNX  equ  0x0ff4
SCRNY  equ  0x0ff6
DI_V   equ  0x0ff8
RET_V  equ  0x0ffe
;VRAM   equ  0x0ff8
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
; 符号定义结束

  org 7c00h
  mov ax, cs
  mov ds, ax
  mov es, ax
  
  ......
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;设置VGA图形格式
  ;mov al, 0x13
  ;mov ah, 0x00
  ;int 0x10
  mov ax, 4f00h
  
  ; 记录画面模式
  ;mov  BYTE[VMODE], 8
  ;mov  WORD[SCRNX], 320
  ;mov  WORD[SCRNY], 200
  mov  WORD[SCRNX], ax
  mov  WORD[SCRNY], es
  mov  di, RET_V
  mov  WORD[DI_V], di
  mov  ax, 4F00H
  int 10h
  mov BYTE[VMODE], al
  mov BYTE[LEDS], ah
  ;mov  DWORD[VRAM], 0x000a0000

mov BYTE[VMODE], al
mov BYTE[LEDS], ah
在BOOT中,将BOOTINFO写在0x0ff0位置处。
ES的值是0,
mov di, RET_V
将返回的VBE信息块的指针写在0x0ffe

C中进行打印操作

    BOOTINFO *binfo = (BOOTINFO *) 0x0ff0;                          // 在boot中写入
    // 打印寄存器的值
    sprintf(buf, "[ax: %x], [es: %x], [di: %x]", binfo->scrnx, binfo->scrny, binfo->di);
    print_str_fix_pos((80*21+0)*2, buf);    
    sprintf(buf, "return [al: %x], [ah: %x]", binfo->vmode, binfo->leds);
    print_str_fix_pos((80*22+0)*2, buf);    
    
    VBEINFO *vbeInfo = (VBEINFO *) 0x0ffe;                          // 在boot中写入
    buf[0] = vbeInfo->VBESignature[0];  
    buf[1] = vbeInfo->VBESignature[1]; 
    buf[2] = vbeInfo->VBESignature[2]; 
    buf[3] = vbeInfo->VBESignature[3];
    buf[4] = '\0';  
    print_str_fix_pos((80*23+0)*2, buf);

BOOTINFO *binfo = (BOOTINFO *) 0x0ff0; // 在boot中写入
VBEINFO *vbeInfo = (VBEINFO *) 0x0ffe; // 在boot中写入
在C中获得结构体指针。
结论:VirtualBox是支持VESA和SVGA的。

你可能感兴趣的:(VirtualBox探究VESA SVGA)