
TI -990は、テキサス・インスツルメンツ(TI)が1970年代から1980年代にかけて販売した16ビットミニコンピュータのシリーズです。TIの以前のミニコンピュータシステムであるTI-960とTI-980の後継機種として登場しました。TI-990はいくつかの独自の革新的な機能を備え、前機種よりもプログラミングが容易になるように設計されていました。
その中核となる概念の一つは、ソフトウェアで切り替え可能なプロセッサレジスタセットを用いてマルチプログラミングをサポートする機能であり、これによりプログラム間の高速なコンテキストスイッチが可能になった。これは、メインメモリに格納されたレジスタ値を単一のポインタを変更するだけで切り替えることで実現される。
TIは後に、TI-990を単一チップであるTMS9900に実装しました。これは、初期の16ビットマイクロプロセッサの1つです。TI-990の低価格モデルでの使用を想定して設計されたこのチップは、990のメモリ間通信アーキテクチャを維持していました。このチップは、コスト削減策が徹底されたTI-99/4Aホームコンピュータで広く使用されましたが、性能面で大きな不利が生じました。
TI-990では、レジスタはメモリに格納され、ワークスペースポインタと呼ばれるハードウェアレジスタを介して参照されます。ワークスペースの概念は、メインメモリがTIが開発した新しい半導体RAMチップに基づいており、CPUと同じ速度で動作することにあります。つまり、「レジスタ」がCPU内の実際のレジスタであるか、メモリに格納されているかは関係ありませんでした。ワークスペースポインタにメモリアドレスがロードされると、そのアドレスがレジスタの起点となります。
990には、ワークスペースポインタ(WP)、プログラムカウンタ(PC)、ステータスレジスタ(ST)の3つのハードウェアレジスタしかありません。コンテキストスイッチでは、ハードウェアレジスタのみの保存と復元が行われます。
TI-990には、プラグインハードウェアを使用することで動作を拡張できる機能が備わっています。ハードウェアが接続されていない場合、CPUはトラップ状態になり、ソフトウェアがその機能を実行します。操作コード(XOP)では、システムに15個のデバイスを接続できますが、デバイス15はTIのオペレーティングシステムでスーパーバイザコール(SVC)用に予約されており、ユーザープログラムがI/Oやその他のオペレーティングシステムサービスを要求する際に使用されます。
TI-990は、かなり直交性の高い命令セットを備えています。命令フォーマットは、1ワード、2ワード、3ワードの命令に対応しています。モデル990/12のCPUは、拡張モード動作で4ワード命令に対応しています。
(Rは汎用レジスタで、0から15までの値をとります。)
いくつかのレジスタは、多くの命令において明確な目的を持っていました。それらは以下のとおりです。
990/4、990/5、990/9の命令セットは69個の命令で構成され、990/10は72個の命令、990/10Aは77個の命令、990/12は144個の命令で構成されていた。
命令は、アドレッシングモードと受け入れるオペランドの数に応じてグループ化されます。グループは、命令語内のビットフィールドの配置によって定義されます。命令語の左端のビットだけで、そのグループを識別するのに十分です。
ワードの最初のフィールドは実行する演算を指定し、残りの2つのフィールドはオペランドの位置を特定するための情報を提供する。
ワードの最初のフィールドは実行する操作を指定し、2番目のフィールドはJMP命令の場合は移動先への相対オフセット、CRUビットアドレッシングの場合は相対オフセットを指定します。
ワードの最初のフィールドは演算を指定し、2番目のフィールドはレジスタを提供し、3番目のフィールドは2番目のオペランドの位置を特定するための情報を提供する。
ワードの最初のフィールドは実行する演算を指定し、2番目のフィールドは演算のビット幅を示し、3番目のフィールドは2番目のオペランドの位置を示す情報を提供する。
ワードの最初のフィールドは実行する操作を指定し、2番目のフィールドはシフトカウント、3番目のフィールドはシフトするレジスタを指定します。
最初のフィールドは実行する演算を指定し、2番目のフィールドは2番目のオペランドの位置を特定するための情報を提供する。
その単語は、実行すべき操作を具体的に示していた。
最初のフィールドは演算を指定し、2番目のフィールドは該当する場合レジスタを指定します。3番目のフィールドは、該当する場合、2番目のワード内の即値オペランドを指定します。
ワードの最初のフィールドは演算を指定し、2番目のフィールドはレジスタを提供し、3番目のフィールドは2番目のオペランドの位置を特定するための情報を提供する。
最初のフィールドは操作を指定し、2番目のフィールドはマップファイル(0=カーネル、1=ユーザー)を指定し、3番目のフィールドはアドレスを持つレジスタを指定します。
指定されたマップファイルには、レジスターに記載されているアドレスから抽出した6つの単語が読み込まれています。
この命令は、990/10Aおよび990/12、またはメモリマップオプションがインストールされた990/10でサポートされています。
最初のワードはオペコードです。2番目のワードでは、最初のフィールドがバイト数フィールド、2番目のフィールドが宛先オペランド、3番目のフィールドがソースオペランドです。これらの命令は990/12でサポートされています。
多倍長命令により、1~15バイト長のオペランドに対して論理演算および整数演算が可能になりました。990/10Aでは、*SMおよび*AM命令がサポートされています。
最初のワードの最初のフィールドはオペコード、2番目のフィールドはチェックポイントレジスタを示します。2番目のワードの最初のフィールドはバイト数フィールド、2番目のフィールドは宛先オペランド、3番目のフィールドはソースオペランドです。これらの命令は990/12でサポートされています。
最初のワードはオペコードです。2番目のワードでは、最初のフィールドがバイト数フィールド、2番目のフィールドがシフト数、3番目のフィールドがソースオペランドです。これらの命令は990/12および990/10Aでサポートされています。
最初のワードはオペコード、2番目のワードの最初のフィールドは位置フィールド、2番目のフィールドはソースオペランドです。これらの命令は990/12でサポートされています。
最初のワードの最初のフィールドはオペコード、2番目のフィールドは幅を示します。2番目のワードの最初のフィールドは位置、2番目のフィールドはソースオペランドです。この命令は990/12でサポートされています。
最初のワードの最初のフィールドはオペコード、2番目のフィールドは幅を示します。2番目のワードの最初のフィールドは位置、2番目のフィールドは宛先オペランド、3番目のフィールドはソースオペランドです。これらの命令は990/12でサポートされています。
最初のワードはオペコード、2番目のワードの最初のフィールドは値フィールド、2番目のフィールドはレジスタ、3番目のフィールドは相対オフセットです。これらの命令は990/12でサポートされています。
ワードの最初のフィールドはオペコード、2番目のフィールドはレジスタ仕様です。これらの命令は990/12でサポートされています。
最初のワードはオペコードです。2番目のワードの最初のフィールドは宛先オペランド、2番目のフィールドはソースオペランドです。この命令は990/12でサポートされています。
最初のワードはオペコード、2番目のワードの最初のフィールドは条件コードフィールド、2番目のフィールドは宛先オペランド、3番目のフィールドはソースオペランドです。これらの命令は990/12でサポートされています。
最初のワードの最初のフィールドはオペコード、2番目のフィールドは宛先長を指定します。2番目のワードの最初のフィールドはソース長、2番目のフィールドは宛先オペランド、3番目のフィールドはソースオペランドを指定します。この命令は990/12でのみサポートされています。
TI-990アセンブラで記述された、 DX10環境で動作する完全な「Hello, world! 」プログラム:
IDT「こんにちは」 タイトル「HELLO - ハローワールドプログラム」 * DXOP SVC、15 SVCの定義 TMLUNO EQU 0 ターミナル LUNO * R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * データ WP、エントリ、0 * * ワークスペース(990ではレジスタを「プリロード」できます) * WPデータ 0 R0 データ 0 R1 データ >1600 R2 - プログラム終了 SVC データ >0000 R3 - オープンI/Oオペコード DATA >0B00 R4 - 書き込み I/O オペコード データ >0100 R5 - I/Oを閉じるオペコード データ文字列R6 - メッセージアドレス DATA STRLEN R7 - メッセージ長 データ 0 R8 データ 0 R9 データ 0 R10 データ 0 R11 データ 0 R12 データ 0 R13 データ 0 R14 データ 0 R15 * * ターミナルサービスブロック * TRMSCB BYTE 0 SVC オペコード (0 = 入出力) TRMERR バイト 0 エラーコード TRMOPC バイト 0 入出力オペコード TRMLUN BYTE TMLUNO LUNO TRMFLG データ 0 フラグ TRMBUF データ $-$ バッファアドレス TRMLRL データ $-$ 論理レコード長 TRMCHC データ $-$ 文字数 * * メッセージ * 文字列テキスト「こんにちは、世界!」 バイト >D,>A STRLEN EQU $-STRING 平 ページ * * メインプログラムへのエントリー * ENTRY MOVB R3,@TRMOPC SCB内のオープンオペコードを設定します SVC @TRMSCB ターミナルを開く MOVB @TRMERR,R0 エラーチェック JNE出口 MOVB R4,@TRMOPC 書き込みオペコードを設定する MOV R6,@TRMBUF バッファアドレスを設定します MOV R7,@TRMLRL 論理レコード長を設定します MOV R7,@TRMCHC と文字数 SVC @TRMSCB メッセージを書き込む MOVB @TRMERR,R0 エラーチェック JNEクローズ CLOSE MOVB R5,@TRMOPC クローズオペコードを設定します SVC @TRMSCB ターミナルを閉じる EXIT SVC R2 終了プログラム * 終わり
このプログラムは、TI-990シミュレータ上で実行できます。例えば、Dave Pitts氏の「sim990」はTI-990をエミュレートし、ネイティブオペレーティングシステム(DX10を含む)用のソフトウェアキットを同梱しています。
以下のプログラムは、CRUアドレス0に接続されたシリアル端末に印刷を行うスタンドアロン版です。このプログラムは、PRINTサブルーチンにおけるCRUの入出力とワークスペースの連携を示しています。
IDT「こんにちは」 タイトル「HELLO - ハローワールドプログラム」 * R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * * 端末CRUビット * TRMCRU EQU >0 端末デバイスアドレス 送信 EQU 8 DTR EQU 9 RTS EQU 10 WRQ EQU 11 RRQ EQU 12 NSF EQU 13 * ページ * * メインプログラムへのエントリー * エントリ LWPI WP ワークスペースポインターを読み込む BLWP @PRINT 印刷ルーチンを呼び出す データ文字列 データ文字列 アイドル * WP BSS 32 メインプログラムワークスペース * * メッセージ * 文字列テキスト「こんにちは、世界!」 バイト >D,>A STRLEN EQU $-STRING 平 ページ * * メッセージを印刷する * PRINT DATA PRWS,PRENT 家賃相当額 MOV *R14+,R2 バッファアドレスを取得 MOV *R14+,R1 メッセージ長を取得 SBO DTR 有効 端末準備完了 SBO RTS PRI010 LDCR *R2+,8 文字を送信する TB WRQ 完了するまでお待ちください JNE$-2 SBZ WRQ 12月R1 JGT PRI010 RTWP * PRWSデータ 0,0,0,0,0,0,0,0 データ 0,0,0,0,TRMCRU,0,0,0 * エントリ終了
TI-990プロセッサは、ベースとなった元の設計と使用するI/Oバスに応じて、いくつかの自然なグループに分類された。
全モデルとも、シリアルビットアドレス指定可能なI/Oバスである通信レジスタユニット(CRU)をサポートしています。また、上位モデルでは、DECの人気製品であるUNIBUSに類似したTILINE I/Oバスもサポートされています。TILINEはマスター/スレーブ関係にも対応しており、調停制御により、同一シャーシ内に複数のCPUボードを搭載することが可能です。
以下のモデルは、TILINEを主要な大容量ストレージバスとして使用しました。
以下のモデルは、CRUを主要バスとして使用しました。
TI-990には複数のオペレーティングシステムが用意されていた。
TIより:
第三者から: