Whirlwindの命令と画面

このころのコンピューターは、アドレッシングモードが多くありません。直値(値を直接指定)すら使えず、必ずメモリアドレスを指定して、そのメモリに数値を用意しておくのが一般的でした。

Whirlwind 1 (WWI) の場合、命令は 16bitで構成されますが、このうち 11bit がアドレス、5bit が命令となっています。

11bit アドレスですから、メモリ空間は 2048word です。5bit 命令ですから、最大 32命令です。


計画当初の論文では、15命令が規定されています。およそ半分にしてあるのは、必要に応じて増やす予定だったと思われます。

また、完成はしたもののコアメモリ採用以前の1951年末に書かれた論文では、メモリは 1280word 、命令数は 27であると書かれています。

最終的にはメモリは 2048word 、命令数はなんと! 限界越えの 33 になっています。


目次

Whirlwindコンピューターの説明(本文ページ)


使用可能レジスタ

演算命令

加減算命令乗算命令除算命令シフト命令呼び出し命令ストア命令

完成後の追加命令群

周辺機器制御命令I/O 命令Flip-Flop reset 命令チェック命令ビット演算命令謎の命令

完成時の27命令って?

オシロスコープ

初期のもの中期のもの後期のもの

Whirlwind のアセンブラ(別ページ)


使用可能レジスタ

では、どんな命令が準備されていたのか見てみましょう。

…と、その前に前提知識を。


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レジスタを対象として加算を行います。ただし、結果はアキュムレータに入ります。


sa 命令は内部的には、 AC + x + Carry の順で加算を行います。この際、キャリー出力はありません。 AC + x の部分でキャリーを出力してしまうと、最後に使用する + Carry のデータが壊れてしまうためです。
このことは設計段階から認識されていたようで、この命令は「多倍長演算」ではなく、「2倍長(double-length)演算」命令とされています。
1952年に末に書かれた説明では、sa 命令はキャリーを発生しない、と注意を促す一文があります。
わざわざ注意を促すということは、「多倍長演算」も行われていて、注意深くプログラムする必要があったのでしょう。

ca10000Clear and Addクリアして加算
cs10001Clear and Subtractクリアして減算
ad10010ADd加算
su10011SUbtract減算
sa10101Special Addキャリー付加算
ao10110Add Oneメモリ内容の増加
cm10100Clear and add Magnitudeクリアして絶対値加算
dm10111Difference of Magnitude絶対値の差分
ab01100Add B-registerBレジスタとメモリの加算

乗算命令

アキュムレータに対し、メモリ内容の掛け算を行います。

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 とすれば、浮動小数点形式の出来上がりです。


浮動小数点は、現代的には 32bit を単精度、64bit を倍精度と呼ぶ。16bit で表現していたとすれば、「半精度」となる。
(ちなみに、現代的にも半精度浮動小数点は存在するが、指数部 5bit、仮数部 10bit で、工夫によって仮数部に 11bit の精度を持たせている)

mr11000Multiply and Round off乗算して下位切り捨て
mh11001Multiply and Hold full product乗算して全体を保持
sf11101Scale Factor浮動小数点の仮数部正規化?

除算命令

アキュムレータに対し、メモリ内容の割り算を行います。

結果は Bレジスタに入るため、割り算命令の後には次に説明する左シフトでアキュムレータに内容を移動する必要があります。

切り捨てを行う場合、左シフトの数で調整します。

dv11010DiVide乗算して下位切り捨て

次ページ: シフト命令


1 2 3 4 5 6 次ページ

(ページ作成 2013-02-09)
(最終更新 2013-02-15)

前記事:WWI 初の現代的コンピュータ     戻る     次記事:Whirlwindのアセンブラ
トップページへ

-- share --

1000

-- follow --




- Reverse Link -