為了讓程式靈活點,作者覺得把什麼320x200這些資料直接寫入程式,不如讓程式自己獲取。
所以就引入了結構體,指標。用指標直接在記憶體中獲取這些資料
(如程式裡的這句:binfo_scrnx = (short *) 0xff4
;)。
對於結構體和指標我就不細寫了,有c語言基礎的人都知道。
因為已經進入了32位模式,所以不能再用bios寫好的中斷程式給我們輸出字元了,要手動了!
用畫素點描出圖形。
字元可以使用8x16的長方形畫素點來表示,轉變為16進製制就是這樣:
staticchar font_a[16] =;
有了這些內容,就可以使用for迴圈,來描繪字元了。
二維螢幕和一維的位址換算關係如下:
addr = 0xa0000 + x + y * 320
void putfont8(char *vram, int xsize, int x, int y, char c, char *font)//vram就是0xa0000 ,xsize就是320,然後x,y就是螢幕的座標。
for (i = 0; i < 16; i++)if ((d & 0x40) != 0)
if ((d & 0x20) != 0)
if ((d & 0x10) != 0)
if ((d & 0x08) != 0)
if ((d & 0x04) != 0)
if ((d & 0x02) != 0)
if ((d & 0x01) != 0)
}
0x80換成二進位制就是10000000
0x40 就是01000000 這個迴圈的意思就顯而易見了。
它就是判斷8位到底哪幾個位要列印。
比如: 11111000 先和100000000 進行與操作 那就是 10000000然後p[0]就被描繪上了顏色。
因為字串太多,自己乙個個設計過於麻煩,所以作者引入了乙個字型。 hankaku.txt
他通過編譯器編譯會產生二進位制檔案,和我們之前描述a的差不多,然後一共是4096個位元組。
那麼就可以在c語言裡使用這個檔案了 :
extern char hankaku[4096];
其中字元都是按照順序排列的,a這個字元位於第65個位置。我們知道每個位元組佔了16位
所以a就在hankaku[65*16]這裡開始! 也就是書上的0x41*16也就是 『a』*16
作者進一步封裝,寫了能處理字串的函式。
接著又介紹了 sprintf。
接下來畫出滑鼠的過程和上面如出一轍。
對於gdt,idt的介紹留到明天吧!
30天自製作業系統讀書筆記 六
首先先整理下 自谷月軒的部落格 現在我們擁有這麼9個檔案 恩,接下裡我們補坑。介紹下gdt和idt c語言描述 struct segment descriptor 我們知道現在段位址是32位的。在這個結構裡用base表示,但是它分成了3段 low 2位元組 mid 1位元組 high 1位元組 剛好...
30天自製作業系統讀書筆記 一
剛開始作者叫我們用二進位制編輯器,手敲01 寫了個img 磁碟映像檔案 並提供了一些檔案 run.bat,install.bat這些乙個批處理檔案,其實就是寫好了cmd指令儲存到文件裡面,方便以後執行。其中run.bat裡面的指令是這樣的 copy helloos.img z tools qemu ...
30天自製作業系統
第一天的內容很少,是一些簡單的基礎知識,在這裡我就沒有必要寫出來了,只說出大概的輪廓了,然後我會對其中的幾點進行詳細的解釋。文章的第一天的輪廓大概是這樣的,作者首先用二進位制編輯器做了乙個顯示二進位制的程式,然後用彙編完全db的形式,後又進行改善,最後以比較標準的組合語言編寫,但程式主體部分還沒有翻...