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

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

前回までで、ROMモニタとしてはだいぶ形になってきました。メモリダンプ、メモリ変更、指定アドレス実行、S-Record / Intel HEX のロードまで通っていて、実機確認もだいぶやりやすくなっています。

ただ、せっかく SBC6800 を触っているので、ここで一度やってみたかったことがありました。それが、SBC6800 のデータパックに入っている HELLOMICBAS13 を、そのままロードして動かしてみることです。

これが動くと、単に「自作モニタが動いている」から一歩進んで、「昔のソフト資産にどこまで寄せられているか」が見えてきます。今回はそのために、MIKBUG 互換の固定エントリ番地を入れてみました。

今回やりたかったこと

今回やりたかったのは、SBC6800 データパック付属の既存プログラムを、なるべくそのまま動かすことです。

最初は、INEEEOUTEEE の 1 文字入出力だけ合わせれば BASIC もいけるかな、と思っていました。でも実際にデータパックを見ていくと、そんなに単純ではありませんでした。

例えば HELLO.ASMPDATA1 を使っていますし、MICBAS13.ASMINEEE / OUTEEE だけでなく CONTRL も前提にしています。さらに MIKBUG.LST を見ていくと、既存プログラムは「この名前のルーチンがある」ではなく、「この番地に入口がある」ことを期待していました。

つまり今回は、機能互換というより番地互換を足す作業だった、という感じです。

必要な番地を確認した

  • OUTCH = $E075
  • INCH = $E078
  • PDATA1 = $E07E
  • CONTRL = $E0E3
  • INEEE = $E1AC
  • OUTEEE = $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 は分けた

実機では HELLOMICBAS13 も動いたのですが、応答ごとに 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 にも HELLOMICBAS13 を追加しました。テストでは 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 はロードして G0100HELLO, WORLD を表示した
  • MICBAS13 はロード後に READY を表示して、簡単なプログラム入力と RUN ができた
  • 途中で出ていた余計な空改行も、OUTEEE の分離で消えた

今回のまとめ

  • SBC6800 データパック一式を third_party/sbc6800_datapack に追加した
  • 必要な MIKBUG 固定入口番地を調べて互換入口を追加した
  • monitor 本体を E200 以降へ移した
  • monitor の作業 RAM を high RAM 側へ逃がした
  • OUTEEE と monitor 内部の CRLF 出力を分離した
  • HELLOMICBAS13 の smoke test を追加した
  • 実機で HELLOMICBAS13 の動作を確認した

修正内容はGithubの以下のPRをご覧ください

今後の予定

次は、今回入れた MIKBUG 互換がどこまで通用するか、PROM680VTL、割り込み系のサンプルなどでも見ていきたいです。ROMモニタ本体の機能追加と並行して、こういう互換確認も進めていこうと思います。

MC6800 ROMモニタSBC6800