現在地

MCS8085でUniversal Monitor


MCS8085でUniversal Monitorを動かそうとするとネックになるのは以下の二点です。

一つ目はUART機能が無いこと。シリアルI/O用としてSID, SODが引き出されているのでソフトウェアUARTを実装する必要があります。

二点目はROM容量が2kBと小さいこと。現状のUniversal Monitor 8080は約2.5kBのROMを必要としますから二割ほど減らさなくてはなりません。

これらの点を何とか解決できれば動かせそうです。

まずはソフトウェアUARTですが、基本的にはCOSMACのソフトウェアUARTをそのまま8085に移植しました。

ロジックができたら1ビットの時間を合わせます。SIDから読んだビットをそのままローテートしたりできて条件分岐の必要が無いのでクロックを数えるのはCOSMACより楽ですね。分岐があるとルートごとのクロック数を揃えなくてはなりません。

COSMACのときは結構ギリギリでNBR, NLBR命令を何個か挿入するだけですみましたが、8085ではかなり時間が余ったので以下のような時間待ちを入れました。

(1)   31/     7A5 : 0E 12               	MVI	C,S85R1L	;  7
(1)   32/     7A7 :                     CI0:
(1)   33/     7A7 : 0D                  	DCR	C		;  4
(1)   34/     7A8 : C2 A7 07            	JNZ	CI0		; 10 / 7
(1)   35/     7AB :                     	REPT	S85R1N
(1)   36/     7AB :                     	NOP			;  4
(1)   37/     7AB :                     	ENDM

31~34行はソフトウェアでS85R1L回ループします。回数を1増やすと14クロック余分に消費します。

35行以降はアセンブラのマクロ機能を利用してNOPを挿入します。1つで4クロックになります。

これらを組み合わせることで2クロック単位で調整ができます。さらに7クロックのORI 0なども組み合わせれば1クロック単位も可能ですが、そこまでは必要ないと判断しました。クロック2MHzで9600bpsの1ビットは200クロック程なので1%まで合わせられれば実用上困りません。

このような調整が送受信それぞれ2箇所に入っています。パラメータはまとめられるはずなのでいずれ集約するつもりですが、今は計4つごとにループ数とNOP数を設定しなくてはなりません。

ROMエミュレータの使えるSBC8085+アダプタ環境で動作確認を行ない、MCS8085向けにUARTパラメータを2MHz用から3MHz用に書き換えました。

続いてROMに収めるためのコード容量削減です。

R(egister)コマンドを抜くのが簡単で2kBに収まりますが、これはできれば残したいところです。

まずプログラム本体を0100H始まりにしていたのを、ブレーク用に0038HにJMP命令があるのでその直後からに詰めました。

MCS8085専用ということで8085以外のCPUは考える必要は無いのでCPU判別ルーチンを抜きました。さらにHEXファイルもモトローラSレコードは無くてもそれほど困らないだろうということでインテルHEX専用にしました。これで最終アドレスが0801Hになりました。あと2バイトです。

ふと初期化ルーチンを眺めているとワークエリアを0クリアするのにSHLDが並んでいるのが目に付いたので、これをループに書き換えて最終アドレスは07FAHになり2kB以下達成です。

以上をまとめて8755に書き込んだところ一発で動作し、特に問題はなさそうです。

参考文献・関連図書: 
鈴木哲哉(2021)『MCS8085技術資料』

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。