書名: 30天自制操作系統(tǒng)作者名: (日)川合秀實本章字?jǐn)?shù): 880字更新時間: 2020-03-11 14:01:47
4 顯示字符(harib02d)
內(nèi)部的處理差不多了,我們還是將重點放回到外部顯示上來吧。到昨天為止,我們算是畫出了一幅稍微像樣的畫,今天就來在畫面上寫字。以前我們顯示字符主要靠調(diào)用BIOS函數(shù),但這次是32位模式,不能再依賴BIOS了,只能自力更生。
那么怎么顯示字符呢?字符可以用8×16的長方形像素點陣來表示。想象一個下圖左邊的數(shù)據(jù),然后按下圖右邊所示的方法置換成0和1,這個方法好像不錯。然后根據(jù)這些數(shù)據(jù)在畫面上打上點就肯定能顯示出字符了。8“位”是一個字節(jié),而1個字符是16個字節(jié)。

大家可能會有各種想法,比如“我覺得8×16的字太小了,想顯示得更大一些”、“還是小點兒的字好”等。不過剛開始我們就先這樣吧,一上來要求太多的話,就沒有辦法往前進(jìn)展了。
■■■■■
像這種描畫文字形狀的數(shù)據(jù)稱為字體(font)數(shù)據(jù),那這種字體數(shù)據(jù)是怎樣寫到程序里的呢?有一種臨時方案:
static char font_A[16] = { 0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00 };
其實這僅僅是將剛才的0和1的排列,重寫成十六進(jìn)制數(shù)而已。C語言無法用二進(jìn)制數(shù)記錄數(shù)據(jù),只能寫成十六進(jìn)制或八進(jìn)制。嗯,讀起來真費勁呀。嫌字體不好看,想手動修正一下,都不知道到底需要修改哪兒。但是暫時就先這樣吧,以后再考慮這個問題。
數(shù)據(jù)齊備之后,只要描畫到畫面上就可以了。用for語句將畫8個像素的程序循環(huán)16遍,就可以顯示出一個字符了。于是我們制作了下面這個函數(shù)。
void putfont8(char *vram, int xsize, int x, int y, char c, char *font) { int i; char d; /* data */ for (i = 0; i < 16; i++) { d = font[i]; if ((d & 0x80) ! = 0) { vram[(y + i) * xsize + x + 0] = c; } if ((d & 0x40) ! = 0) { vram[(y + i) * xsize + x + 1] = c; } if ((d & 0x20) ! = 0) { vram[(y + i) * xsize + x + 2] = c; } if ((d & 0x10) ! = 0) { vram[(y + i) * xsize + x + 3] = c; } if ((d & 0x08) ! = 0) { vram[(y + i) * xsize + x + 4] = c; } if ((d & 0x04) ! = 0) { vram[(y + i) * xsize + x + 5] = c; } if ((d & 0x02) ! = 0) { vram[(y + i) * xsize + x + 6] = c; } if ((d & 0x01) ! = 0) { vram[(y + i) * xsize + x + 7] = c; } } return; }
if語句是第一次登場,我們來介紹一下。if語句先檢查“()”內(nèi)的條件式,當(dāng)條件成立時,就執(zhí)行“{}”內(nèi)的語句,條件不成立時,什么都不做。
&是以前曾出現(xiàn)過的AND(“與”)運算符。0x80也就是二進(jìn)制數(shù)10000000,它與d進(jìn)行“與”運算的結(jié)果如果是0,就說明d的最左邊一位是0。反之,如果結(jié)果不是0,則d的最左邊一位就是1。“! =”是不等于的意思,在其他語言中,有時寫作“<>”。
■■■■■
雖然這樣也能顯示出“A”來,但還是把程序稍微整理一下比較好,因為現(xiàn)在的程序又長運行速度又慢。
void putfont8(char *vram, int xsize, int x, int y, char c, char *font) { int i; char *p, d /* data */; for (i = 0; i < 16; i++) { p = vram + (y + i) * xsize + x; d = font[i]; if ((d & 0x80) ! = 0) { p[0] = c; } if ((d & 0x40) ! = 0) { p[1] = c; } if ((d & 0x20) ! = 0) { p[2] = c; } if ((d & 0x10) ! = 0) { p[3] = c; } if ((d & 0x08) ! = 0) { p[4] = c; } if ((d & 0x04) ! = 0) { p[5] = c; } if ((d & 0x02) ! = 0) { p[6] = c; } if ((d & 0x01) ! = 0) { p[7] = c; } } return; }
這樣就好多了,我們就用這段程序吧。
下面將這段程序嵌入到bootpack.c中進(jìn)行整理。大家仔細(xì)看看,如果順利的話,能顯示出字符“A”。緊張激動的時刻到了,運行“make run”。哦,“A”顯示出來了!

- 鴻蒙生態(tài):開啟萬物互聯(lián)的智慧新時代
- Learning Android Intents
- 無蘋果不生活 OS X Mountain Lion隨身寶典
- Extending Puppet
- Windows Phone應(yīng)用程序開發(fā)
- Windows 7案例教程
- VMware NSX Cookbook
- Linux基礎(chǔ)使用與案例
- 精解Windows 10
- Windows 7實戰(zhàn)從入門到精通
- Learn CUDA Programming
- Linux網(wǎng)絡(luò)配置與安全管理
- Heroku Cloud Application Development
- UI設(shè)計手繪表現(xiàn)從入門到精通
- Linux應(yīng)用大全 基礎(chǔ)與管理