MC6800 ROMモニタ自作 その22 ~ROM FATを標準profileから外した~

最近、ROMモニタのVDG表示とか、SDFS/68とか、いろいろ同時に進んでいます。
ROMモニタ単体としては、メモリを見る、書く、実行する、ブレークする、という低レベルの道具にしておきたい。
一方で、SDカード上のファイル一覧を見たり、ファイルをロードしたり、RUN HELLO.S したりするのは、SDFS/68側へ寄せたい。
このへんの棲み分けをだんだん整理しているところです。
3KB空いてるのに1.1KB?
今回のきっかけはROM容量の話でした。
VDGへの出力を入れて、VDGTEST と KEYTEST をROMから外してSD上の診断プログラムへ移して、少しROMが空きました。
そこで、今どのくらい空いているのかを見ていました。
sbcio_vdg と k6802_vdg は、VDG表示とキーボードとBOOTが入っているので、だいたい3KBちょっと空いていました。
おお、けっこう空いた。
と思ったのですが、sbcio profileだけは1.1KBくらいしか空いていません。
うーむ。
なんで?
と思ったら、sbcio profileだけROM常駐FATをまだ持っていたのでした。
`sbcio:
FEATURE_SD=1
FEATURE_FAT=1`
つまり、ROM側に DIR と LF がまだ入っている。
そりゃ重いです。
そもそもROMにFATを置き続けるのか
最初にSDカードを読めるようにしたころは、ROMモニタから直接 DIR と LF ができるのはかなり便利でした。
`] DIR
HELLO.S A 00000052
] LF HELLO.S
OK`
これはこれで、実機PoCとしてはすばらしかったです。
ただ、今はSDFS/68があります。
ROMの BOOT は、fixed LBAからstage1を読みます。stage1がFAT rootの SDFS.BIN を探して、SDFS/68を起動します。そこから先は SDFS> の世界です。
`] BOOT
SDFS/68 V1.2
SDFS> DIR
SDFS> LOAD HELLO.S
SDFS> RUN HELLO.S`
こうなってくると、ROMにFAT32のroot走査やcluster chainやファイルロード処理を抱え続けるのは、ちょっと違う気がしてきます。
ROMは救命具でいいのです。
メモリを見る。書く。実行する。ブレークする。どうしようもなくなったらROMへ戻る。
DOSっぽいことはSDFS/68へ渡す。
そう考えると、sbcio profileだけROM FATを残しているのが、だんだん変に見えてきました。
profileの意味を揃える
そこで、標準profileの意味をこう揃えることにしました。
`base:
SDなし
FATなし
sbcio:
SBC-IO RAM拡張
2nd ACIAキーボード
SDなし
FATなし
sbcio_vdg:
SBC-IO
VDG
2nd ACIAキーボード
raw SD BOOTあり
FATなし
k6802_vdg:
K6802-SBC向け
VDG
2nd ACIAキーボード
raw SD BOOTあり
FATなし`
base と sbcio は、SDなしのROMモニタ。
VDG付きの sbcio_vdg と k6802_vdg は、SDからSDFS/68を起動できるROMモニタ。
このほうが分かりやすいです。
sbcio は「SBC-IOがあるからSDもある」という意味ではなく、SBC-IOのRAM拡張と2nd ACIAを使うprofile、という位置づけです。
ROM FATは消したわけではない
ただし、ROM常駐FATのコードそのものを削除したわけではありません。
過去互換や確認のために、直接指定ではまだビルドできます。
`MONITOR_PROFILE=sbcio \
FEATURE_SD=1 \
FEATURE_FAT=1 \
BUILD_CONFIG_NAME=axis-sbcio-fat \
make bin`
これは axis-sbcio-fat みたいな、明示的な互換構成です。
標準profileからは外す。でも、コードとテスト経路は残す。
いきなり消すのはちょっと怖いですし、過去の実機PoCの確認にも使えます。
このへんは、ちょうどよい落としどころかなと思っています。
HとMAPの見え方が変わる
この変更で、標準の sbcio ROMでは H の表示から DIR、LF、BOOT が消えます。
`] H
D M MAP RAMTEST G L B C R U H F
]`
MAP からも SD C000 が消えます。
`] MAP
MAP SBCIO
RAM 0000-7FFF
USER 0000-7FFF
WORK C000-DFFF
MON C200
MIK C300
STK DFFF
KEY 8094-8095
ROM E000-FFFF
]`
これで、表示から見ても「このROMはSDを持っていない」と分かります。
前は sbcio だと SD C000 が出て、DIR と LF も出ていました。
でも、今後の本線ではそこをSDFS/68へ寄せたいので、標準profileとしてはこの表示のほうが正直です。
空き容量を記録する
今回は、PRの中でROM空き容量もちゃんと記録しておきました。
こういうのは、会話の中だけで「だいたい3KB」と言っていると、あとで分からなくなります。
listingで org VEC_IRQ が始まる $FFF8 の直前までを、追加可能領域として数えました。
結果はこうです。
`base 4312 bytes
sbcio 4266 bytes
sbcio_vdg 3168 bytes
k6802_vdg 3154 bytes
sbcio + ROM FAT互換 1138 bytes`
おお。
sbcio が一気に4.2KB空きになりました。
ROM FATありの直接指定互換構成では1.1KBなので、やっぱりFATが大きいです。
8KB ROMの中でFAT32を読む、というのは、それだけでかなり重いんですよね。
MC6800としてはよくがんばっていると思いますが、VDGやキーボードやI2Cを入れたいとなると、ROMにFATを抱え続けるのはつらい。
テストも少し直した
テスト側も、少し直しました。
今までは sbcio という名前を見ると、SDあり、FATあり、と判断しているところがありました。
でも、もうそれは違います。
なので、テスト側も FEATURE_SD と FEATURE_FAT をちゃんと見るようにしました。
標準 sbcio では、SD系コマンドが ? になることを確認します。
`] DIR
?
] LF TEST.S
?`
一方で、直接指定の FEATURE_SD=1 FEATURE_FAT=1 では、従来のROM FAT fixtureが通ることも確認しました。
標準profileはすっきりさせる。でも、互換構成のテストは残す。
ここも大事です。
PRとIssue
今回の作業はIssue #177、PR #178です。
PR #176でROM容量削減を見たあと、sbcio だけ空きが少ない理由が見えてきたので、そのまま #177 として切りました。
やったことは地味です。
MakefileのsbciopresetをFEATURE_SD=0/FEATURE_FAT=0にする。- ドキュメントの
sbcio説明を直す。 tests/test_smoke.pyとtests/test_sd_fixture.pyのfeature判定を直す。docs/plans/issue-177_sbcio_profile_cleanup.mdに判断とROM空き容量を残す。
でも、地味なわりに効きます。
ROM容量が空いたことも大きいですが、それ以上に「標準profileで何ができるのか」が分かりやすくなりました。
次はどうするか
これで、ROM側のFATは標準profileから外れました。
なので、SDカード上のファイル操作は、ますますSDFS/68側で育てる流れになります。
SDFS/68 V1.3でサブフォルダを少しだけやるか。
それとも、VDGとキーボードを進めて、PCなしでROMモニタを触れるところへ寄せるか。
うーむ。
どっちもやりたいですね。
今回の整理でROM側には少し余裕ができました。sbcio_vdg / k6802_vdg でも3KBちょっと残っています。
これなら、VDGコンソールやキーボード入力の続きを進める余地はありそうです。
ただ、油断するとすぐ埋まるのが8KB ROMです。
FATが大きいことはよく分かったので、これからは「ROMに置くべきもの」と「SDFS/68へ渡すもの」を、もう少し意識して進めていこうと思います。