2014年9月17日水曜日

[OS作成]30日でできる!OS自作入門 3日目 (2)

ファイル読み込みに失敗したら、最大5回リトライする処理。
読み込み失敗時は、ディスクシステムのリセットをするのがポイント。

最大リトライ回数の定義に、.setディレクティブを使ってみた。

変更部分は以下の通り。
// プログラム
 .set MAX_RETRY, 5 # 再読み込み最大回数

entry:
 movw $0, %ax
 movw %ax, %ss
 movw $0x7C00, %sp
 movw %ax, %ds

 // 2セクタから1セクタ分読み込む
 movw $0x0820, %ax
 movw %ax, %es
 movb $0, %ch  # シリンダ0
 movb $0, %dh  # ヘッド0
 movb $2, %cl  # セクタ2

 movw $0, %si  # 失敗回数

retry:
 movb $0x02, %ah # Read sector(s) into memory
 movb $1, %al  # 1セクタ読み込む
 movw $0, %bx  # ES:BX Data buffer(0x8200に読み込む)
 movb $0x00, %dl # Aドライブ
 int $0x13  # BIOS interrupt call
 jnc fin  # 読み込みOK でfinへ

 add $1, %si
 cmp MAX_RETRY, %si
 jae error  # SI >= MAX_RETRY でerrorへ

 movb $0x00, %ah # Reset disk system
 movb $0x00, %dl # Aドライブ
 int $0x13
 jmp retry

fin:
 hlt
 jmp fin

一応、うまく動作しているようだ。