2020-11-30 17:29 — asano
カテゴリー:
ちょうどTMP90C840用にUniversal Monitorの修正をしている最中、F3850+F3853用の試作基板を貰えることになり組み立て・動作確認をしていたため、予想以上に遅くなってしまいました。
TMP90C840ボードは以前のTMP90P802ボード用に書かれているUniversal Monitor TLCS-90そのままでも動作し0000H~0FFFFHまでの64kBのメモリ空間が使えますが、TMP90C840は最大1MBまでのメモリ空間をサポートしていますのでそれを使えるように拡張します。
64kBを超えるアドレス10000H~0FFFFFHまでのメモリは(IX+d)
, (IY+d)
のいずれかのアドレッシングモードでのみアクセス可能です。つまり実行コードやスタックは64kBまでしか使用できません。モニタのワークエリアは64kB超の空間に置くことも出来ますが大したサイズではないのでこれまで通り64kB以内に置くことにします。
そうすると対応しなければならないのはD
, S
, P
, L
, I
, O
の各コマンドです。
まずこれらのコマンドでメモリをアクセスしている箇所を上記アドレッシングモードに書き換える必要があります。IX
, IY
の各レジスタの使用状況を確認すると、IX
は一部で使用されていますが、IY
はまったくの未使用でした。変更が必要なメモリアクセスは主に(HL)
、一部(DE)
が使われていますのでこれを(IY+d)
(正確にはディスプレースメントを省略した(IY)
)の形式に変更します。本来レジスタを入れ替えるのが望ましいのですが、IY
は完全にHL
, DE
の代わりには使用できないのでこれまで通りHL
, DE
を使用しアクセスの直前にIY
に代入する形式を中心に書き換えました。
不足する4ビットのアドレスはバンクレジスタBY
に入れるのですが、これはパラメータの解釈ルーチンの変更が必要になるのでとりあえず後に回しておいて、16ビットアドレスと20ビットアドレスを識別する方法を考えてみます。
まず識別方法の検討や実験のためにR(egister)コマンドがあると便利なのでZ80用を元に移植しました。実際にはBX
, BY
レジスタはメモリ空間にマップされているので無くても出来ないことはないのですが、Z80 ⇒ TLCS-90の移植はほぼコピーで済むほど容易なのと、今後も利用価値は高いと思われるので、この際移植することにしました。SWI
命令がAF
レジスタをスタックに積むのに気づくのが遅れた以外は特に問題なく動きました。
識別も思っていたより容易でした。BX
, BY
レジスタは無効なビットは何を書いても"1"が読み出されます。00Hを書き込んでから読み出して、0FFHなら16ビットアドレス(64kB)、0F0Hなら20ビットアドレス(1MB)です。
それでは後回しにしたバンクレジスタBY
の指定です。これは20ビットアドレス対応コマンドのパラメータとして<バンク>:<アドレス>
の形式が使えるように拡張しました。8086版のセグメントと同じ形式です。
これでテスト始めたのですが、なぜかバンク1にアクセスできません。
データシート読み直すとA16~A19はP4CR
レジスタ設定しないと出力されないんですね。1ビット単位で必要なだけアドレス出力が可能です。逆に言うと大きなメモリが必要なければ出力ポートとして利用できます。
これで20ビット対応は完了となります。
2行目の「Addr20
」で20ビットアドレスを認識していますね。バンクを切り替えると異なるメモリへアクセスしていることもわかります。
同じことをTMP90P802ボードでやってみると...
バンクの指定はエラーとなり、レジスタ表示でもBX
, BY
は省略されます。
コメントを追加