2021-11-08 23:12 — asano
カテゴリー:
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に書き込んだところ一発で動作し、特に問題はなさそうです。
コメントを追加