官术网_书友最值得收藏!

5 增加字體(harib02e)

雖然字符“A”顯示出來了,但這段程序只能顯示“A”而不能顯示別的字符。所以我們需要很多別的字體來顯示其他字符。英文字母就有26個,分別有大寫和小寫,還有10個數字,再加上各種符號肯定超過30個了。啊,還有很多,太麻煩了,所以我們決定沿用OSASK的字體數據。當然,我們暫時還不考慮顯示漢字什么的。這些復雜的東西,留待以后再做。現在我們集中精力解決字母顯示的問題。

另外,這里沿用的OSASK的字體,其作者不是筆者,而是平木敬太郎先生和圣人(Kiyoto)先生。事先已經從他們那里得到了使用許可權,所以可以自由使用這種字體。

我們這次就將hankaku.txt這個文本文件加入到我們的源程序大家庭中來。這個文件的內容如下:

hankaku.txt的內容

char 0x41
........
...**...
...**...
...**...
...**...
..*..*..
..*..*..
..*..*..
..*..*..
.******.
.*....*.
.*....*.
.*....*.
***..***
........
........

這比十六進制數和只有0和1的二進制數都容易看一些。

■■■■■

當然,這既不是C語言,也不是匯編語言,所以需要專用的編譯器。新做一個編譯器很麻煩,所以我們還是使用在制作OSASK時曾經用過的工具(makefont.exe)。說是編譯器,其實有點言過其實了,只不過是將上面這樣的文本文件(256個字符的字體文件)讀進來,然后輸出成16×256=4096字節的文件而已。

編譯后生成hankaku.bin文件,但僅有這個文件還不能與bootpack.obj連接,因為它不是目標(obj)文件。所以,還要加上連接所必需的接口信息,將它變成目標文件。這項工作由bin2obj.exe來完成。它的功能是將所給的文件自動轉換成目標程序,就像將源程序轉換成匯編那樣。也就是說,好像將下面這兩行程序編譯成了匯編:

_hankanku:
    DB各種數據(共4096字節)

當然,如果大家不喜歡現在這種字體的話,可以隨便修改hankaku.txt。本書的中心任務是自制操作系統,所以字體就由大家自己制作了。

各種工具的使用方法,請參閱Makefile的內容。因為不是很難,這里就不再說明了。

如果在C語言中使用這種字體數據,只需要寫上以下語句就可以了。

extern char hankaku[4096];

像這種在源程序以外準備的數據,都需要加上extern屬性。這樣,C編譯器就能夠知道它是外部數據,并在編譯時做出相應調整。

■■■■■

OSASK的字體數據,依照一般的ASCII字符編碼,含有256個字符。A的字符編碼是0x41,所以A的字體數據,放在自“hankaku+0x41 * 16”開始的16字節里。C語言中A的字符編碼可以用’A’來表示,正好可以用它來代替0x41,所以也可以寫成“hankaku +‘A' * 16”。

我們使用以上字體數據,向bootpack.c里添加了很多內容,請大家瀏覽一下。如果順利的話,會顯示出“ABC 123”。下面就來“make run”一下吧。很好,運行正常。

本次的HariMain的內容

void HariMain(void)
{
    struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0;
    extern char hankaku[4096];

    init_palette();
    init_screen(binfo->vram, binfo->scrnx, binfo->scrny);
    putfont8(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, hankaku + 'A' * 16);
    putfont8(binfo->vram, binfo->scrnx, 16, 8, COL8_FFFFFF, hankaku + 'B' * 16);
    putfont8(binfo->vram, binfo->scrnx, 24, 8, COL8_FFFFFF, hankaku + 'C' * 16);
    putfont8(binfo->vram, binfo->scrnx, 40, 8, COL8_FFFFFF, hankaku + '1' * 16);
    putfont8(binfo->vram, binfo->scrnx, 48, 8, COL8_FFFFFF, hankaku + '2' * 16);
    putfont8(binfo->vram, binfo->scrnx, 56, 8, COL8_FFFFFF, hankaku + '3' * 16);

    for (; ; ) {
    }
        io_hlt();
}
主站蜘蛛池模板: 麦盖提县| 灌云县| 海安县| 龙州县| 类乌齐县| 太仆寺旗| 合山市| 青铜峡市| 曲靖市| 始兴县| 澄迈县| 美姑县| 永安市| 宜春市| 盘山县| 大埔县| 九龙县| 宝清县| 多伦县| 沙洋县| 霍林郭勒市| 新晃| 东山县| 定边县| 庆安县| 顺昌县| 明溪县| 定远县| 宁化县| 武威市| 十堰市| 井冈山市| 泌阳县| 崇义县| 临西县| 大渡口区| 武宁县| 南汇区| 缙云县| 淮南市| 西昌市|