當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]可移植的256色圖形用戶界面的設(shè)計

摘 要 該文從軟件可移植性的角度指出設(shè)計256色圖形用戶界面時應(yīng)當(dāng)注意的問題,在對SuperVGA產(chǎn)品進(jìn)行分析的基礎(chǔ)上,提出了基于表格驅(qū)動的程序設(shè)計思想,并給出了范例。

隨著各種超級VGA的出現(xiàn),同時具有高分辨率和豐富色彩的圖形用戶界面已經(jīng)成為程序員和用戶共同追求的目標(biāo)。然而由于各制造商提供的VGA產(chǎn)品之間的差異,使得高分辨率256色圖形界面的兼容性受到影響,常常會出現(xiàn)這樣的情況:在一個顯示系統(tǒng)下運行良好的程序,在另一種顯示系統(tǒng)下變得面目全非,甚至根本不顯示。這表明程序員對程序的可移植性重視不夠,或?qū)Ω鞣N顯示設(shè)備缺乏足夠的了解。

軟件的可移植性是指軟件產(chǎn)品從一個硬件/軟件環(huán)境轉(zhuǎn)移到另一個硬件/軟件環(huán)境的難易與繁簡程度。它從軟件對新環(huán)境的適應(yīng)性這一方面,反映了軟件的質(zhì)量。為了提高軟件的可移植性,應(yīng)盡量使軟件與具體的設(shè)備無關(guān),即提高軟件的設(shè)備獨立性。對于256色圖形界面而言,就是要使程序不依賴于某種特定的顯示器。例如,程序員沒有任何理由假定用戶使用的是TVGA。為此,程序員必須提供顯示卡的常規(guī)檢測例程,并能根據(jù)檢測的結(jié)果決定圖形算法的具體實現(xiàn)。

提高軟件設(shè)備獨立性的方法有很多,表格驅(qū)動就是其中一種。所謂表格,就是根據(jù)需要設(shè)計的數(shù)據(jù)結(jié)構(gòu)。表格中的數(shù)據(jù)由檢測例程填寫。表格中包含哪些欄目,應(yīng)在對各制造商提供的SuperVGA產(chǎn)品足夠了解的基礎(chǔ)上取舍,欄目應(yīng)體現(xiàn)各產(chǎn)品之間的差異。

一、SuperVGA編程綜述

SuperVGA產(chǎn)品在體系結(jié)構(gòu)上和標(biāo)準(zhǔn)的IBM VGA有所不同。但編程思想基本上是一樣的,這些編程方法已有許多文章介紹,這里不再重復(fù)。

不同分辨率之間的區(qū)別,體現(xiàn)在編程上就是同一屏幕坐標(biāo)映射到顯存的地址不同,但映射機(jī)理卻是一樣的。具體地說,坐標(biāo)(x,y)對應(yīng)顯存的偏移地址(相對于A000)為Addr=-vga-width*y+x

2.分頁機(jī)制不同。SuperVGA使用256K、512K或1M

的顯示存儲器結(jié)構(gòu)。為了使處理器可通過一個64K主窗口來存取這樣大的顯示存儲器,SuperVGA有一個存儲器分頁機(jī)制,使得只將顯示存儲器的一部分映射到處理器的地址空間。值得注意的是,不同的VGA產(chǎn)品,其頁的大小不同,頁起始地址的粒度也是可變的。具體的頁選擇算法請查閱制造商提供的資料。

不同的顯示模式,顯示一屏圖像所需的頁數(shù)是不同的。

除了可移植性外,效率也是一個不可忽視的因素。圖形系統(tǒng)的核心部分應(yīng)使用匯編語言編程。這不僅是因為匯編語言的效率高,而且還因為匯編語言子程序的可再用性和可協(xié)用性也很好。核心部分應(yīng)十分重視下面幾點:(1)減少不必要的頁邊界檢查次數(shù);(2)只有在必要時才進(jìn)行頁選擇;(3)選擇高效的機(jī)器指令。現(xiàn)舉例說明。程序1是圖像顯示系統(tǒng)中常用的函數(shù),其功能是將解包后的圖像數(shù)據(jù)送到顯存。為便于閱讀同時給出了C語言調(diào)用原型。程序在傳送每一行數(shù)據(jù)時,提前預(yù)測是否會遇到頁邊界,如果沒有,直接傳送;如果有,則將數(shù)據(jù)分成兩部分,分別傳送,中間插入頁選擇。所有的傳送均用字操作代替字節(jié)操作。頁邊界檢查只有一次,分頁操作只有在必要時才發(fā)生,圖像的顯示用最高效的指令REP MOVSW。

程度1:

;原型:void LineDump(int x,int y, int num, char far*ptr)

;參數(shù):

; x,y-屏幕坐標(biāo)

; num-本行的像素個數(shù)

; ptr-指向像素數(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)=頁號

call dword ptr cs:-PageSelect

mov cx, num ;本行要傳送字節(jié)數(shù)

mov bx, cx

add bx,di ;檢測傳送是否在一個頁內(nèi)

jnc Dump-In-One-Page

sub cx,bx ;CX=本頁字節(jié)數(shù),BX=下頁字節(jié)數(shù)

shr cx,1 ;CX/2=字?jǐn)?shù)

rep movsw ;本頁內(nèi)的傳送

adc cx,0

rep movsb ;處理可能的奇數(shù)字節(jié)數(shù)

inc ah ;調(diào)整頁號

call dword ptr cs:-PageSelect

mov cx,bx ;新頁內(nèi)要寫的字節(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ū)動的基本思想

根據(jù)上面的分析,用以驅(qū)動顯示系統(tǒng)的表格,至少應(yīng)當(dāng)包含下列項目:

(1)實際顯示模式:vga-mode

(2)水平分辨率:vga-width

(3)垂直分辨率:vga-depth

(4)頁選擇例程的入口地址:PageSelect

(5)當(dāng)前顯示方式所使用的最大頁號:vga-pages

這個表格由圖形初始化例程來填寫。圖形初始化例程接收的顯示模式是統(tǒng)一的模式號,這樣可以撇開具體的設(shè)備,如InitVGA(TVGA800×600)。該例程調(diào)用顯示設(shè)備檢測程序DetectVGA來判斷顯示器的類型,從而填寫表格中的各欄目,并初始化圖形系統(tǒng)為所需的圖形方式。所有圖形算法都要查此表。

除了用上述方法來實現(xiàn)兼容外,視頻電子學(xué)標(biāo)準(zhǔn)協(xié)會(VESA)為我們提供了另一種方法。

VESA

提供了一組附加的BIOS功能,這組功能以標(biāo)準(zhǔn)的方式訪問SuperVGA擴(kuò)充的模式。VESA的附加功能都是通過BIOS中斷10H的4FH功能來實現(xiàn)的。VESA的子功能01能返回非常有用的SuperVGA模式信息,包括分頁例程的地址。

因此,程序員可以按照VESA的標(biāo)準(zhǔn)來編寫圖形系統(tǒng),這樣的程序可以在所有支持VESA的顯示器上運行。由于VESA包括了世界上的主要VGA供應(yīng)商,寫出來的程序可移植性是很好的。但是,其效率卻可能是最低的。所以最好采用一種折衷的辦法,對于熟悉的產(chǎn)品,可以不用VESA的功能,對于不熟悉(資料不全)或檢測不出來的顯示器嘗試用VESA提供的手段來編程,當(dāng)然要檢測顯示設(shè)備是否支持VESA。

有時出于某種考慮,不希望支持所有顯示設(shè)備的代碼集中在一個程序中,可以為每個顯示設(shè)備分別提供驅(qū)動模塊,主程序根據(jù)檢測的結(jié)果選擇一個合適的模塊加載。Borland的C++就是這樣,它有一套BGI驅(qū)動程序,各驅(qū)動程序提供統(tǒng)一的圖形函數(shù)接口。筆者在實際工作中,為每一種顯示設(shè)備編寫了一個256色的BGI格式的驅(qū)動程序,這樣,在編寫圖形系統(tǒng)時,再也沒有必要考慮用戶的實際顯示設(shè)備了。

三、范 例

本文附有兩個圖形顯示的例子。ShowGif能顯示16/256色GIF格式圖像,能以任何256色模式啟動,支持多種顯示器。圖像可以漫游,并可隨時通過按鍵切換顯示方式。Main則是一個BGI驅(qū)動的鼠標(biāo)/鍵盤控制的256色漢字圖形菜單。它自己會挑選一個合適的BGI,也可以從命令行指定一個BGI(比如指定VESA256給TVGA顯示器)。

限于篇幅,這里僅給出有關(guān)的數(shù)據(jù)結(jié)構(gòu)和部分函數(shù)的說明(程序2)。然后給出一個初始化顯

示系統(tǒng)的C語言片斷(程序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

};

/* 對應(yīng)的BGI驅(qū)動程序名 */

unsigned char *Drivers[]={

"TVGA256",

"TVGA256",

"AVGA256",

...

"VESA256",

};

extern int DetectVGA(void);

/* 功 能:檢測顯示卡的型號

返回值:0-Unknowm1-Trident VGA2-Paradise VGA

...

x-不能檢測出的VGA,但支持VESA

返回值同時寫入全局變量vga-type */

extern int VesaFound(void);

/* 功 能:檢測VESA BIOS的存在性

返 回:0-不支持VESA;

其它-VESA版本號(0x0102即1.02版);

返回值同時寫入全程變量vesa-found. */

extern void InitVesa(void);

/* 功 能:初始化VESA.根據(jù)-vga-mode模式號換算成VESA的標(biāo)準(zhǔn)模式號填寫頁粒度(WinGranularity),頁大小(WinSize),

和分頁例程的入口地址(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)(自動調(diào)用DetectVGA檢測顯示卡)

參 數(shù):mode=TVGA320x200(0)

TVGA640x400(1)

TVGA640x480(2)

TVGA800x600(3)

TVGA1024x768(4)

返 回:InitVGA沒有顯式的返回值,但它初始化下列全程變量:

vga-mode,vga-width,vga-depth,vga-pages,PageSelect

必要時自動調(diào)用InitVesa

*/

extern int vga-type;

extern int vga-mode;

extern int vga-width;

extern int vga-depth;

extern int vga-pages;

extern int vga-pages;

extern char page-number;

extern int vesa-found;

...

程序3(初始化顯示系統(tǒng)的程序片斷):

...

int GraphDriver, GraphMode;

unsigned char *bgiDriver="PVGA256";

bgiDriver=Drivers[DetectVGA()];

GraphDriver=installuserdriver(bgiDriver,NULL);

GraphMode=TVGA800x600;

initgraph(&GraphDriver, &GraphMode," ");...

參考文獻(xiàn)

1 來文占等編譯.Super VGA高級編程指南.北京:北京科海培訓(xùn)中心,1991.5.

2 張一波編譯.Super VGA與VESA編程指南.北京:海洋出版社,1992

更多計算機(jī)與外設(shè)信息請關(guān)注21ic計算機(jī)與外設(shè)頻道

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉