MC6800 SDFS/68を作る その2 ~モニタではなく小さいDOSへ~

前回は、ROMからfixed LBAのstage1を読み、stage1がFAT rootの SDFS.BIN を起動するところまでを書きました。
SDFS/68 v1では、SDFS> L filename でS-RecordやIntel HEXをロードできます。
でも、ここで少し悩みが出てきました。
SDFS/68はROMモニタの延長なのか、それともDOSなのか、です。
LOADしてEXITしてG、はちょっと違う
最初は、SDFS/68側でファイルをロードして、実行したいときはROMモニタへ EXIT して、モニタ側の G コマンドで飛べばよいかな、と思っていました。
でも、実際の操作として考えると、ちょっと変な感じ。
`SDFS> L HELLO.S
OK
SDFS> EXIT
] G0200`
これは「SD上のDOSっぽいものを起動したのに、実行するためにモニタへ戻る」流れです。デバッグ時ならよいのですが、通常運用としてはカッコ悪い。
DOSっぽくするなら、ファイルを選んで実行する入口はSDFS/68側にあったほうがよさげ。
`SDFS> DIR
SDFS> RUN HELLO.S`
この方が自然ですネ。
役割を分ける
そこで、SDFS/68 v2へ進む前に、ROMモニタとSDFS/68の責務を分けることにしました。
ROMモニタとSDFS/68の責務分担
ざっくり言うとこうです。
- ROMモニタは、救命具、デバッガ、復旧口
- stage1は、SD/FATを読むboot services
- SDFS/68は、通常運用の小さい第2段DOS
- ユーザープログラムは、SDFS/68からロードして実行するもの
SDFS/68の中に、ROMモニタの M、B、C、R、U を全部入れるのはやめます。
モニタコマンドが使えると便利ですが、それをやるとSDFS/68がもう一個のモニタになってしまいます。RAMも食いますし、設計も濁ります。
低レベルデバッグがしたいときは、SDFS/68から EXIT してROMモニタへ戻る。これでよいことにしませう。
SDFS/68 v2でやること
v2では、UARTコンソール前提のまま、小さいDOSとしての基本操作を入れます。
SDFS/68 ロードマップ
v2の候補はこうです。
DIR: root directoryを表示するTYPE filename: テキストファイルを表示するRUN filename: ファイルをロードし、entryが取れれば実行するRUN addr: 指定アドレスへジャンプするLOAD filename: ロードだけ行うL filename:LOAD filenameの短縮エイリアスEXIT: ROMモニタへ戻る
ここで大事なのは、RUN を通常実行の本線にすることです。
LOAD は開発補助です。ロードして、メモリを見たり、あとで実行したりするための入口です。L はv1からあるので残しますが、v2では LOAD の短縮形という位置づけにします。
実行ファイル形式はまだ作らない
DOSっぽくするなら、CP/Mの FOO.COM みたいに、FOO と打ったら外部装置からロードして実行、という形も考えたくなります。
でも、v2でそこまでやると仕様が大きくなりすぎます。
今はまだS-record / Intel HEXをロードする世界です。S-recordには S9 や S8 で開始アドレスを持てますが、Intel HEX側は今の実装では拡張アドレスや開始アドレスを扱っていません。
なのでv2では、まず RUN filename という明示コマンドにします。
entryが取れれば実行する。取れなければエラーにしてプロンプトへ戻る。これくらいが、今のRAM容量と実装規模には合っていそうです。
本格的な実行ファイル形式や、FOO 入力で FOO.COM を探すトランジェントコマンドは、もっと後で考えます。
スタンドアロン化はv3へ送る
もうひとつ、VDGとキーボードの話もあります。
K68-VDGの VDGTEST はできていますし、KKBD-USBを2nd ACIAへつなぐPoCもできています。SDFS/68をDOSとして使うなら、最終的にはVDG画面とキーボードで使いたくなります。
でも、これもv2には入れません。
VDGを標準出力にするには、画面スクロール、カーソル、BS、CR/LF、UART fallbackなどが絡みます。DIR や RUN と同時にやると切り分けが悪いです。
なので、v2はUARTコンソール前提でDOSとしての形を作る。VDG/KKBD統合はv3で扱う。これで分けます。
通常運用とデバッグ時の流れ
使い方としては、こういうイメージです。
通常運用とデバッグ時の流れ
通常はSDFS/68内で完結します。
`SDFS> DIR
SDFS> RUN BASIC.S`
デバッグしたいときは、ロードだけしてROMモニタへ戻ります。
`SDFS> LOAD TEST.S
OK
SDFS> EXIT
] U0200
] M0200
] BOOT
SDFS>`
こうすると、SDFS/68はDOS、ROMモニタはデバッガ、という役割が保てます。
Issueを分けた
この方針を忘れないように、先にIssueとdocsへ残しました。
- Issue #136: モニタと第2段DOSの責務境界
- Issue #137: SDFS/68 v2の親Issue
- Issue #138:
DIR - Issue #139:
TYPE - Issue #140:
RUN - Issue #141:
LOAD - Issue #142:
EXIT
この整理を入れたのがPR #143です。
実装はこれからですが、先に迷いそうなところを固定できたのはよかったと思います。
次にやること
次は、v2の最初として DIR を実装します。
ただし、いきなりROM側の DIR を消すわけではありません。ROM側 DIR は sbcio profileの互換機能として残します。
SDFS/68側の DIR は、sbcio_vdg / k6802_vdg の本線で使うDOS側の機能です。
まずはUART前提、root限定、8.3 filename限定で進めます。
関連リンク
- Issue #136: https://github.com/kuninet/mc6800-rom-monitor/issues/136
- Issue #137: https://github.com/kuninet/mc6800-rom-monitor/issues/137
- Issue #138: https://github.com/kuninet/mc6800-rom-monitor/issues/138
- Issue #139: https://github.com/kuninet/mc6800-rom-monitor/issues/139
- Issue #140: https://github.com/kuninet/mc6800-rom-monitor/issues/140
- Issue #141: https://github.com/kuninet/mc6800-rom-monitor/issues/141
- Issue #142: https://github.com/kuninet/mc6800-rom-monitor/issues/142
- PR #143: https://github.com/kuninet/mc6800-rom-monitor/pull/143