source:需要翻牆)
時至今日,或許有些顯示卡已不相容vga標準,但是所有的顯示卡廠商都無一例外地支援vbe標準。幾乎所有的super vga卡都提供了符合vesa svga標準的擴充套件bios。通過一組int 10h, ah="4fh中斷呼叫",使用vesa svga的擴充套件功能而不必了解各種顯示卡的硬體細節,基於該標準編寫的程式就具有非常廣泛的硬體相容性。
vbe標準到已經發布過3個版本。2023年10月vesa發布了vbe1.2,這個標準規定了應用程式訪問高效能顯示卡的簡易性介面,允許應用程式查詢顯示卡的特性並設定成合適的模式,包括解析度,色彩豐富的模式。vbe1.2是現代顯示卡廣泛採用的標準。
。下面章節我們就開始講svga 640*480*256色解析度怎樣呼叫vbe1.2 bios功能程式設計。
第二章 dos記憶體和svga的位面結構
雖然不同的svga顯示卡的體系結構不同,但它們最初都是從標準vga的結構上擴充而來的,包括五大功能模組,即顯示控制器、定序器,屬性控制器、圖形控制器和顯示儲存器(vram)。svga卡640*480*256色的顯示模式也和vga卡的256色模式類似,每個畫素點8位,整個vram位址空間按掃瞄行連續存放,超過 64k的位址空間採用位面對映機制分塊影射到主機提供的位址上。主機提供的位址空間叫做視窗,svga把vram分成小塊(稱為位面),每塊64k,分別對映到視窗上。
有的顯示模式視窗大小和位面大小不一定是64kb,有可能記憶體視窗小,顯示儲存器(vram)中的每乙個64k位面沒有放滿,也就是說vram中有效的顯示資訊不是連續的。如果要確定某個顯示模式具體的視窗大小、位面尺寸和個數,顏色資訊等等,就要呼叫vbe bios功能4f01h。
第三章 調色盤
在svga 640*480*256顯示模式下,乙個畫素對應顯示儲存器(vram)中用乙個位元組,每個位元組表示一種顏色。但它不是乙個真正的顏色,而是顏色的索引號,對應於svga調色盤上的256個顏色暫存器。實際的顏色碼來自於顏色暫存器中,每種顏色18位,紅綠藍各6位,共可以表示256k種不同的顏色,不過同時在顯示器上顯示的只有256種。
通過i/o埠位址3c8h和3c9h設定調色盤,這樣寫**:
struct color
;struct color colors[256];
//假設顏色變數已經儲存在上面的陣列中
for(int i="0"; i < 256; i++)
顏色從**來,在本目錄中有個顏色表檔案colpal.col,每個顏色4個位元組,依次是藍、綠、紅、空,把它讀出來放到顏色陣列中。它的顏色表就是下面的樣子:
第三章 vbe bios功能呼叫
這一章寫怎樣使用vbe bios功能編寫dos下的圖形介面程式,更詳細的程式設計參考資料也放在了本目錄中,乙個是vbe3.0標準,還有乙個詳細說明bios int 10h功能呼叫的檔案。vbe功能呼叫有乙個約定,或者說是規定:
1. ah必須等於4fh,說明示呼叫vbe功能。
2. al等於vbe的功能號,其中0≤al≤0bh;
3. bl等於子功能號,也可以沒有子功能;
4. 呼叫int 10h;
5. 返回值均在ax中,回想起呼叫windows api也是把返回值放到ax中。對vbe功能的呼叫一般需檢查ax中的返回值,常見的返回值有:(1)功能呼叫成功,返回ax = 004fh;(2)不支援該功能,一般返回ax = 4f00h;(3)支援該功能但該功能呼叫失敗,返回ax = 014fh。
6. 返回值的含義如下:
(1) al = 4fh:支援該功能;
(2) al != 4fh:不支援該功能;
(3) ah = 00h:功能呼叫成功;
(4) ah = 01h:功能呼叫失敗;
(5) ah = 02h:當前的硬體配置不支援該功能;
(6) ah = 03h:當前的顯示模式不支援該功能。
1 進入svga彩色模式
__asm
常用的顯示模式如下表所示,vbe標準涉及到的最大解析度就是1280*1024,更高階的顯示模式可以由廠家自己定義。
bx畫素解析度 * 顏色數
101h
640 * 480 * 256
103h
800 * 600 * 256
105h
1024 * 768 * 256
111h
640 * 480 * 64k
112h
640 * 480 * 16m
114h
800 * 600 * 64k
115h
800 * 600 * 16m
118h
1024 * 768 * 16m
2 返回某個顯示模式的資訊
有時候不能確定顯示模式的視窗和位面大小是不是64kb,就用這個函式確定一下。
int numberofplanes; //這三個變數儲存模式的引數
int wingran;
int winsize;
struct modeinfo mode_info; //模式資訊塊
word segx = fp_seg(mode_info);
word offx = fp_off(mode_info);
byte result;
__asm
if(result == 0x4f) //呼叫成功,顯示卡支援該功能
vbe把特定模式的資訊儲存在struct modeinfo結構中,我們有時間可以了解一下,反正沒有壞處。
struct modeinfo //共256位元組
for(x = x1; x <= x2; x++)
}不管任何作圖函式,都要寫畫素,所以要把寫畫素的函式優化。比如,把setpixel()做成內聯函式,在選擇位面之前先判斷一下是否有必要,如果位面沒有改變就不用去選擇了。其它的作圖函式也是要用寫畫素的方法實現,不過更要麻煩一些。dongsuoying在過電壓程式中創造了很多函式,請大家程式設計時參考。
7 顯示漢字
假如乙個16*16的點陣漢字,它的字模存放在byte pattern[32]陣列中,陣列每兩個位元組表示一行,每一位表示在螢幕上顯示的乙個點。
void showhanzisample(int x, int y, byte color, byte* pattern)
;for(int i="0"; i < 16; i++)
}}顯示ascii字元也一樣,就是把字模拷貝到螢幕上。實際中應用是先根據漢字或字元的編碼,在字型檔中查詢字模,然後根據字模在螢幕上畫出來。總之,點陣字元很簡單。還有一些圖形拷貝運算函式圖形加速技術,介於篇幅就不易以介紹了。
8 退出svga圖形模式
回到預設字元模式:
__asm
vga bios功能呼叫,ah=0子功能是設定模式,al=3是將要設定的模式編號,對於vga來說al=3代表了字元模式,80*25,16色。
第四章 滑鼠
滑鼠和vbe好像不相干,但是圖形介面中必須的工具。dos7.10中包含滑鼠驅動程式ctmouse.exe,在config.sys檔案中增加一行
device=c:\dos71\ctmouse.exe
就可以在程式中應用滑鼠功能了,但是要注意,乙個只有5k的驅動程式不會把滑鼠的樣子也在螢幕上畫出來的,所以我們如果想在程式執行的時候看到滑鼠,必須自己動手畫出來。據說也有的驅動程式能自己畫滑鼠,不過我們寫過的程式還暫時用不到,所以不去關心它了。
學過svga之後,我想即使驅動程式自己可以畫出滑鼠的樣子來,這個程式也是相當的複雜。因為在顯示卡功能標準還不統一的古代,它要判斷顯示卡是哪一種,顯示模式是哪一種,然後才能決定怎樣作圖。即使大多數情況下能畫出來,我想它也未必認得「先進的」svga 800 * 600 * 256色模式。所以要是真的想看到滑鼠的話,還是不要偷懶,自己動手畫出來。
滑鼠功能通過bios的int 33h呼叫。
1 檢測是否安裝了滑鼠
int check;
__asm
if(check)
printf("installed"); //安裝了
else
printf("not install"); //未安裝
2 設定滑鼠移動範圍
如果我們的螢幕解析度是640 * 480,那麼就這樣設定滑鼠的範圍:
__asm
3 顯示和隱藏滑鼠
會顯示乙個預設的滑鼠形狀,這個功能有時候能用,很多時候用不了。在dosbox模擬器中可以顯示,除錯的時候可能用得著。
__asm
__asm
4 得到滑鼠位置和按鈕狀態
int mou***, mousey //儲存滑鼠的座標
int mousebtn
__asm
if(mousebtn == 1) //滑鼠左鍵按下了
在嵌入彙編語句時的注意事項
在c語言中嵌入彙編有100個好處,但是要注意:不要去改變ds,ss, bp,sp暫存器的值。比較可靠的方法是,除了ax, bx,cx, dx四個通用暫存器和si, di兩個變址暫存器外,其他的暫存器在使用後一定要恢復過來。由於c語言中的暫存器變數實際上使用si和di,所以在函式中有暫存器變數的時候也不要改變si和di的值。
總結vesa / svga和圖形學程式設計的內容完全可以寫幾大套專著出來,但是我們在實際用到的功能不太複雜,而且侷限在dos實模式程式設計,所以本篇就先寫這麼多。感謝dongsuoying提供的程式,終於寫完了!
dos下at的應用
at計畫在指定時間和日期在計算機上執行命令和程式。at 命令只能在 計畫 服務執行時使用。如果在沒有引數的情況下使用,則 at 列出已計畫的命令。語法 at computername at computername hours minutes interactive command 引數 compu...
DOS下的FTP命令
dos下的ftp命令 ftp命令的使用 雖然,現行的ftp上傳軟體都具有圖形介面,操作非常方便,許多人都不會使用ftp命令.但畢竟ftp命令是internet使用者使用最頻繁的命令之一,不論是在dos還是unix作業系統下使用ftp,都會遇到大量的ftp內部命令。熟悉並靈活應用ftp的內部命令,可以...
DOS下複製檔案
xcopy source destination a m d date p s e v w c i q f l g h r t u k n o x y y z exclude file1 file2 file3 source 指定要複製的檔案。destination 指定新檔案的位置和 或名稱。a ...