可移植的256色圖形用戶界面的設(shè)計(jì)
隨著各種超級(jí)VGA的出現(xiàn),同時(shí)具有高分辨率和豐富色彩的圖形用戶界面已經(jīng)成為程序員和用戶共同追求的目標(biāo)。然而由于各制造商提供的VGA產(chǎn)品之間的差異,使得高分辨率256色圖形界面的兼容性受到影響,常常會(huì)出現(xiàn)這樣的情況:在一個(gè)顯示系統(tǒng)下運(yùn)行良好的程序,在另一種顯示系統(tǒng)下變得面目全非,甚至根本不顯示。這表明程序員對(duì)程序的可移植性重視不夠,或?qū)Ω鞣N顯示設(shè)備缺乏足夠的了解。
軟件的可移植性是指軟件產(chǎn)品從一個(gè)硬件/軟件環(huán)境轉(zhuǎn)移到另一個(gè)硬件/軟件環(huán)境的難易與繁簡(jiǎn)程度。它從軟件對(duì)新環(huán)境的適應(yīng)性這一方面,反映了軟件的質(zhì)量。為了提高軟件的可移植性,應(yīng)盡量使軟件與具體的設(shè)備無(wú)關(guān),即提高軟件的設(shè)備獨(dú)立性。對(duì)于256色圖形界面而言,就是要使程序不依賴(lài)于某種特定的顯示器。例如,程序員沒(méi)有任何理由假定用戶使用的是TVGA。為此,程序員必須提供顯示卡的常規(guī)檢測(cè)例程,并能根據(jù)檢測(cè)的結(jié)果決定圖形算法的具體實(shí)現(xiàn)。
提高軟件設(shè)備獨(dú)立性的方法有很多,表格驅(qū)動(dòng)就是其中一種。所謂表格,就是根據(jù)需要設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)。表格中的數(shù)據(jù)由檢測(cè)例程填寫(xiě)。表格中包含哪些欄目,應(yīng)在對(duì)各制造商提供的SuperVGA產(chǎn)品足夠了解的基礎(chǔ)上取舍,欄目應(yīng)體現(xiàn)各產(chǎn)品之間的差異。
一、SuperVGA編程綜述
SuperVGA產(chǎn)品在體系結(jié)構(gòu)上和標(biāo)準(zhǔn)的IBM VGA有所不同。但編程思想基本上是一樣的,這些編程方法已有許多文章介紹,這里不再重復(fù)。
影響256色圖形界面可移植性的主要障礙來(lái)自各制造商提供的VGA產(chǎn)品的下面幾點(diǎn)差異。
1.顯示模式的定義不同。如5DH對(duì)TVGA而言,代表640×480
×256色模式,對(duì)PVGA而言卻代
表1024×768×16色模式。因此,直接用這種模式號(hào)初始化顯示系統(tǒng)是不可取的。和顯示模式密切相關(guān)的是水平分辨率和垂直分辨率。盡管各VGA的256色顯示模式定義迥異,但大都支持如下幾種流行的分辨率,現(xiàn)用統(tǒng)一的模式號(hào)定義見(jiàn)附表。
@@10A06500.GIF;附表@@
不同分辨率之間的區(qū)別,體現(xiàn)在編程上就是同一屏幕坐標(biāo)映射到顯存的地址不同,但映射機(jī)理卻是一樣的。具體地說(shuō),坐標(biāo)(x,y)對(duì)應(yīng)顯存的偏移地址(相對(duì)于A000)為Addr=-vga-width*y+x
2.分頁(yè)機(jī)制不同。SuperVGA使用256K、512K或1M
的顯示存儲(chǔ)器結(jié)構(gòu)。為了使處理器可通過(guò)一個(gè)64K主窗口來(lái)存取這樣大的顯示存儲(chǔ)器,SuperVGA有一個(gè)存儲(chǔ)器分頁(yè)機(jī)制,使得只將顯示存儲(chǔ)器的一部分映射到處理器的地址空間。值得注意的是,不同的VGA產(chǎn)品,其頁(yè)的大小不同,頁(yè)起始地址的粒度也是可變的。具體的頁(yè)選擇算法請(qǐng)查閱制造商提供的資料。
不同的顯示模式,顯示一屏圖像所需的頁(yè)數(shù)是不同的。
除了可移植性外,效率也是一個(gè)不可忽視的因素。圖形系統(tǒng)的核心部分應(yīng)使用匯編語(yǔ)言編程。這不僅是因?yàn)閰R編語(yǔ)言的效率高,而且還因?yàn)閰R編語(yǔ)言子程序的可再用性和可協(xié)用性也很好。核心部分應(yīng)十分重視下面幾點(diǎn):(1)減少不必要的頁(yè)邊界檢查次數(shù);(2)只有在必要時(shí)才進(jìn)行頁(yè)選擇;(3)選擇高效的機(jī)器指令?,F(xiàn)舉例說(shuō)明。程序1是圖像顯示系統(tǒng)中常用的函數(shù),其功能是將解包后的圖像數(shù)據(jù)送到顯存。為便于閱讀同時(shí)給出了C語(yǔ)言調(diào)用原型。程序在傳送每一行數(shù)據(jù)時(shí),提前預(yù)測(cè)是否會(huì)遇到頁(yè)邊界,如果沒(méi)有,直接傳送;如果有,則將數(shù)據(jù)分成兩部分,分別傳送,中間插入頁(yè)選擇。所有的傳送均用字操作代替字節(jié)操作。頁(yè)邊界檢查只有一次,分頁(yè)操作只有在必要時(shí)才發(fā)生,圖像的顯示用最高效的指令REP MOVSW。
程度1:
;原型:void LineDump(int x,int y, int num, char far*ptr)
;參數(shù):
; x,y-屏幕坐標(biāo)
; num-本行的像素個(gè)數(shù)
; ptr-指向像素?cái)?shù)據(jù)的遠(yuǎn)指針
LineDump proc far
push bp
mov bp,sp
sub sp,2;WORD Reserved for local var.
push ds
push es
push si
push di
reserved equ [bp-2];Local var.save seg(DGROUP)
x equ [bp+6];Large Model
y equ [bp+8]
num equ [bp+10]
offs equ [bp+12]
pseg equ [bp+14]
mov reserved,ds
mov ds,pseg
mov si,offs ;DS:SI圖像數(shù)據(jù)所在源地址
mov ax,0a000h;顯存段址
mov es,ax ;ES:DI顯存目的地址
mov ax,y
push ds
mov ds,reserved
mul word ptr DGROUP:-vga-width
pop ds
add ax,x
adc dx,0
mov di,ax ;DI=-vga-width*y+x
mov ah,dl ;進(jìn)位部分(DL)=頁(yè)號(hào)
call dword ptr cs:-PageSelect
mov cx, num ;本行要傳送字節(jié)數(shù)
mov bx, cx
add bx,di ;檢測(cè)傳送是否在一個(gè)頁(yè)內(nèi)
jnc Dump-In-One-Page
sub cx,bx ;CX=本頁(yè)字節(jié)數(shù),BX=下頁(yè)字節(jié)數(shù)
shr cx,1 ;CX/2=字?jǐn)?shù)
rep movsw ;本頁(yè)內(nèi)的傳送
adc cx,0
rep movsb ;處理可能的奇數(shù)字節(jié)數(shù)
inc ah ;調(diào)整頁(yè)號(hào)
call dword ptr cs:-PageSelect
mov cx,bx ;新頁(yè)內(nèi)要寫(xiě)的字節(jié)數(shù)
jcxz Dump-Done
Dump-In-One-Page:
shr cx,1 ;CX/2=字?jǐn)?shù)
rep movsw ;圖像傳送
adc cx,0
rep movsb ;處理可能的奇數(shù)字節(jié)數(shù)
Dump-Done:
pop di
pop si
pop es
pop ds
mov sp,bp
pop bp
ret
LineDump endp
二、表格驅(qū)動(dòng)的基本思想
根據(jù)上面的分析,用以驅(qū)動(dòng)顯示系統(tǒng)的表格,至少應(yīng)當(dāng)包含下列項(xiàng)目:
(1)實(shí)際顯示模式:vga-mode
(2)水平分辨率:vga-width
(3)垂直分辨率:vga-depth
(4)頁(yè)選擇例程的入口地址:PageSelect
(5)當(dāng)前顯示方式所使用的最大頁(yè)號(hào):vga-pages
這個(gè)表格由圖形初始化例程來(lái)填寫(xiě)。圖形初始化例程接收的顯示模式是統(tǒng)一的模式號(hào),這樣可以撇開(kāi)具體的設(shè)備,如InitVGA(TVGA800×600)。該例程調(diào)用顯示設(shè)備檢測(cè)程序DetectVGA來(lái)判斷顯示器的類(lèi)型,從而填寫(xiě)表格中的各欄目,并初始化圖形系統(tǒng)為所需的圖形方式。所有圖形算法都要查此表。
除了用上述方法來(lái)實(shí)現(xiàn)兼容外,視頻電子學(xué)標(biāo)準(zhǔn)協(xié)會(huì)(VESA)為我們提供了另一種方法。
VESA
提供了一組附加的BIOS功能,這組功能以標(biāo)準(zhǔn)的方式訪問(wèn)SuperVGA擴(kuò)充的模式。VESA的附加功能都是通過(guò)BIOS中斷10H的4FH功能來(lái)實(shí)現(xiàn)的。VESA的子功能01能返回非常有用的SuperVGA模式信息,包括分頁(yè)例程的地址。
因此,程序員可以按照VESA的標(biāo)準(zhǔn)來(lái)編寫(xiě)圖形系統(tǒng),這樣的程序可以在所有支持VESA的顯示器上運(yùn)行。由于VESA包括了世界上的主要VGA供應(yīng)商,寫(xiě)出來(lái)的程序可移植性是很好的。但是,其效率卻可能是最低的。所以最好采用一種折衷的辦法,對(duì)于熟悉的產(chǎn)品,可以不用VESA的功能,對(duì)于不熟悉(資料不全)或檢測(cè)不出來(lái)的顯示器嘗試用VESA提供的手段來(lái)編程,當(dāng)然要檢測(cè)顯示設(shè)備是否支持VESA。
有時(shí)出于某種考慮,不希望支持所有顯示設(shè)備的代碼集中在一個(gè)程序中,可以為每個(gè)顯示設(shè)備分別提供驅(qū)動(dòng)模塊,主程序根據(jù)檢測(cè)的結(jié)果選擇一個(gè)合適的模塊加載。Borland的C++就是這樣,它有一套BGI驅(qū)動(dòng)程序,各驅(qū)動(dòng)程序提供統(tǒng)一的圖形函數(shù)接口。筆者在實(shí)際工作中,為每一種顯示設(shè)備編寫(xiě)了一個(gè)256色的BGI格式的驅(qū)動(dòng)程序,這樣,在編寫(xiě)圖形系統(tǒng)時(shí),再也沒(méi)有必要考慮用戶的實(shí)際顯示設(shè)備了。
三、范 例
本文附有兩個(gè)圖形顯示的例子。ShowGif能顯示16/256色GIF格式圖像,能以任何256色模式啟動(dòng),支持多種顯示器。圖像可以漫游,并可隨時(shí)通過(guò)按鍵切換顯示方式。Main則是一個(gè)BGI驅(qū)動(dòng)的鼠標(biāo)/鍵盤(pán)控制的256色漢字圖形菜單。它自己會(huì)挑選一個(gè)合適的BGI,也可以從命令行指定一個(gè)BGI(比如指定VESA256給TVGA顯示器)。
限于篇幅,這里僅給出有關(guān)的數(shù)據(jù)結(jié)構(gòu)和部分函數(shù)的說(shuō)明(程序2)。然后給出一個(gè)初始化顯
示系統(tǒng)的C語(yǔ)言片斷(程序3)。
程序2(TVGA256.
H):
/* 統(tǒng)一的模式集 */
enum TVGA-MODE
TVGA320x200=0,
TVGA640x400=1,
TVGA640x480=2,
TVGA800x600=3,
TVGA1024x768=4,
;
void TVGA256-driver(void);
void PVGA256-driver(void);
void AVGA256-driver(void);
...
void VESA256-driver(void);
extern int far-Cdecl TVGA256-driver-far[];
extern int far-Cdecl PVGA256-driver-far[];
extern int far-Cdecl AVGA256-driver-far[];
...
extern int far-Cdecl VESA256-driver-far[];
/* 支持的VGA集合 */
enum VGAs{
UnKnownVGA,
TridentVGA,
ParadiseVGA,
AheadVGA,
...
VesaVGA
};
/* 對(duì)應(yīng)的BGI驅(qū)動(dòng)程序名 */
unsigned char *Drivers[]={
"TVGA256",
"TVGA256",
"AVGA256",
...
"VESA256",
};
extern int DetectVGA(void);
/* 功 能:檢測(cè)顯示卡的型號(hào)
返回值:0-Unknowm1-Trident VGA2-Paradise VGA
...
x-不能檢測(cè)出的VGA,但支持VESA
返回值同時(shí)寫(xiě)入全局變量vga-type */
extern int VesaFound(void);
/* 功 能:檢測(cè)VESA BIOS的存在性
返 回:0-不支持VESA;
其它-VESA版本號(hào)(0x0102即1.02版);
返回值同時(shí)寫(xiě)入全程變量vesa-found. */
extern void InitVesa(void);
/* 功 能:初始化VESA.根據(jù)-vga-mode模式號(hào)換算成VESA的標(biāo)準(zhǔn)模式號(hào)填寫(xiě)頁(yè)粒度(WinGranularity),頁(yè)大小(WinSize),
和分頁(yè)例程的入口地址(WinFuncPtr)
VESA的標(biāo)準(zhǔn)模式解釋如下:
100h-640x400 256
101h-640x480 256
102h-800x600 16
103h-800x600 256
104h-1024x768 16
105h-1024x768 256 etc.
InitVesa供給InitVGA調(diào)用 */
extern void InitVGA(int mode);
/* 功 能:初始化顯示系統(tǒng)(自動(dòng)調(diào)用DetectVGA檢測(cè)顯示卡)
參 數(shù):mode=TVGA320x200(0)
TVGA640x400(1)
TVGA640x480(2)
TVGA800x600(3)
TVGA1024x768(4)
返 回:InitVGA沒(méi)有顯式的返回值,但它初始化下列全程變量:
vga-mode,vga-width,vga-depth,vga-pages,PageSelect
必要時(shí)自動(dòng)調(diào)用InitVesa
*/
extern int vga-type;
extern int vga
2.部分稿件來(lái)源于網(wǎng)絡(luò),如有不實(shí)或侵權(quán),請(qǐng)聯(lián)系我們溝通解決。最新官方信息請(qǐng)以湖北省教育考試院及各教育官網(wǎng)為準(zhǔn)!
-
122023-04湖北自考風(fēng)景園林專(zhuān)業(yè)本科畢業(yè)論文范文湖北自考風(fēng)景園林專(zhuān)業(yè)本科畢業(yè)論文范文
-
122023-04湖北自考土木工程專(zhuān)業(yè)本科畢業(yè)論文范文湖北自考土木工程專(zhuān)業(yè)本科畢業(yè)論文范文
-
122023-04湖北自考計(jì)算機(jī)信息安全本科畢業(yè)論文范文湖北自考計(jì)算機(jī)信息安全本科畢業(yè)論文范文
-
122023-04湖北自考建筑學(xué)本科畢業(yè)論文范文湖北自考建筑學(xué)本科畢業(yè)論文范文
-
122023-04湖北自考軟件工程本科畢業(yè)論文湖北自考軟件工程本科畢業(yè)論文
-
122023-04湖北自考網(wǎng)絡(luò)工程專(zhuān)業(yè)本科畢業(yè)論文范文湖北自考網(wǎng)絡(luò)工程專(zhuān)業(yè)本科畢業(yè)論文范文
已幫助10w萬(wàn)+意向?qū)W歷提升用戶成功上岸
-
毛澤東思想概論
培訓(xùn)優(yōu)勢(shì):課時(shí)考點(diǎn)精講+刷題+沖刺,熟練應(yīng)對(duì)考試題型。全程督促學(xué)習(xí),安排好學(xué)習(xí)計(jì)劃。 毛澤東思想概論...自考培訓(xùn) -
英語(yǔ)二
本課程既是一門(mén)語(yǔ)言實(shí)踐課程,也是拓寬知識(shí)、了解世界文化的重要素質(zhì)課程,它以培養(yǎng)學(xué)習(xí)者的綜合語(yǔ)言應(yīng)用能力為目標(biāo),使他們?cè)趯W(xué)習(xí)、工作和社會(huì)交往中能夠使用英語(yǔ)進(jìn)行有效的交流。 英語(yǔ)二...自考培訓(xùn) -
馬克思主義基本原理概論
本書(shū)包括兩個(gè)部分:自學(xué)考試大綱和基本原理。主要內(nèi)容有,馬克思主義是關(guān)于工人階級(jí)和人類(lèi)解放的科學(xué),物質(zhì)世界及其發(fā)展規(guī)律,認(rèn)識(shí)的本質(zhì)及其規(guī)律,人類(lèi)社會(huì)及其發(fā)展規(guī)律,資本主義的形成及其發(fā)展,資本主義發(fā)展的歷史進(jìn)程,社會(huì)主義社會(huì)及其進(jìn)程,共產(chǎn)主義社會(huì)及其進(jìn)程等。 馬克思主義基本原理概論...自考培訓(xùn) -
思想道德修養(yǎng)與法律基礎(chǔ)
《思想道德修養(yǎng)與法律基礎(chǔ)》課具有鮮明的政治性、思想性、理論性、針對(duì)性、科學(xué)性、知識(shí)性以及實(shí)踐性和修養(yǎng)性。它包羅政治、思想、道德、心理本質(zhì)、學(xué)習(xí)成才和法律本質(zhì)等內(nèi)容,指導(dǎo)和回答大學(xué)生在人生、抱負(fù)、信念等方面遍及關(guān)心和迫切需要解決的問(wèn)題。 思想道德修養(yǎng)與法律基礎(chǔ)...自考培訓(xùn) -
中國(guó)近代史綱要
“中國(guó)近現(xiàn)代史綱要”全國(guó)高等教育自學(xué)考試指定教材,依據(jù)中央審定的普通高等學(xué)?!爸袊?guó)近現(xiàn)代史綱要”編寫(xiě)大綱以及馬克思主義理論研究和建設(shè)工程重點(diǎn)教材《中國(guó)近現(xiàn)代史綱要》,結(jié)合自學(xué)考試的特點(diǎn)設(shè)計(jì)了十章,集中講述1840年鴉片戰(zhàn)爭(zhēng)爆發(fā)一直到2007年中國(guó)共產(chǎn)黨第十七次全國(guó)代表大會(huì)召開(kāi)的160多年的中國(guó)近現(xiàn)代歷史。 中國(guó)近代史綱要...自考培訓(xùn)
- 2025年春季湖北汽車(chē)工業(yè)學(xué)院自考本科畢業(yè)生學(xué)位外語(yǔ)水平考試報(bào)名通知
- 湖北自考院校怎么選?專(zhuān)業(yè)老師幫你支招!
- 湖北自考專(zhuān)升本備考攻略,過(guò)來(lái)人分享高分秘籍!
- 獨(dú)家揭秘!湖北自考大專(zhuān)學(xué)習(xí)捷徑和陷阱!
- 湖北自考大專(zhuān)學(xué)習(xí)沒(méi)思路?這份備考指南請(qǐng)收好!
- 湖北自考答題技巧大揭秘,讓你輕松提分!
- 湖北自考本科備考過(guò)程中,每天寫(xiě)多少篇英語(yǔ)短文比較合適?
- 湖北自考本科英語(yǔ)(二)備考期間,寫(xiě)作練習(xí)要如何制定計(jì)劃?
- 湖北自考本科英語(yǔ)(二)通關(guān)攻略!8成考生都在用這3個(gè)學(xué)習(xí)方法!
- 湖北自考本科英語(yǔ)(二)怎么復(fù)習(xí)?過(guò)來(lái)人經(jīng)驗(yàn)大揭秘! 查看更多
掃一掃關(guān)注微信公眾號(hào)
隨時(shí)獲取湖北省自考政策、通知、公告以及各類(lèi)學(xué)習(xí)資料、學(xué)習(xí)方法、課程。