MC6800 SDFS/68を作る その3 ~v1を実機BOOTするまでの長い道のり~

前回は、SDFS/68をROMモニタの延長ではなく、小さいDOSとして育てる話を書きました。
とはいえ、まだ実機でちゃんとSDFD/68のv1を BOOT して、SDカード上の SDFS.BIN からSDFS/68が起動するところまでは確認できていませんでした。
今回はその実機確認です。
結果から言うと、最後は動きました。
でも、そこまでが長かったです。やっぱり実機は、エミュレータのようにはいきません。
今回の実機構成
まずBOOTでハングする
最初の構成では、sbcio_vdg profileのROMで起動して、SDカードも作って、いよいよ BOOT です。
`] MAP
MAP SBCIO VDG
RAM 0000-7FFF
USER 0000-7FFF
WORK C000-DFFF
SD C000
MON C200
MIK C300
STK DFFF
VRAM A000-BFFF
VDG 8110
KEY 8094-8095
ROM E000-FFFF
] BOOT`
ここでハングしました。
うーむ。
SDカード側はMacで見えていて、SDFS.BIN と HELLO.S も入っています。さらに、dd でSDカードのLBA16を読んでみると、stage1の S1API68 ヘッダもちゃんと見えています。
`00000000: 5331 4150 4936 3801 0600 c465 09d2 0000 S1API68....e....`
つまり、SDカードのイメージ作成や書き込みはたぶん大丈夫そうです。
そこで実機側で $C400 を見ると、ここにもstage1のヘッダが入っていました。
`] DC400-C41F
C400 53 31 41 50 49 36 38 01 06 00 C4 65 09 D2 00 00 S1API68....e....
C410 7E C4 22 7E C4 28 7E C4 2E 7E C4 31 7E C4 34 7E ~."~.(~..~.1~.4~`
ここまでは読めています。でも BOOT 後に BRK C803 で戻ってきました。
`BRK C803 A=FE B=0F X=0177 SP=DFFB CC=D9`
最初はFAT32のmountで落ちているのかな、と思いました。でも $C7F0 付近を見てみると、stage1の後半コードが入っているはずの場所が壊れています。
`] DC7F0-C820
C7F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
C800 4B 0D 00 3F 0D 00 3F 00 0D 53 31 3F 0D 00 00 00 K..?..?..S1?....`
おや。
これはFAT以前の問題です。stage1を実行するRAM側が怪しい。
K68-VDGを外してもRAMTESTが怪しい
最初はK68-VDGとのアドレス衝突を疑いました。
sbcio_vdg では、K68-VDGのVRAMを $A000-$BFFF にして、SBC-IOのRAMを $C000-$DFFF に置く想定です。もしK68-VDG側が $C000-$DFFF に出ていたら、stage1やSDFS/68の置き場所とぶつかります。
そこでK68-VDGを外して RAMTEST C000-DFFF を試してみました。
`] RAMTEST C000-DFFF
RAMTEST C000-DFFF
NG C09F`
あれ。
K68-VDGを外してもダメです。
さらに、低い方のRAMでも RAMTEST 1000-10FF が通ったり落ちたりします。
`] RAMTEST 1000-10FF
RAMTEST 1000-10FF
OK
] RAMTEST 1000-10FF
RAMTEST 1000-10FF
MC6800 MONITOR`
2回目でリセットしたような表示になりました。
この時点で、SDFS/68の問題ではなく、実機のRAMまわりを見るべきだな、となりました。
base ROMでSBC6800単体に戻す
いったんSDFS/68から離れて、SBC6800単体の base ROMに戻しました。
base profileは、SBC6800上の8KB RAMだけを使います。$C000-$DFFF のSBC-IO RAMも、K68-VDGも、SDも関係ありません。
`] MAP
MAP BASE
RAM 0000-1FFF
USER 0000-1FFF
WORK 1C00-1FFF
MON 1E00
MIK 1F00
STK 1F42
ROM E000-FFFF`
この状態で RAMTEST 0100-1BFF を何度も回しました。
`] RAMTEST 0100-1BFF
RAMTEST 0100-1BFF
OK
] RAMTEST 0100-1BFF
RAMTEST 0100-1BFF
OK
] RAMTEST 0100-1BFF
RAMTEST 0100-1BFF
OK`
安定しています。
つまり、SBC6800単体の8KB RAMと、RAMTESTコマンドそのものは大丈夫そうです。
SBC-IO側RAMでまた不安定になる
次にSBC-IOを装着して、SBC-IO側RAMで試しました。するとまた怪しくなります。
`] RAMTEST 0100-1BFF
RAMTEST 0100-1BFF
NG 05FF
] RAMTEST 0100-01FF
RAMTEST 0100-01FF
OK
] RAMTEST 0100-0500
RAMTEST 0100-0500
OK
] RAMTEST 0100-0600
RAMTEST 0100-0600
NG 05B1`
0100-03FF は何度やってもOK。0100-04FF あたりからOKだったりNGだったりします。
このへんで、以前にもあった「SBC6800の裏の半田付けが中途半端だった」事件を思い出しました。
今回も近い匂いがします。
一瞬、A10/A11あたりかな、と思って 0400 と 0800 のエイリアスも見ました。
`] F0400-040F 55
] D0400
0400 55 55 55 55 55 55 55 55 55 55 55 55 55 55 00 55
] D0800
0800 00 D6 D6 D6 D4 D6 D6 D6 D6 D6 D6 D6 D6 D6 D6 D6`
完全なミラーというより、バスが乱れている感じです。
これはもう、ソフトで追いかける話ではなさそうです。
CPUボードを変える
そこでCPUボードを変えました。
K6802-SBC上のRAMを外して、CPUボードとして使います。RAMはSBC-IO側を使います。
これで RAMTEST C000-DFFF を実行すると、ようやく通りました。
`] RAMTEST C000-DFFF
RAMTEST C000-DFFF
OK`
いいね。
ここまで来ると、ようやくSDFS/68のテストに戻れます。
ついにSDFS/68 V1が起動する
同じ構成で BOOT します。
`] BOOT
SDFS/68 V1
SDFS>`
出ました。
長かった。
SDFS/68 v1で使えるコマンドは、まだ L filename と Dhhhh だけです。LOAD、RUN、EXIT はv2予定で、まだありません。
ここも少し引っかかりました。
`SDFS> LOAD HELLO.S
?
SDFS> RUN 0100
?
SDFS> EXIT
?`
そうでした。まだ無いです。
v1ではこうです。
`SDFS> L HELLO.S
OK
SDFS> D0100
0100 CE
SDFS> D0101
0101 01`
HELLO.S は $0100 から始まるS-Recordなので、0100 CE、0101 01 は期待通りです。
途中で ?S2 も出ました。これは HELLO.S の終端が S9 だけだったためです。SDFS/68のloaderは正規の終端recordを期待するので、末尾をこう直しました。
`S9030000FC`
これでロードできました。
リセットしてROMモニタから実行する
ただし、v1には RUN も EXIT もありません。
なので、ロードしたあとにリセットボタンでROMモニタへ戻り、RAMが保持されていることを期待して G0100 します。
`SDFS> MC6800 MONITOR
] D0100
0100 CE 01 07 BD E0 7E 3F 0D 0A 48 45 4C 4C 4F 2C 20 .....~?..HELLO,
0110 57 4F 52 4C 44 0D 0A 04 00 00 00 00 00 00 00 00 WORLD...........
] G0100
HELLO, WORLD
BRK 0106 A=04 B=00 X=0117 SP=DFFF CC=D4
]`
出ました。
HELLO, WORLD です。
BRK 0106 は、HELLO.S内の 3F を踏んでROMモニタへ戻ってきたものなので、これでOKです。
SDFS/68 v1としては、かなりよい到達点です。
今回わかったこと
今回の確認で、SDFS/68の起動経路は実機で通りました。
`ROM BOOT
-> fixed LBA 16 の stage1
-> FAT root の SDFS.BIN
-> SDFS/68 V1
-> L HELLO.S
-> ROM側 G0100
-> HELLO, WORLD`
一方で、実機テストではやっぱりRAMが大事でした。
stage1もSDFS/68も、sbcio_vdg では $C000-$DFFF に置きます。ここが少しでも怪しいと、BOOT の途中で謎の BRK になったり、stage1後半が壊れて見えたりします。
今回も最初はSDFS/68のFAT処理を疑いました。でも、あとから見ると、先にRAMTESTでした。
やっぱり実機は、まずRAMです。
次にやること
v1は動きました。
でも、リセットでROMモニタへ戻らないと実行できないのは、やっぱりちょっと不便です。
次に欲しいのは、やはり EXIT と RUN addr です。
L HELLO.S でロードして、RUN 0100 で実行できるだけでも、かなりDOSっぽくなります。さらに DIR が入れば、SDカード上のファイルを見ながら実行できます。
まずは今日のところは、SDFS/68 V1が実機で HELLO, WORLD まで行った、ということでよしとします。
うごいてよかったーっす 😭