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

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

前回までで、SBC6800にSBC-IOをつなげて、MC6821 PIA経由でSDカードを読めないかなぁという話を検討していました。

いきなりFAT32をフル実装するのはさすがに大変そうですが、SDカード上の TEST.STEST.HEX を読み込んで、ROMモニタのLOADにつなげられるとかなり便利そうです。

ということで、今回からSDカード読み取り機能の実装を始めました。ただし、いきなり実機のPIAにSDカードをつないで動かすのではなく、まずはエミュレータとテスト用FAT32イメージの土台を作るところからです。

まずは実機ではなくエミュレータから

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モードをまねたモデルを追加しました。対応したコマンドは CMD0CMD8CMD55ACMD41CMD58CMD17 だけです。

SDHCカードを初期化して、512バイトのsectorを1つ読むところまでであります。書き込みはまだやりません。FAT32のディレクトリをたどる処理も、まだROM側には入れていません。

テスト用FAT32イメージは作って捨てる

SDカードのテストというと .img ファイルを置きたくなりますが、今回はリポジトリには置かないことにしました。かわりに、Pythonで毎回同じFAT32っぽいfixtureを生成します。

  • MBRありFAT32
  • superfloppy形式のFAT32
  • 512 byte/sector
  • root directoryに TEST.STEST.HEXMULTI.BIN
  • MULTI.BIN5 -> 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につなげたいところです。

関連リンク

MC6800 ROMモニタSBC6800未分類