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

前回は、SDカード実装のためにエミュレータ側へMC6821 PIAとSDカードモデルを追加しました。今回はその続きです。いよいよROMモニタ側に、PIA経由でSDカードを読む処理を入れていきます。
ただし、ここはまだ実機確認ではありません。今回の記事で「読めた」と書いているのは、エミュレータ上のMC6821 PIAモデルとSDカードモデルを使った確認です。SBC-IO実機にSDカードをつないで、電気的に動いたという話は次の段階になります。
実機で確認する前に、ROM側のロジックをできるだけ切り分けておきたい。そんな位置づけの回です。
とはいえ、いきなり DIR や LOAD まで行くと、どこで壊れたのか分からなくなりそうです。なので今回は、SDHC初期化、sector read、FAT32 BPB、FAT chainという順番で段階を刻みました。
まずはSDHCのsector read

PIAのPort Bを使って、SPIっぽく SCLK、MOSI、MISO、CS を動かします。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
実装としては地味です。画面に新しいコマンドが出るわけでもありません。でも、ここができていないと、次の DIR や LF が全部あやしくなります。