- rentan_org
- 2090
- 6
- 3
- 0
#X68000 のブート処理、IPL ROMがディスク先頭のブートセクタを$002000~に読んで実行することは書籍に書いてあるが、そのブートセクタの処理内容がどうなっているのかを調べてみた
2022-12-11 13:21:49まずは手元の起動可能なFDイメージからブートセクタを抜き出す。XDFファイルなら dd if=イメージファイル of=bootsect.r bs=1024 count=1 DIMファイルの場合は先頭256バイトにヘッダがあるのでこれもスキップ
2022-12-11 13:21:50ファイルをエミュレータ上に持ち込んで、おもむろにdis.xで逆アセンブル dis bootsect.r bootsect.s 拡張子を.Rにしたのはヘッダなしのベタイメージをそのまま解釈してもらうため。もうこれだけでいい感じの逆アセンブルリストが。dis.x様様。
2022-12-11 13:21:50処理の流れはこんな感じ: 1. IOCS _BOOTINFで起動ドライブの情報を取得 2. FATのルートディレクトリの先頭セクタをIOCS _B_READで読む 3. 1セクタに含まれる32個分のディレクトリエントリから、human.sysというファイルを探す(case insensitive)
2022-12-11 13:21:504. 見つかったディレクトリエントリ内の、ファイルの先頭クラスタ番号を得てセクタ番号に変換 5. ファイル先頭の1セクタを_B_READで読む 6. ヘッダがX68kの実行ファイルであることを確認(先頭2バイトが'HU') 7. ロード先固定形式(Zファイル)でロードアドレスが$006800であることを確認
2022-12-11 13:21:518. 実行開始アドレス、text,data,bss領域のサイズを取得 9. IOCS _B_READで$0067c0~にtext+data+$40バイトを読む(実行ファイルヘッダも込みで読む) 10. bss領域を0でクリア 11. ヘッダに書かれている実行開始アドレスへジャンプ …以上
2022-12-11 13:21:51つまりブートセクタから起動可能なイメージの条件は ・ルートディレクトリの先頭から32個以内のエントリにあるhuman.sysというファイルで、内容が連続したセクタに置かれている ・ロード先固定形式でロードアドレスが$006800 なのでSYS.Xでファイル転送すると前者を満たしてくれるはず
2022-12-11 13:21:51久しぶりにエミュレータを引っ張り出して、20年ぶりくらいに68000アセンブラを読んだ気がする 昔はこんなことばっかりやってたなあw
2022-12-11 13:21:51