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

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

前回は、実機で BOOT して、SDFS/68 V1から L HELLO.S でロードし、最後はROMモニタ側の G0100HELLO, WORLD まで行った話を書きました。

動いたのはよかったのですが、V1のままだと、やっぱりまだ「DOSを起動した」という感じではありません。

`SDFS> L HELLO.S
OK
SDFS> D0100
0100 CE`

ここまではできます。でも、ファイル一覧は見えないし、実行するにはROMモニタへ戻る必要があります。

うーむ。これはまだローダです。

というわけで、V1.2として DIRLOADEXITRUN あたりを入れていくことにしました。

今回もこの構成で実機確認

バージョン番号をどうするか

最初は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は S9S8 に開始アドレスを入れられます。一方で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ちょっとです。

なので、次はあまり欲張れません。CDPWD まで入れるのではなく、まずはフルパス指定でサブフォルダのファイルが見える、ロードできる、くらいに絞るのがよさそうです。

関連リンク

SDFS/68