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

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

最近、ROMモニタのVDG表示とか、SDFS/68とか、いろいろ同時に進んでいます。

ROMモニタ単体としては、メモリを見る、書く、実行する、ブレークする、という低レベルの道具にしておきたい。

一方で、SDカード上のファイル一覧を見たり、ファイルをロードしたり、RUN HELLO.S したりするのは、SDFS/68側へ寄せたい。

このへんの棲み分けをだんだん整理しているところです。

3KB空いてるのに1.1KB?

今回のきっかけはROM容量の話でした。

VDGへの出力を入れて、VDGTESTKEYTEST をROMから外してSD上の診断プログラムへ移して、少しROMが空きました。

そこで、今どのくらい空いているのかを見ていました。

sbcio_vdgk6802_vdg は、VDG表示とキーボードとBOOTが入っているので、だいたい3KBちょっと空いていました。

おお、けっこう空いた。

と思ったのですが、sbcio profileだけは1.1KBくらいしか空いていません。

うーむ。

なんで?

と思ったら、sbcio profileだけROM常駐FATをまだ持っていたのでした。

`sbcio:
  FEATURE_SD=1
  FEATURE_FAT=1`

つまり、ROM側に DIRLF がまだ入っている。

そりゃ重いです。

そもそもROMにFATを置き続けるのか

最初にSDカードを読めるようにしたころは、ROMモニタから直接 DIRLF ができるのはかなり便利でした。

`] 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なし`

basesbcio は、SDなしのROMモニタ。

VDG付きの sbcio_vdgk6802_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 の表示から DIRLFBOOT が消えます。

`] 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 が出て、DIRLF も出ていました。

でも、今後の本線ではそこを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_SDFEATURE_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 として切りました。

やったことは地味です。

  • Makefilesbcio presetを FEATURE_SD=0 / FEATURE_FAT=0 にする。
  • ドキュメントの sbcio 説明を直す。
  • tests/test_smoke.pytests/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へ渡すもの」を、もう少し意識して進めていこうと思います。

関連リンク

MC6800 ROMモニタSBC6800