メモ:「30日でできる!OS自作入門 」3日目


IPL - Initial Program Loader (初期プログラムローダー)

MBRから次のセクタを読む

MOV AX, 0x820
MOV ES, AX ; Buffer
MOV CH, 0 ; Cylinder 0
MOV DH, 0 ; Head 0
MOV CL, 2 ; Sector 0

MOV AH, 2 ; Disk Read, 3 write, 4 verify, 0x0c seek
MOV AL, 1 ; sector count 1
MOV BX, 0
MOV DL, 0 ; A drive
INT 0x13 ; Disk BIOS Call
JC error

JC = Jump if carry
ES:BX = ES x 16 + BX

Retry 処理追加

MOV SI, 0
retry:
  ....
  ADD SI, 1
  CMP SI, 5
  JAE error ; 5回以上はエラー
  MOV AH, 0
  MOV DL, 0
  INT 0x13
  JMP retry

18 セクタ読む

readloop:
...
JNC next ; 読み取りOKなら、次のセクタ
...
next:
  MOV AX, ES
  ADD AX, 0x200 ; 1セクタ 512 バイト
  MOV ES, AX ; ES += 512
  ADD CL, 1
  CMP CL, 18
  JBE readloop

ヘッド2つ分とシリンダ10個分読む

CYLS EQU 10

....
JBE readloop
MOV CL, 1
ADD DH, 1
CMP DH, 2
JB readloop
MOV DH, 0
ADD CH, 1
CMP CH, CYLS
JB readloop

harib00e の ipl.nas と haribote.nas で haribote.imgを作成

  • 0x2600 で HARIBOTESYS というファイル名
  • 0x4200 で ファイルの中身

harib00f

  • ORG 0xc200 を指定して、 IPL から 0xc200 に JMP

harib00g - Video Mode

MOV AL, 0x13 ; VGA, 320x200x8bit
MOV AH, 0
INT 0x10

これで真っ黒な画面を出すことが出来ました

qemu-system-i386 -drive format=raw,file=haribote.img,index=0,if=floppy

0x13 と 0x6a で qemu の画面サイズが変わることを確認

32bit mode

  • 32bit モードでは BIOSは利用できない(初めて知った)

    VMODE EQU 0xff2
    SCRNX EQU 0xff4
    SCRNY EQU 0xff6
    VRAM EQU 0xff8

    MOV BYTE [VMODE], 8
    MOV WORD [SCRNX], 320
    MOV WORD [SCRNY], 200
    MOV DWORD [VRAM], 0xa0000

LED の状態を取得

LEDS EQU 0xff1

MOV AH, 2
INT 0x16
MOV [LEDS], AL

C言語導入

  • harib00i

cc1 → gocc1plus (c to gas compiler)
gas2nask (gas to nas compiler)
nask で (nas から obj)
obj2bim (obj からbim)

以下のエラーで遭遇

Warning : can't link _HariMain

bootpack.nas の __Z8HariMainv を _HariMain に手動で修正w

bim2hrb (bim to hrb)

copy /B asmhead.bin+bootpack.hrb haribote.sys を
cat asmhead.bin bootpack.hrb > haribote.sys に修正

qemuでBootできた!

  • harib00j は io_hlt という関数をアセンブリで書いて C から呼び出すだけ

io_hlt も manglingされてたので手動で修正

asmhead.nas にもいろいろ実装されてるがあまりみれていない。