VESA編程介紹???? (3):擴展的VGA BIOS
---------------------------------------------------------------------------------
相關章節:
(1): 標準VGA BIOS及超級VGA模式號
(2):CPU顯存控制
(3):擴展的VGA BIOS
(4): 擴展的VGA BIOS(續)及應用舉例
---------------------------------------------------------------------------------
6、擴展的VGA BIOS
一些新的BIOS調用已經支持超級VGA模式。為了最大程度地與標準VGA BIOS兼容,這些BIOS調用同屬于一個函數號。這個數字在AH寄存器中通過10h中斷被傳送。
指定的超級VGA擴展函數號是4Fh。該函數號在如今的VGA BIOS中并未被使用。因而函數調用4Fh時對標準VGA并無影響。超級VGA標準VS900602定義了子函數00h到07h,函數號08h到0FFh保留。
6-1、狀態信息
每一個函數向AX寄存器返回一個狀態信息。狀態字的格式如下:
AL==4Fh 函數被支持
AL!=4Fh 函數不被支持
AH==00h 函數調用成功
AH==01h 函數調用失敗
當AH寄存器的值為非零時,軟件就應該認為是失敗。在今后的VESA BIOS擴展中將會定義新的錯誤號。
6-2、00h-返回超級VGA信息
該函數的目的是向調用程序提供超級VGA環境的情況。該函數填滿一個由調用者所指定地址的信息塊。信息塊的大小有256字節。
輸入:AH = 4Fh 超級VGA支持
AL = 00h 返回超級VGA信息
ES:DI = 緩沖區指針
輸出:AX = 狀態
(其它寄存器保持不變)
信息塊的結構如下:
VgaInfoBlock STRUC
VESASignature db 'VESA' ; 四字節的標志
VESAVersion dw ? ; VESA版本號
OEMStringPtr dd ? ; OEM串的指針
Capabilities db 4 dup(?) ; 視頻環境的情況
VideoModePtr dd ? ; 所支持的超級VGA模式的指針
TotalMemory dw ? ; 板載64K內存塊數
Reserved db 236 dup(?) ; VgaInfoBlock的剩余
VgaInfoBlock ENDS
只有當VESASignature區域為“VESA”時,該信息塊才有效。
VESAVersion域是二進制表示的,指明了超級VGA BIOS所遵從的VESA標準的級別。低字節表明了副版本號。當前的VESA版本號是1.2。使用VESA BIOS擴展的特性的程序在今后的版本中仍將有效。VESA BIOS擴展將是完全向上兼容的。
OEMStringPtr是一個指向以空作為結束的OEM定義串的長指針。該串用來為針對硬件的設備驅動鑒定顯示芯片、顯示板和內存配置等等。
Capabilities區域描述了視頻環境所支持的一般特性。
各位定義如下:
D0 = DAC可變換
0 = DAC為固定寬度,每種主要顏色6位
1 = DAC寬度可變換
D1-31保留
VideoModePtr指向了一個包括了所有所支持的超級VGA(VESA定義的和OEM指定的)顯示模式。每種模式占用一個字(16位)。模式號表由-1(0FFFFh)結束。請回到第二章查閱VESA模式號詳細資料。指針可被指向RAM或ROM,依具體情況而定。可能該表是在ROM中的靜態串,也可能是在運行時生成于RAM中的信息塊。程序負責檢驗由返回模式信息(函數01h)所返回的當前模式是否可用。由于顯存和顯示器的關系,當前的顯示模式可能是不可用的。
TotalMemory指明了板載內存量。其值表示了板上現有的64K內存塊的塊數。
6-3、01h-返回超級VGA模式信息
該函數返回一個指定的超級VGA顯示模式的相關信息。該函數根據調用者給定的地址填充一個模式信息塊。模式信息塊最大為256K。
此函數返回的一些信息是由VESA模式號暗中定義的。但是一些超級VGA可能支持其它的顯示模式而不是由VESA所定義的。為了提供對該模式的訪問,函數也返回一些各種各樣的相關信息。
輸入:AH = 4Fh 超級VGA支持
AL = 01h 返回超級VGA模式信息
CX = 超級VGA模式號(模式號必須為函數00h返回值之一)
ES:DI = 256字節緩沖區指針
輸出:AX = 狀態
(其它寄存器不變)
模式信息塊結構如下:
ModeInfoBlock STRUC
; 強制信息
ModeAttributes dw ? ; 模式屬性
WinAAttributes db ? ; 窗口A屬性
WinBAttributes db ? ; 窗口B屬性
WinGranularity dw ? ; 窗口間隔尺寸
WinSize dw ? ; 窗口大小
WinASegment dw ? ; 窗口A開始段地址
WinBSegment dw ? ; 窗口B開始段地址
WinFuncPtr dd ? ; 窗口函數指針
BytesPerScanLine dw ? ; 每行字節數
; 過去的可選信息(現在是強制信息)
XResolution dw ? ; 水平分辨率
YResolution dw ? ; 垂直分辨率
XCharSize db ? ; 字符單元寬度
YCharSize db ? ; 字符單元高度
NumberOfPlanes db ? ; 內存平面數
BitsPerPixel db ? ; 每點的位數
NumberOfBanks db ? ; 存儲區數
MemoryModel db ? ; 內存模式類型
BankSize db ? ; 存儲區K字節數
NumberOfImagePages db ?; 圖象數
Reserved db 1 ; 保留給頁函數
; 新的直接色彩區域
RedMaskSize db ? ; 紅色遮蓋位數
RedFieldPosition db ? ; 紅色遮蓋位址
GreenMaskSize db ? ; 綠色遮蓋位數
GreenFieldPosition db ? ; 綠色遮蓋位址
BlueMaskSize db ? ; 蘭色遮蓋位數
BlueFieldPosition db ? ; 蘭色遮蓋位址
RsvdMaskSize db ? ; 直接色彩保留遮蓋位數
RsvdFieldPosition db ? ; 直接色彩保留遮蓋位址
DirectColorModeInfo db ? ; 直接色彩模式屬性
Reserved db 216 dup(?) ; 模式信息塊剩余
ModeInfoBlock ENDS
ModeAttributes區域描述了顯示模式的幾個重要特性。D0位指明了該模式能否在當前配置下被初始化。如果該顯示模式需要特殊的顯示器類型,而這種顯示器現在并沒有連接,則該位可用來阻止訪問。在VESA
BIOS擴展1.2版本之前,并不需要該位也能返回BytesPerScanLine之后正確的值。D1位指出當前是否有選擇信息。VBE1.2版要求除了直接色彩區域(僅當Memory-Model區域設為6(直接色彩)或7(YUV)時有效)外的ModeInfoBlock所有部分都有效。D1位現在保留,但必須設為1。D2位指出在該模式下BIOS是否支持類似TTY輸出、卷屏和像素點輸出等函數(推薦,并不強制,BIOS支持所有的輸出函數)。如果D2位為1,那么BIOS必須支持所有的標準輸出函數。
該區域定義如下:
D0 = 模式被硬件支持
0 = 模式不被硬件支持
1 = 模式被硬件支持
D1 = 1(保留)
D2 = BIOS支持輸出函數
0 = BIOS不支持輸出函數
1 = BIOS支持輸出函數
D3 = 單色/彩色模式(請看下面注釋)
0 = 單色模式
1 = 彩色模式
D4 = 模式類型
0 = 文本方式
1 = 圖形方式
D5-D15 = 保留
注釋:單色模式的CRTC地址位于3B4h。彩色模式的CRTC地址位于3D4h。單色模式屬性控制輸出中只有第三位(視頻)和第四位(亮度)是重要的。所以,單色文本模式的屬性有關閉、視頻、高亮度和閃爍等。單色圖形模式為兩平面的模式且有關閉、視頻、高亮度和閃爍的屬性擴展的二色模式的CRTC地址位于3D4h。它有一個平面且每像素有一位。標準VGA模式的06h和11h被分類為彩色模式,而模式07h和0Fh被分為單色模式。
BytesPerScanLine指出每條合理的掃描線由多少字節組成。合理的掃描線可以等于或大于實際顯示的掃描線。
WinAAttributes和WinBAttributes描述了CPU窗口配置的屬性,如窗口是否存在和窗口是否可讀可寫,如下所示:
D0 = 窗口支持
0 = 窗口不被支持
1 = 窗口被支持
D1 = 窗口可讀
0 = 窗口不可讀
1 = 窗口可讀
D2 = 窗口可寫
0 = 窗口不可寫
1 = 窗口可寫
D3-D7 = 保留
如果窗口不被支持(窗口A和窗口B的D0位都為0),那么應用程序可以假設顯存緩沖位于與該模式MemoryModel相應的標準CPU地址中。
WinGranularity指出了窗口在顯存上的最小字節大小。若相應的WinAttributes的D0位未設置,則該值不確定。
WinSize指明了窗口的字節大小。
WinASegment和WinBSegment給出了窗口在CPU地址空間中的段地址。
WinFuncPtr指出了CPU顯存窗口函數的地址。窗口函數能通過VESA BIOS函數05h調用,也能直接調用該函數。直接調用比使用10h中斷對硬件頁寄存器的訪問更快,可用于高效程序。若其值為空,應通過函數05h設置內存窗口,如果內存分頁被支持。
XResolution和YResolution指明了顯示模式的寬度和高度。在圖形方式下該值以像素為單位。在文本方式下,該值以字符為單位。注意,在字符模式下以像素為單位的分辨率可以通過將X和Y分辨率分別乘以字符的寬度和高度來獲得,如果有這樣的擴展信息的話。
XCharSize和YCharSize指出了字符單元的大小。
NumberOfPlanes指出了在該模式下軟件可用的內存平面數。對于標準VGA16色圖形模式而言,其值為4。對標準壓縮像素模式而言,其值為1。BitsPerPixel指出了定義一個像素點的顏色所需位數。比如說,標準VGA4平面16色圖形模式的值為4而256色壓縮像素圖形模式為8。每平面每像素位數可以通過將每像素位數除以平面數得到。
MemoryModel指出了內存的通用組織方式。方式定義如下:
00h = 文本方式
01h = CGA圖形
02h = HERCULES圖形
03h = 4平面
04h = 壓縮像素
05h = 非鏈 4、256色
06h = 直接色彩
07h = YUV
08h-0Fh = 保留,有VESA定義
10h-FFh = 由OEM定義
在1.1版和更早的VESA超級VGA
BIOS擴展中,OEM以1:5:5:5和8:8:8以及8:8:8:8(相應壓縮像素的每像素位數為16位、24位和32位)來定義直接色彩模式。在1.1版和今后的VESA超級VGA
BIOS擴展中,推薦直接色彩模式使用直接色彩內存模式和模式信息塊中的遮蓋大小和位址來描述像素格式。BitsPerPixel總是代表了每個像素點所占的總的內存位數。
NumberOfBanks指出了成組掃描線的存儲區的個數。將掃描線數除以存儲區數,所得的余數為含有掃描線的存儲區,而其商為每存儲區內的掃描線數。比如,CGA圖形模式有兩個存儲區,而HERCULES圖形模式有四個存儲區。對于沒有掃描線存儲區的模式(如VGA模式0Dh-13H),其值為1。
BankSize指明了存儲區的大小(以KB為單位)。對于CGA和HERCULES圖形模式,其值為8,即每存儲區長度為8192字節。對于沒有掃描線存儲區的模式(如VGA模式0Dh-13H),其值為0。
NumberOfImagePages指出了能一次填充VGA內存的附加完整的顯示圖象數。若該值非空,則程序將裝載大于一張圖象進VGA內存,并在它們之間交替顯示。
Reserved保留給今后的VESA BIOS擴展,而今其值必須為一。
RedMaskSize、GreenMaskSize、BlueMaskSize和RsvdMaskSize定義了直接色彩像素點中紅、綠、藍成分的位數。其值通過簡單的移位算法就能產生位遮蓋。如:直接色彩5:6:5模式的遮蓋大小為5、6、5和0,分別對應紅、綠、藍、和保留值。注意對于YUV內存模式,紅色用于V,綠色用于Y而蘭色用于U。若其模式的像素沒有原色成分,其值應置為0。
RedFieldPosition、GreenFieldPosition、BlueFieldPosition和RsvdFieldPosition定義了在直接色彩模式和YUV模式中各自色彩成分中最重要位的位址。色彩值能通過根據位址左移其值而與像素相連。比如:直接色彩5:6:5模式中,紅、綠、藍和保留的位置分別為11、5、0和0。注意對于YUV內存模式,紅色用于V,綠色用于Y而蘭色用于U。若其模式的像素沒有原色成分,其值應置為0。
DirectColorModeInfo描述了直接色彩模式的重要特性。D0位表明DAC色彩梯度是固定的或是可編程的。如果色彩梯度是固定的,則其不能被改變。如果是可編程的,則意味著能通過標準VGA
DAC色彩寄存器BIOS調用(AX=1012h)來裝載紅、綠、藍查找表。D1位指出直接色彩像素保留區能被程序使用,還是保留,即不能使用。
D0 = 色彩梯度為固定/可編程
0 = 色彩梯度固定
1 = 色彩梯度可編程
D1 = 保留位可用/保留
0 = 保留位保留
1 = 保留位能被程序使用
注意:
版本1.1及其以后的VESA
BIOS擴展將信息塊中不用的地方清零,但仍保持256字節大小。這使其對于未來的標準具有向上兼容性,因為新增加的區域將零作為默認值或是不可實現的附加選項。打算向后兼容VESA
BIOS擴展1.0版的程序應該在調用返回超級VGA模式信息之前先預初始化一個256字節的緩沖區。
6-4、02h-設置超級VGA模式
該函數初始化一種顯示模式。BX寄存器包含了要存放的模式。VESA模式號的格式已在第二章作了描述。如果模式無法設置,BIOS應該保持視頻環境不變并返回錯誤號。
輸入:AH = 4Fh 超級VGA支持
AL = 02h 設置超級VGA顯示模式
BX = 顯示模式
D0-D14 = 顯示模式
D15 = 清除內存標志
0 清除顯存
1 不清除顯存
輸出:AX = 狀態
(其它寄存器保持不變)
6-5、03h-返回當前顯示模式
此函數將當前顯示模式返回到BX寄存器。VESA顯示模式號在第二章有詳細描述。
輸入:AH = 4Fh 超級VGA支持
AL = 03h 返回當前顯示模式
輸出:AX = 狀態
BX = 當前顯示模式
(其它寄存器保持不變)
注意:
在標準VGA
BIOS中,函數0Fh(讀當前顯示狀態)返回當前顯示模式到AL寄存器。在AL的D7位,也返回內存清除位狀態。如果內存未被清除,則該位被設置。在超級VGA函數中,因為函數的目的只是返回顯示方式,內存清除位不會被返回到BX寄存器。如果程序要獲得內存清除位,就應該調用VGA
BIOS函數0Fh。
<End>