OrzMicrokernel video.asm 切換顯示模式的註解
依照 Orz Microkernel 在 main.asm 的核心啟動流程來看,在轉換到保護模式並做了最基本的初始化之後,就會 call SetVideoMode 來切換顯示模式到 320x200。關於這部份,比較複雜的是牽涉到 BIOS 中斷,由於在保護模式之下無法使用 BIOS INT,所以特別額外在 realmode.asm 寫了在保護模式下處理此類中斷的呼叫函式﹝關於 realmode.asm 的註解日後補上﹞。
程式碼和詳細註解:
後記
從現在開始,我們將會慢慢感受到 Protect Mode 的複雜度,這也是作業系統核心設計最無聊煩悶的起步 :)
程式碼和詳細註解:
;------------------------------------------------------------------------------
; 文字模式﹝80x25,16色﹞:AL=0
; 圖形模式﹝320x200,256色﹞:AL=1
SetVideoMode:
and al, al
jnz SetVideoMode0 ; 若 AL 不為 0 則呼叫 SetVideoMode0
mov [rmode_ax], WORD 0x03 ; 文字模式
mov al, 0x10 ; 中斷 10H
; 在保護模式下舊有的中斷向量表已被 IDT 代替
; 導致 BIOS 中斷在保護模式下無法使用
; 故 BIOS 中斷得在真實模式執行
; 因此特別在 realmode.asm 中設計一個處理真實模式中斷的函式
jmp RmodeInt ; 呼叫在 realmode.asm 的 RmodeInt 處理中斷
SetVideoMode0:
dec al ; AL=AL-1
jnz SetVideoMode1 ; 若 AL 不為 0 則呼叫 SetVideoMode1 返回
mov [rmode_ax], WORD 0x13 ; 圖形模式
mov al, 0x10 ; 中斷 10H
jmp RmodeInt ; 呼叫在 realmode.asm 的 RmodeInt 處理中斷
SetVideoMode1:
ret
後記
從現在開始,我們將會慢慢感受到 Protect Mode 的複雜度,這也是作業系統核心設計最無聊煩悶的起步 :)
Thanks!
回覆刪除補充,何以 SetVideoMode 僅處理 320x200 的低解析度呢?因為考慮到使用 qemu 作為模擬環境,不希望因此佔用過多畫面輸出,導致開發不便。