1983年製のTMS9995で、ごく普通のパッケージですね。
基本的なアーキテクチャはTMS9900の方を参照していただくとして、それを継承しているTMS9995も汎用レジスタはメモリ上に持ちます。たとえばレジスタレジスタ間の加算を実行する場合、命令フェッチの1回のアクセスは別にしても、加算すべきふたつのデータをレジスタから読み出すのに2回のメモリアクセスと、結果をレジスタに書きこむためのメモリアクセス、計3回のメモリアクセスが必要です。あるレジスタの内容をレジスタ間接オートインクリメントモードでメモリに保存する場合には、命令フェッチ後の実行サイクルで4回のメモリアクセスが発生します。このように、TMS9900ファミリのプログラムは、どうしてもひんぱんにデータ用のメモリを参照する必要があります。メモリの読み書きの性能によってプログラム速度に重大な影響が生じやすいアーキテクチャです。このままでは8
bitデータバス化したTMS9995は著しく処理速度が低下しそうです。さて、TMS9995には256
Byte分のRWMが内蔵されています。このメモリはチップ上でプロセッサに16 bitデータパスで接続されていて、しかもノーウェイトサイクルで読み書き可能です。実はTMS9995に12
MHzの水晶発振子を接続して最高クロック周波数で動作させた場合、外部メモリのノーウェイトサイクルでのアクセスタイムは115
nsとなります。当時の標準的なメモリのアクセスタイムは250 nsから450 ns程度ですから、少なくともウェイトサイクルひとつは必要となります。1ウェイト入れた場合のアクセスタイムは448
nsとなり、標準的なメモリを接続しやすくなります。
ちょっと横道にそれますが、当時のTMS9995を採用したパーソナルコンピュータで約10.7
MHz(NTSC信号のカラーサブキャリアの3倍の周波数)の水晶発振子を使用していたのは、もちろんTMS9918でカラーTV表示を行う都合もあるでしょうけど、アクセスタイム450
nsの安価なメモリを余裕をもって使用したいためもあったのではないかと思います。
とにかく、TMS9995の内蔵メモリへのアクセスは、普通のメモリをTMS9900に外付けした場合より高速となります。そのため、汎用レジスタ群や繰り返しアクセスされる作業用データ領域を内蔵メモリに割り当てれば、外部バスが8
bit幅である影響を受けにくくなります。このほか、命令解釈方式にもTMS9900より改良が行われていて、トータルでTMS9900より高性能なプロセッサに仕上がっています。
追加された命令は次の4種類です。
MPYS d 01C0 Multiply Signed
R0 * s -> (R0, R1)
DIVS d 0180 Divide Signed
(R0, R1)/s -> (R0, R1)
LST r 0080 Load Status Register
r -> ST
LWP r 0090 Load WP
r -> WP
符号付きの乗除算と汎用レジスタからSTやWPへのデータ転送命令です。
MPYS命令とDIVS命令はタイプ6命令の変形で、オペコードの下位6 bitがアドレッシングモードとそれに使用するレジスタ指定となっています。TMS9900から存在する符号なしの乗除算命令では対象レジスタも選べましたが、この新設命令の場合はR0とR1専用です。DIVS命令の商はR0に、剰余はR1に入ります。
LST命令とLWP命令はタイプ8命令の変形で、オペコードの下位4 bitがソースレジスタ指定となります。STST命令やSTWP命令の逆を行う命令で、この命令が追加されたおかげで汎用レジスタを現在使用中の位置から一定量ずらして利用するといった操作をプログラムで実現しやすくなりました。
メモリマップはこのようになっています。
アドレス | 用途 |
0000 | リセットベクタ |
0004 | INT1ベクタ |
0008 | MID/オーバーフローベクタ |
000C | 減算カウンタベクタ |
0010 | IN4/イベントカウンタベクタ |
0014 | 汎用メモリ |
0040 | XOPベクタ |
0080 | 汎用メモリ |
F000 | 内蔵RWM |
F0FC | 汎用メモリ |
FFFA | 減算カウンタ(内蔵I/O) |
FFFC | NMIベクタ(内蔵RWM) |
以上のメモリマップで内蔵とされていない領域は、すべて外部にメモリやI/Oを接続したうえで利用できます。
一般的にはアドレス0000からROMを接続し、F100付近にI/Oポートをメモリマップ接続して、内蔵RWMで不足の作業領域を残りの汎用メモリ領域に割り当てることになるでしょう。
Return to IC Collection