MC6800 ROMモニタ自作 その17 ~SBC-IO実機でSDカードからLOADする~

前回までは、SDカード読み取り機能をエミュレータ上で確認していました。今回はいよいよ実機です。SBC6800にSBC-IOをつないで、MC6821 PIAを挿して、市販のmicroSD SPIモジュールをつなぎました。
結論から言うと、実機でSDカード上の HELLO.S をLOADして実行できました。さらに、もう少し大きい MICBAS13.S もSDカードからLOADして、BASICを起動するところまで行けました。

まずはDIRが見えた、でもLFは失敗
PIAのアドレスは、今回の実機では $8050 で見えました。Port Bにつないだ以前つくったLED確認ボードでLEDチカチカさせてPIAアクセスを確認したあと、SDカードモジュール(Amazonでかったやつ)をつなぎました。
最初は DIR(ディレクトリ表示コマンド) が ? で戻りました。
戻りエラーを確認するとSD_ERROR=$02 / FAT_ERROR=$01 だったので、FAT以前のSD初期化で失敗していると見ました。SPIのMISOサンプリングをSCLK High後に読むようにタイミングを見直しのプログラム修正を実施、さらにMISOラインを10kΩでVccへプルアップしたところ、DIR が表示できました!!
やった!!!!

ここで HELLO.S、MICBAS13.HEX、MICBAS13.S、VTL.HEX が見えています。SD初期化、FAT32 mount、root directory readまでは実機で動いています。ただし、まだ LF HELLO.S のロードコマンドは失敗していました。

SecPerClus=6だった
DIR は読めるので、FAT32のBPBは読めています。内部変数をdumpすると、実カードは FAT_SEC_PER_CLUS=$06 でした。それまでの実装は SecPerClus=1 前提(つまり、1クラスターあたり1セクターという前提にしていた)が残っていて、file clusterのLBA計算がずれていました。
data_start + (cluster - 2) * FAT_SEC_PER_CLUS
そこで、ちゃんとした上記計算に直したところ、HELLO.S が読めました!!!

大きいファイルも読む
HELLO.S は512 byte以内に収まる小さいファイルです。次に読みたい MICBAS13.S は512 byteを超えます。そこで、cluster内の複数sectorを順に読む必要があります。 FAT_SECTOR_IN_CLUS という状態変数を追加しました。
また、S-RecordローダはBレジスタにデータ残数カウンタを持ったまま1文字入力を呼んでいました。FAT入力側でもACIA入力と同じようにBレジスタを保存する必要がありました。よくあるハマりですね。

上記のように、LF MICBAS13.SでBASICプログラムをロードしたあとに G1000 でBASICが起動し、PRINT "HELLO SD!!!" のプログラムを実行できました。
SDカードからBASICをLOADして動かせたわけです!!!
今回の到達点
SBC-IO上のMC6821 PIAを使って、実機でFAT32 root上の8.3 S-Recordを LF できました。小さい HELLO.S だけでなく、BASICのような大きめファイルも読めました。
まだ read-only、root directoryのみ、8.3 filenameのみ、SDHC / FAT32 / 512 byte sector前提です。SAVE/write、subdirectory、LFN、AUTOEXECはこれからです。それでも、SBC6800実機がSDカードからファイルを読んで、BASICまで起動できるところまで来ました。
やったぜ~♪
関連リンク
- Issue #54: https://github.com/kuninet/mc6800-rom-monitor/issues/54
- PR #64: https://github.com/kuninet/mc6800-rom-monitor/pull/64
- Issue #65: https://github.com/kuninet/mc6800-rom-monitor/issues/65
- PR #67: https://github.com/kuninet/mc6800-rom-monitor/pull/67
- Issue #66: https://github.com/kuninet/mc6800-rom-monitor/issues/66
- PR #68: https://github.com/kuninet/mc6800-rom-monitor/pull/68
- PR #69: https://github.com/kuninet/mc6800-rom-monitor/pull/69
- SBC-IO Rev02: https://sbc738827564.wordpress.com/2018/08/11/sbc-io-rev02/
- ChaN氏 MMC/SDC SPI解説: https://elm-chan.org/docs/mmc/mmc.html