原型となったEMUZ80では、PIC18F47Q43でROM, RAM, UARTをエミュレーションしています。EMU1802-miniではPICのUARTの機能は使わずCOSMAC CPUのQ出力とEF3入力を利用したソフトウェアシリアルを使っていました。これは既存のCOSMACのソフトウェアではソフトウェアシリアルが利用されていてハードウェアの互換性があるからです。
しかし、今回製作しているEMU1802-miniでは一般的な速度のCPUクロックにできないため、どうしてもソフトウェアシリアルの速度が低速になってしまい、使い勝手がよくありません。IDOITモニタだけでもUART対応にできれば用途が広がるのではと思われます。
PICのUARTをファームウェアに組み込む
これまでのファームウェアではUART機能をコメントアウトしていましたので、まずはこれをもとに戻しました。これでEMUZ80と同様にE000H、E001HをアクセスすることでPICのUARTにアクセスできるはずです。
動作確認を行うために、写真のようにPICのUARTにつながっているCON2にもUSBシリアルを9600bpsで接続します。

IDIOTモニタでUARTのレジスタのメモリアドレスを確認します。?MコマンドでE000H付近をダンプしてみると、このアドレスだけ何らかの値が設定されていることが確認できます。さらに!MコマンドでUARTのデータレジスタのアドレスであるE001にデータを書き込むと、CON2のUSBシリアルにそのデータがリアルタイムに出力されることを確認しました。

ファームウェアとハードウェアは正常に動作しているようです。
COSMACのプログラムからUARTにアクセスしてみる
次にテストプログラムを作って、プログラムからUARTにアクセスできるかを確認します。EMUZ80の雑誌投稿記事「EMUZ80の設計と製作」にEMUZ80での端末インターフェースのテストプログラムが掲載されています。これのCOSMAC版を書いてみます。EMUZ80でのプログラムは再利用できるように機能がサブルーチンに分かれていますが、COSMACではとりあえず動くものにしています。(アーキテクチャ的にきちんと設計しないとサブルーチン化できないので・・・)
これをSB-Assemblerでアセンブルして、ファームウェアのROMエリアに組みこみます。
| |
EMU1802-miniの電源をいれると、EMUZ80の確認プログラムと同様な動作が確認できました。

IDIOTモニタをUART対応にする
実はすでにIDIOTモニタのUART版は存在します。COSMACのペリフェラルであるCDP1854 UARTを使ったものです。このソースを参考にしてPICのUART用に書き換えました。作成したソースはGitHubに置きました。
これをファームウェアのROMエリアに組み込んだ状態でリセットをしたところ、IDIOTモニタのプロンプトがPICのUARTに出力されました。通信速度は9600bpsです。プログラムを読み込んで、実行できることを確認しました。

CPUクロックが遅いためかテキストアップロードを行うと取りこぼしがあるようです。このため10ms/文字、50ms/改行の待ち時間をターミナルで設定していますが、300bpsしか出せないソフトウェアシリアルに比べて格段に使いやすくなりました。
GitHubに置いてあるソースやドキュメントもこれにあわせてアップデートしました。ついでにRCA BASICの動かしかたを含む「EMU1802-miniでのCOSMAC CPUの楽しみ方」も追記しておきましたのでぜひご覧ください。
