前回までの実験でHIGHアドレスも使えるようになったので、EMUZ80のCOSMAC環境でモニタプログラムを動かしてみます。以降は紛らわしくならないようにEMU1802と呼ぶことにします。
IDIOTモニタをファームウェアに組み込む
COSMACコミュニティでは超有名なIDIOTモニタプログラムをEMU1802で動かしてみます。このモニタプログラムの大きさは1Kバイトです。ソフトウェアでシリアル通信を実装しており、COSMAC CPUのQ出力とEF3入力がシリアルポートになります。
オリジナル版は$8000からのアドレスに配置されていますので、これを$0000に配置しなおします。まずはIDIOTのアセンブラソースをいつも使っているSB-Assemblerでアセンブルできるように修正しました。

COSMAC CPUのクロックは2MHzぐらいにしたいのですが、現状のファームウェアだと2MHzにするとタイミングの関係かうまく動きません。そのため10分の1のクロック0.2MHzとしています。これでも300bps程度の通信速度は出せるはずです。
SB-Assemblerではバイナリ形式での出力ができるので、そのバイナリを簡単なPythonプログラムでCのソース形式に変換して、EMU1802のファームウェアのソースに組みこみました。

ファームウェアをコンパイルしてEMU1802に書き込み、Q出力とEF3入力にシリアルUSBを接続して準備完了です。

IDIOTモニタの起動確認
PCでシリアルターミナルを起動して、通信速度を300bps, 7bitデータ, stop 1bit, パリティ無しに設定して、リセットスイッチを押して、Enterキーを押したところ、

無事プロンプトが表示されました。モニタコマンドを入力したところ、動いてはいるようですがなぜか入力した文字が化けています。

おかしいなとターミナルプログラムを変えたり、ロジアナでQ出力やEF3出力を確認してみましたが、シリアルデータ自体は届いているようにみえます。
昔の記録をひっくり返して、パリティをMarkにしないといけないことを思いだしました。ターミナルでその設定を行い再びEnterキーを押したところ、無事動作するようになりました。

モニタプログラムの基本機能は動作しているようです。メモリダンプやRAMエリアの書き込み、読み出しも正常です。
IDIOTモニタプログラムを使ってみる
IDIOTでは以下のコマンドが使えます。これらのコマンドをためしていきます。
- !M メモリへの書き込み
- ?M メモリダンプ
- ?R レジスタの内容表示
- $P 指定したアドレスからのプログラムの実行(P=X=0の状態で実行)
- $R 指定したレジスタの内容でプログラムを実行(XとPを指定して実行)
IDIOTモニタプログラムの機能を使ってエコーバックのプログラムを動かしてみます。ソースコードは以下になります。
| |
SB-Assemblerで生成されたHEXファイルを使い、モニタプログラムでメモリの$8000番地に書き込み、実行してみます。

キーボードから文字を入力すると、エコーバックされることを確認しました。問題なく動作しているようです。
機能的には正しく動いてはいますが、シリアル通信速度の300bpsが遅く感じます。EMUZ80ではPICのUARTを使用できますので、これをIDIOTモニタでサポートできるようにプログラムを修正してみます。
仕上げ編に続く
