MC6800 ROMモニタ自作 その1 〜フェーズ1をSBC6800で動かしてみる〜

MC6800用のROMモニタを自作してみたいと思いまして、まずはフェーズ1として最小のシリアル入出力だけを実装してみました。
いきなり高機能なものを目指すのではなく、まずは MC6850 ACIA を使って1文字入力、1文字出力、そしてエコーバックができるところまで持っていく、というのを今回の目標にしました。
ターゲットボードは当面 SBC6800 固定です。既存のROMと差し替えて動作確認できるようにしておけば、その先のメモリダンプやHexローダ実装にもつなげやすいかなと思います。
まずは既存のMIKBUGで接続確認
いきなり自作ROMを書いて動かないと、ボードが悪いのか、シリアルが悪いのか、ROMが悪いのか切り分けが面倒です。なので、まずは元のMIKBUG ROMを使ってSBC6800がちゃんと動くことを確認しました。
Mac側は screen で接続して、シリアル経由で反応が返ってくることを確認。これで少なくとも、SBC6800本体、ACIA、USBシリアル、端末設定のあたりは大丈夫そうです。
SBC6800に元のMIKBUG ROMを載せた状態
まずは元のMIKBUGがシリアル経由で使えることを確認
フェーズ1の目標
今回のフェーズ1でやりたかったのは、かなり小さいです。
- ACIAの初期化
- 1文字送信
- 1文字受信
- 受信した文字のエコーバック
要するに「電源投入して、自作ROMが立ち上がって、シリアルから何か反応が返ってくる」ところまでをまず固めたい、という感じです。
アドレスはSBC6800に合わせて、ROMを $E000-$FFFF、RAMを $0000 から、ACIAを $8018/$8019 にしています。ここを合わせておけば、既存資料や既存資産も使いやすいはず。
ROMを書いて差し替え
フェーズ1のROMモニタをビルドして、Windows側のROMライタ環境で W27C512 に書き込みました。
ビルド環境は GNU make と Macro Assembler AS を使っています。ここはWindows環境で少しハマって、asl のinclude指定や p2hex の呼び出し方を少し手直ししました。

最初は無反応でちょっとハマる
ROMを差し替えて起動してみたのですが、最初は無反応でした。
こういう時にいきなり全部疑い始めると収拾がつかなくなるので、まずは切り分けのために、リセット直後に * を1文字だけ出すようにしてみました。これで、CPU起動と送信側だけでも確認しやすくなります。
さらに、実績のあるSBC6800データパック付属の ポーリングサンプルプログラムと見比べてみたところ、送信ルーチンでAレジスタを壊してしまっていたのが原因でした。送るはずの文字ではなく、ACIAステータスをそのまま送ってしまう形になっていたわけです。
このあたりは、やはり実機で確認しながら直していくのが大事ですね。コードを読んでいるだけでは気づきにくいところでした。
フェーズ1ROMで動作確認OK
送信ルーチンを修正したところ、無事にフェーズ1 ROMモニタでも動作確認が取れました。やったー。
起動時のマーカーが見えて、その後シリアル経由で反応が返るところまで確認できたので、フェーズ1としては十分かなと思います。

今回やったこと
- SBC6800を元のMIKBUG ROMで起動して接続確認
- フェーズ1の最小ROMモニタを実装
- W27C512へ書き込んで差し替え
- 起動マーカーを入れて実機切り分け
- 送信ルーチンの不具合を修正して動作確認
ちなみに、いつものとおりgithubで公開中であります!!
ちゃんとissueとか切って進めてるので、見てみていただけると楽しいですよ。
今後の予定
フェーズ1で、ひとまず「自作ROMが起動してシリアルから反応が返る」ところまで確認できました。動いてよかった〜。
次はフェーズ2として、行入力、バックスペース処理、16進入力、簡単なプロンプトなどを実装して、モニタらしい形にしていきたいと思います。
その先でメモリダンプやメモリ変更、さらにS-RecordやIntel HEXのロードにも進みたいところです。