MC6800 ROMモニタ自作 その15 〜PIA経由でSDカードのsectorを読む〜

MC6800 ROMモニタMC6800 ROMモニタ自作 その15 〜PIA経由でSDカードのsectorを読む〜

前回は、SDカード実装のためにエミュレータ側へMC6821 PIAとSDカードモデルを追加しました。今回はその続きです。いよいよROMモニタ側に、PIA経由でSDカードを読む処理を入れていきます。

ただし、ここはまだ実機確認ではありません。今回の記事で「読めた」と書いているのは、エミュレータ上のMC6821 PIAモデルとSDカードモデルを使った確認です。SBC-IO実機にSDカードをつないで、電気的に動いたという話は次の段階になります。

実機で確認する前に、ROM側のロジックをできるだけ切り分けておきたい。そんな位置づけの回です。

とはいえ、いきなり DIRLOAD まで行くと、どこで壊れたのか分からなくなりそうです。なので今回は、SDHC初期化、sector read、FAT32 BPB、FAT chainという順番で段階を刻みました。

まずはSDHCのsector read

PIAのPort Bを使って、SPIっぽく SCLKMOSIMISOCS を動かします。SDカード側はSDHC前提にしたので、CMD17 の引数はbyte addressではなく、512バイトsectorのLBA番号として扱います。

dummy clocks
CMD0
CMD8
CMD55 + ACMD41
CMD58
CMD17

FAT32のBPBを読む

sectorが読めるようになったら、次はFAT32の入口です。LBA0がそのままBPBになっているsuperfloppy形式と、MBRのpartition entryからFAT32 volumeが始まる形式の両方に対応しました。

FAT chainと8.3ファイル検索

ここでようやく、root directoryを読み、8.3ファイル名を探し、FAT chainをたどってファイル内容を読めるようになります。対象はroot directoryの8.3 short filenameだけです。LFN、subdirectory、volume label、削除entryはスキップします。

cluster 5 -> cluster 6 -> EOC

テストはエミュレータで積み上げる

make bin
$env:REQUIRE_BUILD_ROM='1'; python tests/test_smoke.py
python tests/test_sd_fixture.py

実装としては地味です。画面に新しいコマンドが出るわけでもありません。でも、ここができていないと、次の DIRLF が全部あやしくなります。

関連リンク

MC6800 ROMモニタSBC6800