qemu使っていてOS自作入門の3日目やっててセクタなめるところで0x20エラーが出るとき-fdaオプションを使う #osdevjp

セクタ読み込む最初のコードで躓いた、なんか、うまく動いてない。 エラーコードがAHに入ってるみたいなのでAHに雑に0x30足して読めるASCII出るようにして表示してみる

ORG 0x7c00
; FAT12っぽい
JMP entry
DB  0x90
DB  "KONITIWA"    ; おなまえ、適当にかえてみた
DW  512           ; せくた
DB  1             ; くらすたは1
DW  1             ; FATがどこからはじまるか (1セクタ目
DB  2             ; FAT個数は2
DW  224           ; ルートディレクトリ領域、224エントリ
DW  2880          ; このドライブの大きさ、2880セクタ
DB  0xf0          ; メディアのタイプ、これは仕様あとで読むか
DW  9             ; FAT領域の長さは9セクタ
DW  18            ; 1トラック18セクタ
DW  2             ; ヘッドは2つ
DD  0             ; パーティションがないとき0(?)
DD  2880          ; このドライブの大きさをもう一度かく、大事なことなので二度言う感
DB  0, 0, 0x29    ; え、よくわからないけどこの値にしておくといいと書かれていてよく分からない!!
DD  0xffffffff    ; たぶんボリュームシリアル番号、ボリュームシリアル番号とは、たぶん、とは...
DB  "HANACHINOS!" ; ディスクの名前、11バイト
DB  "FAT12   "    ; フォーマットの名前8バイト

; RESB  18          ; RESBすると間が空くのか、ここ18かくと18バイトあく
; ↑うまくいかなかったのでここ参考に書き換え
; https://qiita.com/duloxetine/items/ce1fc1d861f0c3d33651
TIMES 18 DB 0

; ほんたい

entry:
  MOV AX, 0
  MOV SS, AX
  MOV SP, 0x7c00
  MOV DS, AX

read_sectors:
  MOV AX, 0x0820
  MOV ES, AX
  MOV CH, 0
  MOV DH, 0
  MOV CL, 2

  MOV AH, 0x02
  MOV AL, 1
  MOV BX, 0
  MOV DL, 0x00
  INT 0x13
  JC show_error

  MOV AL, 0x6F
  MOV AH, 0x0e
  MOV BX, 12
  INT 0x10

fin:
  HLT
  JMP fin

error:
  MOV SI, err_msg

show_error:
  ADD AH, 0x30
  MOV AL, AH
  MOV AH, 0x0e
  MOV BX, 12
  INT 0x10
  JMP fin

msg:
; あなたのCPUに話しかけています
DB  0x0a, 0x0a  ; 0x0a, 10は改行、覚えた
DB  "I love ruby <3 <3" ; <3、記号だけど出るのかな
DB  0x0a ; かいぎょ
DB  0 ; NULLしゅうたん?
; ほんたいおわり

err_msg:
DB  0x0a, 0x0a
DB  "error"
DB  0x0a ; かいぎょ
DB  0

; RESB 0x1fe-$ ;0x001feまで0うめ、なるほど-$
; ↑うまくいかなかったのでここ参考に書き換え
; https://qiita.com/duloxetine/items/ce1fc1d861f0c3d33651
TIMES 0x1fe-($-$$) DB 0

DB  0x55, 0xaa
; CPUへの伝言おわり

; ブートセクタ以外を埋めてる、のかな?

DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB  0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432

そうすると1文字Pが出てきた。 Pとは

% ruby -e 'p (?P.ord-0x30).to_s 16'
"20"

wikiで確認すると0x20は

0x20:コントローラ異常 oswiki.osask.jp

すごい雑に飛ばし読みしてたからかもしれないけど、これだとダメで

% nasm helloos2.nas && qemu-system-i386 helloos2

-fda オプションでフロッピーディスクとして渡すといいみたい

% nasm helloos2.nas && qemu-system-i386 -fda helloos2

それでは

いいなと思ったらKyashでお金を下さい
20191128011151
GitHubスポンサーも受け付けています
https://github.com/sponsors/hanachin/