現在地

Universal Monitor

[UniMon] レジスタ命令の内側(その1)

カテゴリー:

MC6800に続いて6502, MC6809についてもレジスタ命令を追加しましたので、その内側について書いてみたいと思います。

さて、レジスタ命令とはレジスタの値を表示・変更する機能なわけですが、CPUがある瞬間に実行できるプログラムは1つですからユーザプログラム実行中はモニタプログラムは実行できません。モニタプログラム自身の動作にもレジスタは必要です。

ではどうするか?

モニタプログラムには次の3つの機能が必要になります。

MN1613ボード(モニタ移植編)

テーマ:

前回は簡単なテストプログラムを動かしましたが、その後アセンブラもある程度動作するようになったのでいつものUniversal Monitorを移植することにします。

しばらくボードを動かしていなかったので念のためにもう一度小さなプログラムを試してみましたが、何故か動作が変というかいきなり暴走している感じです。
原因はいくつか考えられます。

  1. ボードかCPUが壊れてしまった
  2. (リセット動作には不明な点が多いので)以前動いたのは偶然だった
  3. アセンブラが誤ったコードを吐いている

ハンドアセンブルと比較したり、以前と同じコードを試したりで3.で無いことはすぐに判明しました。

EMILY Board

テーマ:

メモリ基板、確かにメモリではあるのですがそれだけでもないので「EMILY Board」と名付けました。

Environment for Microprocessor Introduction ... の略というのはもちろん後からのこじつけで、二式大型飛行艇の連合国側コードネームからの命名です。

二式大型飛行艇
写真は鹿児島の鹿屋航空基地資料館に展示されている二式大型飛行艇、唯一の現存する機体のはずです。

これだけではなんなのでこれまで書かなかった資料編をお送りします。

コネクタ ピン配置

まずは基板上部のCPUボードへのコネクタです。

[UniMon] アセンブリ言語で書いている理由

テーマ:

現時点でも6800, 6809, 8080, AVR, Z8, Z80と多くのプロセッサで動いているUniversal Monitorですが、まだまだ対応プロセッサは増やすつもりでいます。

すでに完成したボードがあって動かせるMC68000、SBC8088ボード購入済みであとは組み立てるだけの8086/8088、6502/65C816あたりが次の候補ですね。

これだけの多プロセッサ展開を前提としているのになぜC言語を使わないのか不思議に思われるかもしれません。

そこで今回は何故オールアセンブリ言語なのか書いてみようと思います。

MB8861 と MB8870

予告どおり富士通のMB8861, MB8870です。

MB8861H
MB8861はMotorola MC6800の相当品ですが、いくつか独自の命令が追加されています。これは1979年製のようですね。

パッケージは中央に大きな円と下側に溝のある富士通独特の特徴あるスタイルです。今回は国内調達したのであまり心配はないのですが、海外からだとこのパッケージは(ニセモノの可能性が低いということで)安心材料の一つといえそうです。

さて、追加された命令の詳細を知りたいところなのですが、富士通のデバイスはデータシートの入手が難しいことが多く、このMB8861も入手できていません。ハード的にはMC6800と差し替え可能ということで、「リンク」に挙げたサイトの情報と実験をもとに動かしていきます。

[UniMon] レジスタ命令追加

カテゴリー:

8080, Z80, 6809に続いて6800用でもCPU判別を追加しようと思っているのですが情報があまりありません。

わかった範囲ではMC6800 ⇒ MC6801/MC6803 ⇒ HD6301/HD6303と改良されるにしたがって命令は追加されていますが、既存命令の挙動は変化が無いようです。これは互換性という点では非常にありがたいのですが、判別という点では困ったことです。

追加された命令の存在が確認できれば良いのですが、そのオペコードは旧プロセッサでは未定義なので何が起こるかわかりません。データシートにも記載は無いので試してみるしかないのです。

レジスタを設定し、問題の命令を実行し、レジスタがどう変化したかを地道に見ていく必要があります。

そこでレジスタを任意に設定して実行する機能、レジスタの内容を表示する機能を追加することにしました。これはデバッグにも有効です。

[UniMon] Z280のI/Oページに対応

カテゴリー:

Universal MonitorをZ280のI/Oページレジスタに対応させました。

先日のI/O命令追加はそもそもZ280ボードで内蔵UARTの検討用に始めたのですが、あのままではZ280内蔵デバイスへのアクセスには使えません。

Z280内蔵デバイスはI/Oページ0FEH, 0FFHに配置されています。I/OページレジスタはOS 8,FEなどとすれば変更できますが、0FEH, 0FFHに切り替えたとたんに外部I/Oデバイスへのアクセスができなくなります。現状コンソールを外部のZ80 SIOに頼っているのでこれではキー入力・画面出力が不能になってしまいます。

そこで"I", "O"コマンドで実際にI/Oアクセスする直前にI/Oページレジスタを変更し終わったら元に戻す必要があります。

ここまでは簡単ですが、コマンドをどうするのかは悩みました。

[UniMon] I/O命令追加

カテゴリー:

8080とZ80のUniversal MonitorにI/OアクセスのコマンドとCPU判別を追加しました。

  • I(nput)
    入力ポートから入力して表示します。
    1. I <port>
    2. IW <port> (Z280のみ)
    3. IS <port> (Z280のみ)

    1の形式では<port>番の入力ポートから8ビット幅で入力して表示します。2の形式では16ビット幅で入力して表示します。3の形式ではZ280のCPU制御/ステータス・レジスタを読んで表示します。
    Z80系では<port>は16ビットアドレスが使用可能です。

[UniMon] 固定エントリポイント

カテゴリー:

モニタとして必要最小限の機能はできたかなと思っていましたが、大事なものが抜けていました。

ユーザプログラムからモニタの内部ルーティンを呼び出す方法です。

大昔のトレーニングキットや初期のパソコンでは直接ROM内のルーティンを呼び出していました。基本的に完成したモニタなのでアドレスは変わりません。バージョンアップ時もよく使われるルーティンのアドレスは動かないように配慮されています。

でもこのUniversal Monitorはまだ発展途上です。

それでアドレス固定のエントリポイントを用意して、本来のルーティンへジャンプするようにしてみました。

Universal Monitor ソースコード

カテゴリー:

予告したUniversal Monitorのソースコードを公開します。

unimon-20190609.tgz がソースコードです。ビルド確認はNetBSD上で行いましたが、LinuxでもWindowsでもMacroassembler ASが動けばビルドは難しくないはずです。

ビルド方法はSBC6800用を例にとると次のようになります。

ページ