MC6800 ROMモニタ自作 その10 〜MIKBUG互換を足して HELLO と BASIC を動かす〜

前回までで、ROMモニタとしてはだいぶ形になってきました。メモリダンプ、メモリ変更、指定アドレス実行、S-Record / Intel HEX のロードまで通っていて、実機確認もだいぶやりやすくなっています。
ただ、せっかく SBC6800 を触っているので、ここで一度やってみたかったことがありました。それが、SBC6800 のデータパックに入っている HELLO や MICBAS13 を、そのままロードして動かしてみることです。
これが動くと、単に「自作モニタが動いている」から一歩進んで、「昔のソフト資産にどこまで寄せられているか」が見えてきます。今回はそのために、MIKBUG 互換の固定エントリ番地を入れてみました。


今回やりたかったこと
今回やりたかったのは、SBC6800 データパック付属の既存プログラムを、なるべくそのまま動かすことです。
最初は、INEEE と OUTEEE の 1 文字入出力だけ合わせれば BASIC もいけるかな、と思っていました。でも実際にデータパックを見ていくと、そんなに単純ではありませんでした。
例えば HELLO.ASM は PDATA1 を使っていますし、MICBAS13.ASM は INEEE / OUTEEE だけでなく CONTRL も前提にしています。さらに MIKBUG.LST を見ていくと、既存プログラムは「この名前のルーチンがある」ではなく、「この番地に入口がある」ことを期待していました。
つまり今回は、機能互換というより番地互換を足す作業だった、という感じです。
必要な番地を確認した
OUTCH = $E075INCH = $E078PDATA1 = $E07ECONTRL = $E0E3INEEE = $E1ACOUTEEE = $E1D1
モニタ本体を少し上へ逃がした
今までのモニタ本体は E000 から詰めて置いていたので、そのままだと MIKBUG 互換入口の置き場所とぶつかります。なので今回は、モニタ本体を E200 以降へ少し上げて、下位 ROM 領域に互換入口用のスペースを作りました。
` org MIKBUG_OUTCH
OUTCH:
jmp OUTEEE
INCH:
jmp INEEE`
PDATA1 も、文字列末尾の $04 を見るだけの小さいループなので、必要最小限で済みました。
`PDATA1:
ldaa 0,x
cmpa #$04
beq PDATA1_DONE
jsr OUTCH
inx
bra PDATA1
PDATA1_DONE:
rts`
low RAM の衝突も避けた
最初、MICBAS13 をロードしても途中でおかしな挙動になったのですが、原因は monitor 側のワークエリアを low RAM 側に置いていたことでした。そこで今回は、行バッファなどの monitor ワーク RAM を高位 RAM 側へ移しました。
1文字出力の互換と monitor 内部の CRLF は分けた
実機では HELLO も MICBAS13 も動いたのですが、応答ごとに 1 行ずつ余計な空改行が入っていました。原因は OUTEEE の扱いでした。
monitor 本体では CR を出したら LF も足して CRLF にしたいのですが、MIKBUG 互換の OUTEEE は「1 文字そのまま出す」方が自然です。なので今回は、出力ルーチンを分離しました。
`MIKBUG_OUTEEE_IMPL:
jsr ACIA_PUTC
rts
MON_OUTEEE:
psha
jsr ACIA_PUTC
pula
cmpa #CHR_CR
bne MON_OUTEEE_DONE
psha
ldaa #CHR_LF
jsr ACIA_PUTC
pula
MON_OUTEEE_DONE:
rts`
smoke test に HELLO と BASIC を入れた
今回せっかく datapack を入れたので、エミュレータ側の smoke test にも HELLO と MICBAS13 を追加しました。テストでは datapack の S-record をそのまま読み、終端だけ補って流しています。
`def datapack_srec_script(filename: str, entry: str = "0100") -> str:
path = DATAPACK_DIR / filename
lines = [line.strip() for line in path.read_text(encoding="utf-8", errors="replace").splitlines() if line.strip()]
lines = [line for line in lines if not line.startswith("S9")]
lines.append(f"S903{entry}FB")
return "L\r" + "\r".join(lines) + f"\rG{entry}\r\r"`
実機で確認した
HELLOはロードしてG0100でHELLO, WORLDを表示したMICBAS13はロード後にREADYを表示して、簡単なプログラム入力とRUNができた- 途中で出ていた余計な空改行も、
OUTEEEの分離で消えた
今回のまとめ
- SBC6800 データパック一式を
third_party/sbc6800_datapackに追加した - 必要な MIKBUG 固定入口番地を調べて互換入口を追加した
- monitor 本体を
E200以降へ移した - monitor の作業 RAM を high RAM 側へ逃がした
OUTEEEと monitor 内部のCRLF出力を分離したHELLOとMICBAS13の smoke test を追加した- 実機で
HELLOとMICBAS13の動作を確認した
修正内容はGithubの以下のPRをご覧ください
今後の予定
次は、今回入れた MIKBUG 互換がどこまで通用するか、PROM680 や VTL、割り込み系のサンプルなどでも見ていきたいです。ROMモニタ本体の機能追加と並行して、こういう互換確認も進めていこうと思います。