TX-0 の拡張
TX-0 は、手作りのプロトタイプコンピューターでした。
そして、TX-0 は、4つしか命令を持っていませんでした。
TX-0 は、完全に動作するコンピューターではありましたが、使いやすいコンピューターではありませんでした。命令が少なすぎるのです。
そして、手作りであるということは、自分たちの手で改造することもできるということです。利用者が、利用者の立場で「あったら便利な命令」を考案し、TX-0 は拡張されていきます。
今回は、TX-0 が拡張されていく様子と、最終的な命令の紹介です。
目次
最初の拡張
1959年の5月に、TX-0 に新たな命令を追加した、という公式文書が発行されています。
TX-0 では、1ワード 18bit のうち、命令は 2bit 、その命令で使うアドレスは 16bit で示されていました。
しかし、この時点での TX-0 は 4kword しかメモリを持ちません。メモリは高価なので、今後拡張することがあったとしても、最大容量まで搭載されることはなさそうです。
そこで、この時の拡張では、アドレスを 14bit にし、余った 2bit を使って命令を 4bit に拡張する、ということが行われています。
この拡張で、命令が1つと、機能が2つ追加されています。
まずは新命令。
1010 | tra | TRAnsfer | 無条件分岐 |
---|
もともと 10 は trn 、条件分岐でした。しかし、4Kword の TX-0 では、10 の後ろは必ず 00 になっています。
そこで、この部分の先頭ビットを 1 にすることで新たな命令を作り出し、互換性も確保するという巧妙な作りでした。
同時に、opr 命令で使える機能が2つ、追加されています。
bit9-11,15 | |||
0011 | orl | OR Lr | 論理和 |
---|---|---|---|
0111 | anl | ANd Lr | 論理積 |
TX-0 には、すでに xor (排他的論理和) と not (論理否定) を求める方法がありました。
これで、4つの論理演算すべてがそろったことになります。
or と and は、AC と LR の間で演算を行い、結果を LR に残すようになっていました。
xor や not は AC と MBR が対象なので、なぜ LR にしたのかは不明です。
回路の都合かもしれませんし、綿密な調査の結果、頻繁に使われる AC や MBR よりも、LR に残したほうが便利そうだったのかもしれません。
これまで、opr 命令では、bit9,10 と、bit 11,15 がそれぞれセットになっていました。
bit 11,15 で離れたビットがセットになっているのは、後から無理やり機能を追加した影響です。
2つの機能は同時には使えない、と言うことを示すため、どちらか片方の bit しか 1 にできないことになっていました。
そこで、bit 11,15 を両方 1 にしたときを新機能の選択として、bit 9,10 で機能を選ぶ方法が取られています。
次の拡張
命令長を4ビットにしてしまう、という大胆な方法が成功したため、すぐに次の拡張が行われています。
7月に、さらに2命令が追加されました。
0010 | slr | Store LR | LR を指定メモリに保存 |
---|---|---|---|
0110 | llr | Load LR | LR を指定メモリから読み込み |
LR (Live Register) は、いろいろなことに使われるレジスタです。メモリの一部にマッピングしてアドレスを与えることもできますし、Flxeowiter からの入力を受け取ったり、データの一時保存に使われたりもします。
内部的に演算で使用されたりするので、不意に破壊されることもあり得ます。
この守備範囲の広さの割には、使用できる命令が貧弱でした。
追加された命令によって、一時的なデータ保存ができるようになれば、データ破壊を防いでさらに便利に使えるようになります。
大規模拡張案
2つの「実験的拡張」は大成功でした。
これをうけて、1959年の8月に、TX-0 のさらなる拡張案が提案されています。
提案の概要をまとめると、こういうことでした。
opr 命令で使うビットフィールドを再編したい。
and , or の命令を追加するときには、非常に巧妙な方法を使いました。
しかし、このような方法での拡張はそう長くは続けられません。
そこで、ビットフィールドを思い切って再編し、今後の拡張を行いやすくしたい、と言う提案でした。
互換性にはある程度気を使っていますが、基本的に「互換性が失われる」提案です。
インデックスレジスタを追加したい。
これは、指定したアドレスにさらにインデックスレジスタの値を足したアドレスにアクセスする場合に使います。
これを「インデックスレジスタ相対アドレッシング」と呼びます。
なにやらややこしそうですが、これがあると、プログラムにはほぼ必須と言って良い、配列変数が作れます。
無くても同じことはできますが、非常に複雑なテクニックを駆使することになります。
この「提案」には、いろいろな意見が出たようです。
しばらくは、実際の拡張は行われず、提案が続きます。
そのうち、次の大改造時には磁気テープ装置を導入しよう、というような提案も出ます。
磁気テープ装置の導入、というと周辺機器だけの話に思われがちですが、それを操作する命令も一緒に追加する必要があります。
これは、「命令の拡張案」でもあるのです。
決定された拡張案
9か月後の1960年5月、拡張案がまとまり、公式文書となります。
ただし、これは「長期的な」拡張計画でした。
実際には、少しづつ拡張していくうえで問題も見つかり、修正され、最終的には違うものになっています。
しかし、ここでは方針が示されたことが重要です。
次のような方法で拡張されることになりました。
レジスタの追加
提案にあったとおり、インデックスレジスタ(XR)が追加されました。
XR は、14bit のレジスタです。
また、プログラムフラグレジスタ(PFR)が追加されました。
これは opr 命令で使用することが出来ます。
すでに命令長は 4bit に拡張されていましたが、さらにアドレスが減らされ、 1bit が「インデックス相対アドレッシング」の指定に使用されることになりました。
過去のプログラムでは、このビットは必ず 0 のはずですので、今まで通り動作します。
相対アドレッシングでは、指定されたアドレスに、インデックスレジスタの値を足したアドレスに対してアクセスが行われます。
(XR は負の数も使えます。足す、と書きましたが、引くこともできることになります)
こうすることで、配列変数などを簡単に作れるようになります。