附錄七 常用的 INT 10H

INT 10H 是由 BIOS 對螢幕及顯示器所提供的服務程式,而後倚天公司針對倚天中文提供了許多服務程式,這些服務程式也加掛在 INT 10H 內。使用 INT 10H 中斷服務程式時,先指定 AH 暫存器為下表編號其中之一,該編號表示欲呼叫的功用,而其他暫存器的詳細說明,參考表後文字,當一切設定好之後再呼叫 INT 10H。底下是它們的說明:

編號功用 編號功用
00 設定顯示模式 01 設定文字模式時游標大小
02 設定游標位置 03 讀取游標位置
04 讀取光筆位置 05 選擇顯示頁
06 向上捲動螢幕 07 向下捲動螢幕
08 讀取游標所在位置之字元及屬性 09 在游標所在位置寫入字元及屬性
0A 在游標所在位置寫入一字元 0B 設定調色盤
0C 寫入一有顏色的點 0D 讀取點
0E 寫入字串 0F 讀取模式狀態

AH=00H

AH=00/INT 10H 是用來設定顯示模式的服務程式,AL 暫存器表示欲設定的模式:

AL文字/圖形 解析度顏色
00文字 40*252
01文字 40*2516
02文字 80*252
03文字 80*2516
04圖形 320*2002
05圖形 320*2004
06圖形 640*2002

AH=01H

您可以把游標想成一個小的矩形,平時這個矩形扁平位於某字底部,但藉由此功能可以改變其大小與位置。游標起始處與終止處分別由 CL 與 CH 的 0 到 4 位元表示,參考下圖:

而 CH 的第 7 位元必須是 0,第 5、6 位元表示游標屬性:

位元 6  位元 5   屬性
   0      0      正常
   0      1      隱形
   1      0
   1      1      閃爍緩慢

AH=02H

此功能是設定游標位置,位置用 DH、DL 表示,DH 表示列號,DL 表示行號。由左至右稱之為『列』,螢幕最上面一列為第零列,緊靠第零列的下一列稱為第一列……;由上而下稱之為『行』,螢幕最左邊一行稱之為第零行,緊靠第零行右邊的一行為第一行。故最左邊,最上面的位置為 DH=0 且 DL=0;最左邊第二列,DH=1,DL=0。如果是文字模式時,BH 為欲改變游標位置的顯示頁,如果是圖形模式,BH 要設為 0。

以行列來說明 DH、DL 之意義,小木偶常常搞混,底下以座標方式解釋。在文字模式下,字元的位置類似數學直角座標系的座標,但是 Y 軸方向相反,Y 軸是以螢幕最上面為零,越下面越大,直到 24 為止,存於 DH 內。X 軸和直角座標系相同,越右邊越大,存於 DL 內,其最大值視顯示模式而變。

AH=03H

AH=03H/INT 10H 這個中斷服務程式返回時,會在 DX 裡面有游標的行列位置,CX 內有游標的大小,DX、CX 之數值所代表的意義和 AH=02H/INT 10H、AH=01H/INT 10H 相同。

AH=04H

此功能是探測光筆之位置,似乎只有 CGA 卡有接上光筆??

AH=05H

這個功能是把指定的顯示頁顯示於螢幕上,欲顯示的顯示頁於 AL 暫存器中指定。此功能只能在文字模式下才能發生作用。

AH=06H/07H

這個服務程式的功用是把某一個設定好的矩形區域內的文字向上或向下移動。先說明向上移動,即呼叫 AH=06H/INT 10H。當此服務程式工作時,會使矩形區域的文字向上移動,而矩形區域底端移進空白列。向上移動的列數存入 AL 中 ( 如果 AL 為零,表示使矩形區域的所有列均向上移 ),底端移入空白列的屬性存於 BH,矩形區域是藉由 CX、DX 來設定左上角與右上角的座標,左上角的行與列分別由 CL、CH 設定,右下角的行與列由 DL、DH 設定。

AH=07H/INT 10H 和 AH=06H/INT 10H 相似,只是捲動方像不同而已。

AH=08H

這個服務程式是用來取得游標所在位置的字元及屬性,呼叫前,BH 表示欲讀取之顯示頁,返回時,AL 為該位置之 ASCII 字元,AH 為其屬性。有關屬性的說明,請參考註一

AH=09H

這個功能是在游標位置印出字元,所要印出字元的 ASCII 碼存於 AL 暫存器,字元重複次數存於 CX 暫存器,顯示頁存於 BH 暫存器,屬性存於 BL 暫存器,其屬性使用與 AH=08/INT 10H 一樣。

AH=0AH

這個功能和 AH=09H/INT 10H 一樣,差別在 AH=0AH 只能寫入一個字元,而且不能改變字元屬性。

AH=0BH

這個服務程式是選擇調色盤。顯示模式 5 是 320*200 的圖形模式,最多可以顯示 4 種顏色,這四種顏色的意思是最多可以『同時』顯示一種背景色及三種前景色,而這三種前景色有兩種方式可供選擇,因此事實上,在顯示模式 5 有兩種調色盤可供選擇。就好像您去買 12 種顏色的水彩,但可在調色盤上以任意比例搭配出許多種顏色。

調色盤 0 的三色是綠、紅、黃;調色盤 1 的三色是青、紫紅、白。背景色有 16 六種可供選擇,這 16 種就是註一的 16 色。呼叫此中斷時,先決定要設定背景色抑或調色盤,

背景色只有在前景色為 0 時才會顯現出來。

AH=0CH

AH=0Ch/INT 10H 是在繪圖模式中印出一點 ( 也就是寫入點像,write graphics pixel ),而 AH=0DH/INT 10H 則是讀取點像 ( read graphics pixel )。

寫入時,要寫入位置 X 座標存於 CX 暫存器,Y 座標存於 DX 暫存器,顏色存於 AL 暫存器。和文字模式相同,螢光幕上的 Y 座標是最上面一列為零,越下面越大,X 座標則和數學的定義相同。CX、DX、AL 值之範圍與顯示模式有關:

顯示模式 X 座標 Y 座標 顏色
40∼319 0∼1990、1
50∼319 0∼1990∼3
60∼639 0∼1990、1

AH=0DH/INT 10H 則是讀取某一位置之點像,您必須指定 CX、DX,而 INT 10H 會傳回該位置點像之顏色。

AH=0EH

這個副程式是使顯示器像打字機一樣的印出字元來,在前面用 AH=09H/INT 10H 和 AH=0AH/INT 10H 都可以在螢光幕上顯示字元,但是這兩奘方式顯示字元之後,游標位置並不移動,而 AH=0EH/INT 10H 則會使游標位置移動,每顯示一個字元,游標會往右移一格,假如已經到最右邊了,則游標會移到最左邊並移到下一列,假如已經移到最下面一列的最右邊,則螢幕會向上捲動。

AL 暫存器存要顯示的字元,BH 為目前的顯示頁,如果是在圖形模式,則 BH 須設為 0,假如是在圖形模式下,也可以設定 BL 來表示文字的顏色,文字模式下的 BL 則無功能。

AH=0FH

這個服務程式是得到目前的顯示模式,呼叫前只需使 AH 設為 0fh,當由 INT 10H 返回時,顯示模式存於 AL 暫存器 ( 參考 AH=00H/INT 10H 的顯示模式表 ),目前的顯示頁存於 BH 暫存器,總字元行數存於 AH 暫存器。


註一: 所謂屬性是指字元的顏色、背景顏色、是否閃爍、有沒有底線等性質。在彩色顯示卡 ( CGA/EGA/VGA 等 ) 的文字模式中,顏色是用 4 個位元表示,故可以表現出 16 種顏色,如下表:

二進位數 顏色 例子 二進位數 顏色 例子
0000黑色 black 1000灰色 gray
0001藍色 blue 1001淡藍色 light blue
0010綠色 green 1010淡綠色 light green
0011青色 cyan 1011淡青色 light cyan
0100紅色 red 1100淡紅色 light red
0101紫紅色 magenta 1101淡紫紅色 light magenta
0110棕色 brown 1110黃色 yellow
0111銀色 light gray 1111白色 white

在彩色顯示器堙A如 CGA、EGA、VGA 等,常用一個位元組 ( 8 個位元 ) 來表示文字顏色和背景顏色,通常以第 0∼3 位元表示文字本身顏色;第 4∼6 位元表示背景顏色,背景顏色只有上表左欄的 8 種而已;第 7 個位元,表示是否閃爍,0 表示不閃爍,1 表示閃爍。

但是在單色顯示器堙A如 MDA 和 Hercules 卡中,這些顏色表並無意義,所以屬性解釋方式不同,請看下表:

數值 屬性
00H 空白,不顯示任何資料
77H 顯示白色方塊
07H 正常的黑底白字
70H 反白的白底黑字
01H 加底線