EMUZ80でCOSMACを動かしてみました 4(モニタ動作編)

投稿日:

前回までの実験でHIGHアドレスも使えるようになったので、EMUZ80のCOSMAC環境でモニタプログラムを動かしてみます。以降は紛らわしくならないようにEMU1802と呼ぶことにします。

IDIOTモニタをファームウェアに組み込む

COSMACコミュニティでは超有名なIDIOTモニタプログラムをEMU1802で動かしてみます。このモニタプログラムの大きさは1Kバイトです。ソフトウェアでシリアル通信を実装しており、COSMAC CPUのQ出力とEF3入力がシリアルポートになります。

オリジナル版は$8000からのアドレスに配置されていますので、これを$0000に配置しなおします。まずはIDIOTのアセンブラソースをいつも使っているSB-Assemblerでアセンブルできるように修正しました。

emuz80_cosmac_idiot_sbasm_src1.png

COSMAC CPUのクロックは2MHzぐらいにしたいのですが、現状のファームウェアだと2MHzにするとタイミングの関係かうまく動きません。そのため10分の1のクロック0.2MHzとしています。これでも300bps程度の通信速度は出せるはずです。

SB-Assemblerではバイナリ形式での出力ができるので、そのバイナリを簡単なPythonプログラムでCのソース形式に変換して、EMU1802のファームウェアのソースに組みこみました。

emuz80_cosmac_idiot_hex_src1.png

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

emuz80_cosmac_serial_usb1.jpg

IDIOTモニタの起動確認

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

emuz80_cosmac_idiot_1st_prompt.png

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

emuz80_cosmac_putty_garbled.png

おかしいなとターミナルプログラムを変えたり、ロジアナでQ出力やEF3出力を確認してみましたが、シリアルデータ自体は届いているようにみえます。

昔の記録をひっくり返して、パリティをMarkにしないといけないことを思いだしました。ターミナルでその設定を行い再びEnterキーを押したところ、無事動作するようになりました。

emuz80_cosmac_teraterm_ok.png

モニタプログラムの基本機能は動作しているようです。メモリダンプやRAMエリアの書き込み、読み出しも正常です。

IDIOTモニタプログラムを使ってみる

IDIOTでは以下のコマンドが使えます。これらのコマンドをためしていきます。

  • !M メモリへの書き込み
  • ?M メモリダンプ
  • ?R レジスタの内容表示
  • $P 指定したアドレスからのプログラムの実行(P=X=0の状態で実行)
  • $R 指定したレジスタの内容でプログラムを実行(XとPを指定して実行)

IDIOTモニタプログラムの機能を使ってエコーバックのプログラムを動かしてみます。ソースコードは以下になります。

0000-                         .CR     1802
8000-                        .OR     $8000
8000-                
8000-F8 80            INIT:   LDI     /INIT
8002-B4                       PHI     4
8003-B5                       PHI     5
8004-F8 17                    LDI     #TMPBUF
8006-A4                       PLO     4       ; TMPBUF -> R4 to the TYPE immeiate location.
8007-F8 0B            LOOP:   LDI     #MAIN   ; MAIN -> R5 .. Main program address
8009-A5                       PLO     5
800A-D5                       SEP     5       ; Change program counter
800B-                
800B-F8 01            MAIN:   LDI     $01
800D-B3                       PHI     3
800E-F8 3E                    LDI     $3E
8010-A3                       PLO     3       ; $013E -> R3 .. IDIOT READ entry address
8011-D3                       SEP     3       ; Call READ
8012-                
8012-54                       STR     4
8013-F8 9C                    LDI     $9C
8015-A3                       PLO     3       ; $019C -> R3 .. IDIOT TYPE entry address
8016-D3                       SEP     3       ; Call TYPE
8017-                 TMPBUF: .BS     1       ; TYPE imm. strage location.
8018-30 07                    BR      LOOP
801A-                
801A-                        .EN

SB-Assemblerで生成されたHEXファイルを使い、モニタプログラムでメモリの$8000番地に書き込み、実行してみます。

emz80_cosmac_idiot_echoback1.png

キーボードから文字を入力すると、エコーバックされることを確認しました。問題なく動作しているようです。

機能的には正しく動いてはいますが、シリアル通信速度の300bpsが遅く感じます。EMUZ80ではPICのUARTを使用できますので、これをIDIOTモニタでサポートできるようにプログラムを修正してみます。

仕上げ編に続く