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

MC6800 ROMモニタ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.SMICBAS13.HEXMICBAS13.SVTL.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まで起動できるところまで来ました。

やったぜ~♪

関連リンク

MC6800 ROMモニタSBC6800