後期TX-0命令
目次
命令の増加
インデックス相対アドレッシングの指定も含め、命令長が 5bit になりました。
命令も大幅に増加しています。
代償として、増えたビット数の分だけメモリ空間が減っています。メモリアドレスは 13bit になりました。
実際の命令追加は、かなり後に行われたようです
1960年の改造後の命令表ではまだ命令は増えておらず、XRも記載されていません。
1961年6月の命令表だと、XR は書かれているのに使用する命令がありません。
1962年11月の新アセンブラの使用法の例では、命令が使用できるのがわかります。
少し前の9月に作られたサブルーチンでは、すでに新命令が一部使われているので、この時点では使えるようになっていたのでしょう。
どうも、1961年後半から1962年前半の間のどこかで改造され、命令が大幅に増やされたようです。
XR 相対アドレッシングも、この改造まで使えなかったのではないかと思います。
命令表は 1960年の M-5001-27 に始まり、1961年には M-5001-27-1 が発行されている。
しかし、次の枝番である「-2」は紛失してしまったようで公開されていない。
-3 は 1965年、-4 は 1966年だ。基本的に、6~7月に発行されている。
発行が6~7月なのは、大学がこの時期に長い夏休みに入るからだ。大改造は、大抵この期間に行われた。
だからおそらく、-2 の発行は 1962年で、これを受けて新たなアセンブラが作られ、11月に使用法の文書が発行されたのだろう。
余談になるが、文書番号36が1961年7月、37が1962年11月で、1年以上も新規の公式文書が作られていない。また、この間に発行された「枝番」は少なくとも現在収集・公開されていない。
公式文書の中から手がかりを拾って改造時期を特定するのも、現在のところ望み薄だ。
メモリの増加
それまで 4k word しかなかったメモリが、倍の 8k word に増設されました。
bit 数でいえば、13bit アドレスです。
先に書いた通り、改造により TX-0 はのメモリ空間は 13bit になっていました。つまり、この増設で最大容量に達したことになります。
メモリが 13bit なのに XR は 14bit ありますが、これは XR が負の値も表現できるようにするためです。
opr 命令フィールドの再編
具体的には、これまで別々の機能だった bit 4,5 と bit 6~8 がまとめられ、入出力用のフィールドとなりました。
もともと、bit 6~8 を使用する際は、bit 4,5 を 10 (ios機能の選択)にセットする必要がありました。ならば、全部まとめてしまえ、と言うことでしょう。
そして、ios 機能はなくなりました。周辺機器アクセスのために TX-0 が停止しなくてはならないときは、適切に停止してくれます。
これで、周辺機器アクセスの命令フィールドが、事実上 3bit から 5bit に拡張されます。
いままで使われていた周辺機器は、ios に相当する bit が 1 になっている数値に割り振られます。
つまり、互換性は保たれています。
他にも、tac,tmb,pen 命令の再編が提案されています。
これらは事実上周辺機器なのに、周辺機器ではない扱いで、専用の bit を割り振られているためです。
上に書いた 5bit の中に入れてしまえば、空いたフィールドを別の用途に使えるようになりますが、こちらは、互換性のなくなる提案です。
1960年の改造は主に opr フィールドの改造でしたが、bit4~8の再編が中心で、tac,tmb,pen 命令に関してはそのままでした。
つまり、互換性を保ったまま改造されたことになります。
詳細な命令
命令が増えたので、細かく紹介していくときりがありません。ざっくり行きます。
まず、1960年の大改造では、主に影響を受けたのは opr 命令のビットフィールドでした。
命令は元の4命令に加え、これまでに追加した3命令の合計7命令のままです。
この後、何度も改造が行われ、「入れてみたけど使い勝手が悪かった」ような命令は別の命令に変更されたりしたようです。
ここでは、1966年9月の文書を元にしています。
以下、命令 5bit を2進数で示し、命令語、英語の意味、日本語の説明を書きます。
Store Class 命令
00000 | sto | Store | AC の内容を指定メモリに保存 |
---|---|---|---|
00001 | stx | Store indeXed | AC の内容を相対指定メモリに保存 |
00010 | sxa | Store indeX in Address | XR の内容で、指定メモリのアドレス部分のみ書き換え |
00011 | ado | ADd One | 示されたメモリの内容を 1 増加(AC にも同じ内容が入る) |
00100 | slr | Store LR | LR の内容を指定メモリに保存 |
00101 | slx | Store Lr indeXed | LR の内容を相対指定メモリに保存 |
00110 | stz | Store Zero | 指定メモリの内容を 0 クリア |
sto と slr 命令のビットが、拡張前と変わっていないことにご注意ください。
互換性を保ったまま拡張を行っています。
末尾が 1 のものは、基本的にインデックスレジスタ相対アドレッシングです。
ado だけは、違う命令となっています。これは、XR を使用する命令での相対アドレッシングに意味がないためです。
Add Class 命令
01000 | add | ADD | AC に指定メモリの内容を加算 |
---|---|---|---|
01001 | adx | ADd indeXed | AC に相対指定メモリの内容を加算 |
01010 | ldx | LoaD indeX | XR に指定メモリの内容を読み込み |
01011 | aux | Augment indeX | XR に指定メモリのアドレスを加算 |
01100 | llr | Load LR | LR に指定メモリの内容を読み込み |
01101 | llx | Load Lr indeX | LR に相対指定メモリの内容を読み込み |
01110 | lda | LoaD Ac | AC に指定メモリの内容を読み込み |
01111 | lax | Load Ac indeXed | ACに相対指定メモリの内容を読み込み |
add と llr 命令のビットが、拡張前と変わっていないことにご注意ください。
末尾ビットに関しては、XR 関連の命令は違う、というのは sto と同じです。
しかし、先頭 2bit が命令グループ、続く 2bit がレジスタ選択…という規則性が sto 命令の系列とそろえてあります。
なかなか美しい命令配置だと思います。
中央 2bit が 11 のものは、AC への直接ロード。
普通のコンピューターにはあって当たり前の命令ですが、TX-0 には今までありませんでした。
やはり、あった方が便利だと判断されたのでしょうね。
Transfer Class 命令
10000 | trn | TRansfer Negative | AC が負のとき、指定アドレスに条件分岐 |
---|---|---|---|
10001 | tze | Transfer Zero | AC が0のとき、指定アドレスに条件分岐 |
10010 | tsx | Transfer Set indeX | PC を XR に保存し、指定アドレスに無条件分岐 |
10011 | tix | Transfer IndeX | XR が 0 でないとき XR を1減らし、指定アドレスに分岐 |
10100 | tra | Transfer | 指定アドレスに無条件分岐。 |
10101 | trx | Transfer indeXed | 相対指定アドレスに無条件分岐 |
10110 | tlv | Transfer external Level | 外部入力の電圧が 0 なら分岐 |
さすがに、条件分岐のビット配置は sto add などと規則性が違います。
しかし、やはり互換性を保ったまま命令拡張されています。
分岐時に XR に「分岐元」アドレスを残すこともできるようになりました。
これで、分岐先で XR を使って、sxa を使ってアドレス部分の「自己書き換え」を行えば、サブルーチンからの復帰が可能になります。
tix は、XR をカウンタ変数にしたループ命令です。「ループ命令」は分岐と比べるとループに特化した「高級命令」であるため、この時代に作られていたことに驚きます。
なお、書き切れなかったので上の命令の説明には入っていませんが、XR が負の場合、符号はそのままに絶対値を減算します。…つまり、加算になります。