MC6800 ROMモニタ自作 その14 〜SDカード読み取り実装をはじめました〜

前回までで、SBC6800にSBC-IOをつなげて、MC6821 PIA経由でSDカードを読めないかなぁという話を検討していました。
いきなりFAT32をフル実装するのはさすがに大変そうですが、SDカード上の TEST.S や TEST.HEX を読み込んで、ROMモニタのLOADにつなげられるとかなり便利そうです。
ということで、今回からSDカード読み取り機能の実装を始めました。ただし、いきなり実機のPIAにSDカードをつないで動かすのではなく、まずはエミュレータとテスト用FAT32イメージの土台を作るところからです。
- Issue #48: https://github.com/kuninet/mc6800-rom-monitor/issues/48
- PR #58: https://github.com/kuninet/mc6800-rom-monitor/pull/58
まずは実機ではなくエミュレータから
SDカードまわりは、ハマりどころが多そうです。SDカードの初期化が悪いのか、SPIのクロックが悪いのか、PIAのbit割り当てが悪いのか、FAT32の読み方が悪いのか。全部を実機上で一気に試すと、たぶん原因切り分けで時間が溶けます。
なので、まずはエミュレータに最小限のMC6821 PIAを追加しました。今回のPIAアドレスは、まだ実機SBC-IOの最終決定ではなく、エミュレータ上の暫定値として $8050-$8053 にしています。
| 信号 | bit | 値 |
| SCLK | bit 0 | $01 |
| MOSI | bit 1 | $02 |
| MISO | bit 2 | $04 |
| CS | bit 3 | $08 |
MC6821 PIA全体をきっちり再現したわけではなく、今回はDDRとPort Bの読み書きができれば十分、という割り切りです。
SDカードモデルも最小限
PIAの先には、SDカードのSPIモードをまねたモデルを追加しました。対応したコマンドは CMD0、CMD8、CMD55、ACMD41、CMD58、CMD17 だけです。
SDHCカードを初期化して、512バイトのsectorを1つ読むところまでであります。書き込みはまだやりません。FAT32のディレクトリをたどる処理も、まだROM側には入れていません。
テスト用FAT32イメージは作って捨てる
SDカードのテストというと .img ファイルを置きたくなりますが、今回はリポジトリには置かないことにしました。かわりに、Pythonで毎回同じFAT32っぽいfixtureを生成します。
- MBRありFAT32
- superfloppy形式のFAT32
- 512 byte/sector
- root directoryに
TEST.S、TEST.HEX、MULTI.BIN MULTI.BINは5 -> 6 -> EOCの2 cluster chain
PIA経由でもsectorが読めるところまで
今回追加したテストでは、SDカードモデルを直接叩くだけではなく、PIAのPort Bをbit-bangして同じsectorが読めるところまで確認しています。
- MBRありfixtureのMBR/BPB/root/FAT chain確認
- superfloppy fixtureのBPB/root/FAT chain確認
- SDモデル単体で
CMD0,CMD8,CMD55,ACMD41,CMD58,CMD17を確認 - CS解放時に未消費レスポンスが残らないことを確認
- PIA bit-bang経由で既知の512 byte sectorを読む
既存のROMモニタにはまだ影響なし
今回、エミュレータには --sd オプションを追加しました。--sd を指定したときだけSDカードイメージを接続します。指定しない場合は、いままでどおりACIA中心のエミュレータとして動きます。
make bin
$env:REQUIRE_BUILD_ROM='1'; python tests/test_smoke.py
python tests/test_sd_fixture.py
結果は、既存の test_smoke.py が18件成功、新しく追加した test_sd_fixture.py が5件成功でした。
次はROM側から読む
次は、このエミュレータとfixtureを使って、ROM側のSDカード初期化とsector readに進む予定です。最初の目標は、FAT32を全部どうこうするよりも、まず固定sectorを読めること。そこからBPBを読み、root directoryを読み、最終的には DIR 表示と LF TEST.S みたいなLOADにつなげたいところです。