Whirlwindの命令と画面
このころのコンピューターは、アドレッシングモードが多くありません。直値(値を直接指定)すら使えず、必ずメモリアドレスを指定して、そのメモリに数値を用意しておくのが一般的でした。
Whirlwind 1 (WWI) の場合、命令は 16bitで構成されますが、このうち 11bit がアドレス、5bit が命令となっています。
11bit アドレスですから、メモリ空間は 2048word です。5bit 命令ですから、最大 32命令です。
計画当初の論文では、15命令が規定されています。およそ半分にしてあるのは、必要に応じて増やす予定だったと思われます。
また、完成はしたもののコアメモリ採用以前の1951年末に書かれた論文では、メモリは 1280word 、命令数は 27であると書かれています。
最終的にはメモリは 2048word 、命令数はなんと! 限界越えの 33 になっています。
目次
使用可能レジスタ
では、どんな命令が準備されていたのか見てみましょう。
…と、その前に前提知識を。
WWI では、値が記憶できるものをすべて「レジスタ」と呼んでいます。メモリもレジスタですし、外部に接続されているトグルスイッチもレジスタです。
現代的な意味のレジスタとしては、プログラムカウンタ、チェックレジスタ、アキュムレータ、Aレジスタ、Bレジスタの5本のレジスタがありました。
プログラムカウンタは、現在のプログラムの実行位置を示します。チェックレジスタは、システムが自分自身のデータ転送などに誤りがないかチェックするためのものです。
アキュムレータはユーザーが自由に使えるレジスタです。B レジスタは、計算によってアキュムレータを補佐するように、自動的に使われます。
残るは Aレジスタですが、これは「アキュムレータとの演算」に暗黙のうちに自動的に使われ、ユーザーから見えることはありません。
どういうことかというと、指定されたメモリアドレスから取得された数値は、まず Aレジスタに送られるのです。その後、アキュムレータとAレジスタの間で演算が行われます。
メモリを直接使用しないのは、いくら高速のメモリを使用しても、真空管の速度よりは遅いからでしょう。メモリの仕様が決定していないので、リスクを避ける意味もあったかもしれません。
ともかく、上記のような状態ですので、すべての命令は基本的に「アキュムレータ」を対象にしています。時々、補助的に Bレジスタが顔を出します。
演算命令
以下、命令は、ニーモニック、命令バイナリ、英語表記、日本語の意味で書きます。
設計段階の 1947時点から規定されていて、最終的に残された命令は、ニーモニックを黒で示します。
完成時以降に追加された命令は、赤で示します。
最終的に削除された命令は、打消し線で示します。
加減算命令
アキュムレータに対し、メモリ内容の加減算を行います。
同時に、アキュムレータクリアの指定が可能です。(クリアして加算は、アキュムレータへのロード命令と同等になります。また、クリアして減算は、数値の符号を逆にすることになります。)
他にキャリー付加算命令があり、2倍長数値の加算が可能となっています。
加減算は重要な機能なので、完成後の追加命令が多いです。
1952年初頭時点で、ao と cm が確認されています。
ao はインクリメント命令(Add One)。メモリの内容を1増加し、アキュムレータにも読み込みます。
cm は、メモリ内容を「絶対値」としてアキュムレータに読み込みます(Clear and Magnitude)。M は Magnitude 、絶対値の意味です。
1952年末時点では、さらに2命令が確認されます。
dm は、絶対値の差分命令。アキュムレータとメモリそれぞれの絶対値の差を取り、アキュムレータに入れます。ややこしいので式にすると、AC←|AC|-|X| です。
ab 命令では、アキュムレータではなく、Bレジスタを対象として加算を行います。ただし、結果はアキュムレータに入ります。
このことは設計段階から認識されていたようで、この命令は「多倍長演算」ではなく、「2倍長(double-length)演算」命令とされています。
1952年に末に書かれた説明では、sa 命令はキャリーを発生しない、と注意を促す一文があります。
わざわざ注意を促すということは、「多倍長演算」も行われていて、注意深くプログラムする必要があったのでしょう。
ca | 10000 | Clear and Add | クリアして加算 |
---|---|---|---|
cs | 10001 | Clear and Subtract | クリアして減算 |
ad | 10010 | ADd | 加算 |
su | 10011 | SUbtract | 減算 |
sa | 10101 | Special Add | キャリー付加算 |
ao | 10110 | Add One | メモリ内容の増加 |
cm | 10100 | Clear and add Magnitude | クリアして絶対値加算 |
dm | 10111 | Difference of Magnitude | 絶対値の差分 |
ab | 01100 | Add B-register | Bレジスタとメモリの加算 |
乗算命令
アキュムレータに対し、メモリ内容の掛け算を行います。
16bit x 16bit ですが、最上ビットを「符号」とみなすため、結果は 30bit になります。(1の補数表現で演算されます)。この結果は、アキュムレータに符号と上位 14bit 、Bレジスタに下位 16bit が入ります。
下位部分まで完全に計算するか、上位が求まった時点で打ち切るか選べます。
(打ち切り可能なのは、有効数字を16bit として、高速性を重視するためと思われる)
1952年末時点で sf 命令が追加されていますが…どうも、説明を読んでもよくわかりません。
1951年末に書かれた論文では、「浮動小数点を扱いやすくするための命令がある」とのことです。おそらくは、これがその命令。
具体的には、アキュムレータと Bレジスタを連結した 32bit を浮動小数点演算の仮数部とみなし、正規化します。2進数の浮動小数点が 0.1xxxxx という状態(10進数で書けば、0.5 以上)になるようにする、ということ。
そして、この上位 11bit を、指定されたメモリの下位 11bit に書き込みます。メモリの上位 5bit は影響をうけません。
符号部 1bit 、指数部 4bit 、仮数部 11bit とすれば、浮動小数点形式の出来上がりです。
(ちなみに、現代的にも半精度浮動小数点は存在するが、指数部 5bit、仮数部 10bit で、工夫によって仮数部に 11bit の精度を持たせている)
mr | 11000 | Multiply and Round off | 乗算して下位切り捨て |
---|---|---|---|
mh | 11001 | Multiply and Hold full product | 乗算して全体を保持 |
sf | 11101 | Scale Factor | 浮動小数点の仮数部正規化? |
除算命令
アキュムレータに対し、メモリ内容の割り算を行います。
結果は Bレジスタに入るため、割り算命令の後には次に説明する左シフトでアキュムレータに内容を移動する必要があります。
切り捨てを行う場合、左シフトの数で調整します。
dv | 11010 | DiVide | 乗算して下位切り捨て |
---|