第二章 DOS 電玩程式
2.2 螢幕輸出
2.2.2 彩色顯像的模式
圖 2-8 螢幕成像掃描
螢幕
圖 2-9 顯示卡資料傳送流程
2.2.2
彩色顯像的模式
PC 的螢幕顯示分成兩大模式,那就是文字模式跟繪圖模式,文字模式只能顯 示文字(ASCII 符號) ,不能繪圖,繪圖模式則是兩者都可一顯示。一般狀況下,
PC 處理的是文字模式,這個模式所顯示的文字和特殊符號的樣子都事先儲存在顯 示卡的唯讀記憶體(ROM)中。PC 只要將這一些文字和特殊符號的 ASCII 碼寫入顯 示記憶體中,顯示卡會自動依據 ASCII 碼查出這個字的顯示圖案,然後控制電子 槍做掃描把它顯示在游標所指的位址。
由於文字模式把螢幕分成 25 列 80 行(直行橫列)。所以在一列中最多只可以顯 示 80 個字姆,整個螢幕最多只能塞下 25 橫列。整個螢幕好像為 25×80 的棋盤方 格,因此我們不能在文字模式下把點化到任意一個位置上,只能在 25×80 的方格 中顯示一個因文字姆或符號。
但是繪圖模式底下允許我們把一個一個的像點描繪在螢幕的任一位置之上,
依照顯示卡功能的不同繪圖模式還可以細分為下面的模式。
(1) 把螢幕分成 320×200 個像點,就是水平 320 個像點,垂直 200 個像點的解析 數位轉類
比
顯示記憶 體
度。
(2) 把螢幕分成 640×200 個像點的解析度。
(3) 把螢幕分成 640×350 個像點的解析度。
(4) 把螢幕分成 640×480 個像點的解析度。
(5) 把螢幕分成 640×600 個像點的解析度。
(6) 把螢幕分成 640×768 個像點的解析度。
其中的(1)~(4)項為 IBM PC /AT 的標準規格。而每一種解析度又可以分為不同 的顯示顏色數如同下圖。
解析度 顏色數 640×200 2 320×200 16 640×200 16 640×350 4 640×350 16 640×480 2 640×480 16 320×200 256 800×600 16 800×600 256 1024×768 16 1024×768 256 圖 2-10 繪圖模式
2.2.2.1
16 色顯示模式
在 IBM PC/AT 當中顏色是由 R、B、G、I,等是個元素共同組成的,因此,
我們可以將一格螢幕想像成如圖 pic.2-11 所示的結構。圖中一個畫面一分為四,每 一個像點由四個顯色面所組成。顯色面 0 代表藍色、顯色面 1 代表綠色、顯色面 2 代表紅色、顯色面 3 代表亮度。顯示卡的顯示轉換電路會將這 4 個面的電路一起 讀出,然後將之和成為一個顏色。在 16 色顯示模式下每一個像點要以 4 個位元(bit) 來表示其顏色(2^4=16) ,也即是每一個位元表示一個顯色面的資料。因此硬體的 設計很自然的把這四個顯色面得資料存在 4 組不同的記憶體中,每一組記憶體代 表一個顯色面,就如圖 pic.2-12 所示。這樣的設計可以使得硬體線路能同時對 4 組記憶體發出控制訊號,因而能在最短的時間內同時取出 4 個顯色面的資料加以 顯示,如此才能來的即顯像而不至於產生閃爍的現象。
(6) 選擇顯色面 2。
(7) 把紅色(R)資料寫入相關位址。
(8) 選擇顯色面 3。
(9) 把亮度(I)資料寫入相關位址。
但是為什麼 4 次寫入的動作都寫入相同的位址呢?那是因為顯示卡有一個電路 會依據我們所選擇的顯色面而把不同的色元素寫入不同的記憶體中,因此即使我 們把資料寫到相同的位址,但因為顯色面的不同,顯示卡會自動將之存入正確的 記憶體位址。
顯示卡
圖 2-13 顯示卡會依照顯色面選擇而將資料存入正確位址
前面講的步驟,在 TURBO C 中可以 outportb()和 memset()來完成:
步驟(1):outportb(0X03C4,0X02);準備做顯示記憶體輸出 (2):outportb(0X03C5,0X01); 選擇顯色面 0
(3):memset(ptr,B_DATA,1);將值存入 vedio ram (4):outportb(0X03C5,0X02); 選擇顯色面 1 (5):memset(ptr,G_DATA,1);將值存入 vedio ram (6):outportb(0X03C5,0X03); 選擇顯色面 2 (7):memset(ptr,R_DATA,1);將值存入 vedio ram (8):outportb(0X03C5,0X04); 選擇顯色面 3 (9):memset(ptr,I_DATA,1);將值存入 vedio ram 註:ptr 為指向 vedio ram 任一位址的指標。
註:B_DATE、G_DATE、R_DATE、I_DATE,則分別代表要送往顯色面 0、1、2、
3 的資料。
PC
資料
資 料 選 擇
G 資料 B 資料
R 資料
I 資料
I/O 位址 0X03C4 為顯示卡上的暫存器,其內容為 2 表示接下來要設定顯色面,
決定顯色面的暫存器位址為 0X3C5,它的位元 0 為 1 表示現在選擇顯色面 0、它的 位元 1 為 1 表示現在選擇顯色面 1、它的位元 2 為 1 表示現在選擇顯色面 2、它的 位元 3 為 1 表示現在選擇顯色面 3,就如下圖一般….
Bit 7 6 5 4 3 2 1 0 × × × × 位址 0x035C
控制顯色面 0 控制顯色面 1
控制顯色面 2
控制顯色面 3 圖 2-14 0x03C5 的各位元功能
在已經知道 16 色顯示模式的控制方法後,接下來就是要知道螢光幕上的像點 跟顯示記憶體的對映關係。
回想看看 16 色可以搭配許多不同的解析度如 320×200、640×200、640×350、
640×480 等等,由於它們的原理都相似,因此就以 640×480 為例,說明像點位址與 顯示記憶體的對映關係。
比如螢幕上第 45 列第 125 行的點它是對映到哪一個記憶體位址的第幾個 bit 呢?
因為每一列有 640 個 PIXEL,而每一個 PIXEL 的紅色資料、綠色資料、藍色 資料、亮度資料各用 1bit 表示。所以第 45 列第 125 行的點的紅色資料、綠色資料、
藍色資料、亮度資料的位址在 A000:0E1F(45×640+125 除與 8 的商是 3615,
46×640+125 除與 8 的餘是 15,3615 的 16 進位是 0E10,15 的 15 進位是 F) 。
2.2.2.2
256 色顯示模式
雖然 256 種顏色比 16 種顏色多但是我自己卻覺得 256 色比 16 色更容易懂。
PC 在這一種顯示模式下每一個點可以有 256 種顏色,正好是 2 的 8 次方。所以在 這個顯示模式下以一個 byte 來表示螢幕上的一個點是十分合理的想法。以 320×200 的 256 色顯示模式為例,因為螢幕上的一個像點由 1 個 byte 來表示它的顏色,所 以螢幕想點與記憶體是一對一的線性關係。比如螢幕上第 45 列第 125 行的點,它 在記憶體中的位址是 A000:70FD(45×640+125=28925=70FDH) 。而在 320×400 的 256 色顯示模式下整個螢幕的像點總共有 640×480 個像點,每一個像點 1byte 所以 共是 64KB 的大小。另外其實 256 模式下每一個點是由一 byte 來表示但是,這個 byte 的值其實是一個顏色索引值,在顯示卡中有一個顏色暫存器它有 256 個儲存
位置,每一個位置的大小是 3byte,每一個位置存的值代表真正的顏色值。舉例來