現在地

TMP90C840ボード(ソフトウェア編)


ちょうど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)です。

00Hが読み出されれば24ビットアドレスのはずですが、そのようなデバイスは実在したのでしょうか? たしかTLCS-900か何かのドキュメントでTLCS-90のアドレスを24ビットとするのを読んだ記憶があるのですが...

それでは後回しにしたバンクレジスタBYの指定です。これは20ビットアドレス対応コマンドのパラメータとして<バンク>:<アドレス>の形式が使えるように拡張しました。8086版のセグメントと同じ形式です。

これでテスト始めたのですが、なぜかバンク1にアクセスできません。

データシート読み直すとA16A19P4CRレジスタ設定しないと出力されないんですね。1ビット単位で必要なだけアドレス出力が可能です。逆に言うと大きなメモリが必要なければ出力ポートとして利用できます。

これで20ビット対応は完了となります。


2行目の「Addr20」で20ビットアドレスを認識していますね。バンクを切り替えると異なるメモリへアクセスしていることもわかります。

同じことをTMP90P802ボードでやってみると...


16ビットアドレスと認識しています。

バンクの指定はエラーとなり、レジスタ表示でもBX, BYは省略されます。

参考文献・関連図書: 
TMP90C840データシート, Toshiba.
TMP90C840A/841Aデータシート, Toshiba

コメントを追加

Plain text

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