MC6800 SDFS/68を作る その4 ~DIR、EXIT、RUNでDOSっぽくなってきた~

前回は、実機で BOOT して、SDFS/68 V1から L HELLO.S でロードし、最後はROMモニタ側の G0100 で HELLO, WORLD まで行った話を書きました。
動いたのはよかったのですが、V1のままだと、やっぱりまだ「DOSを起動した」という感じではありません。
`SDFS> L HELLO.S
OK
SDFS> D0100
0100 CE`
ここまではできます。でも、ファイル一覧は見えないし、実行するにはROMモニタへ戻る必要があります。
うーむ。これはまだローダです。
というわけで、V1.2として DIR、LOAD、EXIT、RUN あたりを入れていくことにしました。
今回もこの構成で実機確認
バージョン番号をどうするか
最初はIssueの親が「v2」だったので、起動メッセージも V2 かな、と思っていました。
でも、やっていることをよく見ると、アーキテクチャが変わったわけではありません。stage1がいて、SDFS.BINをRAMへロードして、SDFS/68が動く。この構造はV1のままです。
増えたのはDOSっぽいコマンドです。
なので、これは V2 というより V1.2 だな、となりました。
`SDFS/68 V1.2 #142
SDFS>`
末尾の #142 は、その時点で作業していたIssue番号です。ちょっとビルド番号っぽくてよいかな、と思っています。
SDFS.BINはROMへ焼かない
途中で一瞬「あれ、V1.2をROMへ書き込むんだっけ?」となりました。でも違います。
ROM側はそのままです。ROMには BOOT があって、fixed LBAからstage1を読むだけです。SDFS/68本体はSDカードのFAT rootにある SDFS.BIN です。
なので、V1.2へ更新するときは、SDカード上の SDFS.BIN をコピーし直せばよいです。
`ROM: そのまま
stage1: 基本そのまま
SDFS.BIN: SDカード上で差し替え`
DIRが入ると急にDOSっぽい
最初に入れたのは DIR です。root directoryを読んで、8.3の通常ファイルだけ表示します。ROM側の DIR を呼ぶのではなく、SDFS/68側でstage1の低レベルAPIを使って自前でrootを走査します。
`] BOOT
SDFS/68 V1.2 #138
SDFS> DIR
SDFS.BIN A 00000936
HELLO.S A 0000004A
_SDF~3.BIN A 00001000
SDFS>`
おお、出た。DIR が出ると急にDOSっぽくなります。
EXITでROMモニタへ戻る
次は EXIT です。SDFS/68からROMモニタへ戻れるようにしました。低レベルデバッグはROM側でやる、という方針なので、これは必要です。
最初は戻れるのですが、プロンプトが少し化けました。原因は、ROMモニタ入口へ戻るときにACIA初期化をやり直していたことです。
実機のシリアル端末はすでに通信中なので、そこでACIAをいじると表示が乱れることがあります。なので、EXIT はACIA再初期化なしのROM再入口へ飛ぶようにしました。
`SDFS> EXIT
] D0100
0100 CE 01 07 BD E0 7E 3F 0D 0A 48 45 4C 4C 4F 2C 20`
いいね。
LOADを正式コマンドにする
V1では L filename だけでした。でもDOSっぽくするなら、やっぱり LOAD filename が欲しいところです。L は短縮形として残しますですよ。
ここは、コマンドパーサの書き方で少し悩みました。文字列比較の共通ルーチンを作る手もありますが、MC6800はインデックスレジスタが1本だけです。コマンド数がまだ少ないので、ここはベタなままにしました。
RUN addrが欲しい
次は RUN addr です。これは単純に指定アドレスへ飛ぶだけです。
`SDFS> LOAD HELLO.S
OK
SDFS> RUN 0100
HELLO, WORLD
BRK 0106 A=04 B=03 X=0117 SP=DFFF CC=D4
]`
この時点でかなりDOSっぽくなりました。
RUN filenameはS-Recordだけにする
さらに RUN HELLO.S も入れました。ここで問題になるのが実行開始アドレスです。
S-Recordは S9 や S8 に開始アドレスを入れられます。一方でIntel HEXにも開始アドレスの規約はあるようですが、手元のアセンブラ出力では普通には出てきません。
なので割り切りました。RUN filename はS-Record entryあり限定。Intel HEXは LOAD filename + RUN addr です。
`SDFS> RUN HELLO.S
HELLO, WORLD
BRK 0106 A=04 B=00 X=0117 SP=DFFF CC=D4
]`
うごいた。ここまで来ると、もうかなり小さいDOSですねぇ。自画自賛。
SDFS.BINだけ差し替えたら壊れた話
RUN filename の途中で、少し嫌な壊れ方もしました。stage1とSDFS/68が共有しているwork領域の番地をうっかり変えると、既存のstage1と新しいSDFS.BINの組み合わせで壊れます。
対策として、既存のFAT work領域の番地は動かさず、SDFS/68側で必要な追加領域は末尾へ足すようにしました。さらに、共有work領域の固定番地テストも追加しました。
Macが置いたファイルがDIRに出る
しばらく実機で遊んでいたら、DIR が変な表示になりました。
`SDFS> DIR
������. A 00000008
. A 0FFFFFFF
���. A 00000000`
おや。これはまずい。
SDカードをMacで触ったあとだったので、FAT上に隠しファイルやAppleDoubleっぽいものが増えていたようです。そこで hidden/system/volume/directory/LFN/deleted は表示しない、制御文字や非ASCIIっぽい名前は表示しない、という対応を入れました。
BSが効かないのも気になる
最後に、SDFS/68の行入力をROMモニタに寄せました。ROMモニタではBackspaceで入力を消せます。でもSDFS/68側は最初かなり素朴な行入力で、打ち間違えると不便でした。
最終的には、BSとDELの両方で、行バッファと画面表示がちゃんと戻るようにしました。小文字コマンドも大文字化して扱えるようにしています。
V1.2でできるようになったこと
`] BOOT
SDFS/68 V1.2 #150
SDFS> DIR
SDFS.BIN A 00000A55
HELLO.S A 00000052
SDFS> RUN HELLO.S
HELLO, WORLD
BRK 0106 A=04 B=00 X=0117 SP=DFFF CC=D4
]`
DIR で見て、RUN で実行する。やっとDOSっぽくなってきました。
次はサブフォルダが欲しくなってきましたねぇ。
次にやること
V1.2はここでいったん完了にしました。次はV1.3として、サブフォルダ対応を考えます。
ただし、RAMはきついです。SDFS/68本体は $D000-$DEFF の約3.75KB枠で、V1.2時点ですでに2.7KBくらいあります。残りは1KBちょっとです。
なので、次はあまり欲張れません。CD や PWD まで入れるのではなく、まずはフルパス指定でサブフォルダのファイルが見える、ロードできる、くらいに絞るのがよさそうです。