WWIの命令と画面
目次
シフト命令
アキュムレータとBレジスタの内容を、右または左にビットシフトします。
この命令だけが、アドレスを必要としません。代わりに、アドレス部分に入った数値の下位4bitを「シフトする数」として使用します。
N ビットシフトは、左シフトの場合 2Nを掛けたのと同じ意味を持ち、右シフトの場合 2Nで割ったのと同じ意味を持ちます。
アキュムレータが左、Bレジスタが右に位置し、つながっているものとみなされます。
1952年時点では、シフト命令は機能拡張されています。
まず、アドレス部分の数値は「下位4bit」ではなく「下位5bit」がとられるようになっていました。
これは、16bit のアキュムレータに対して、下位4bit では 15bit までしかシフトできず、Bレジスタと接続しているとみなしたときに「Bレジスタのすべてをアキュムレータに移動」ができないためだと思われます。
そして、その「Bレジスタに接続しているとみなす」機能が選択できるようになっています。
本来予定されていた動作をさせるためには、アドレス部分の最上位ビットを 1 にする必要があります。
ここが 0 だと、B レジスタが存在しておらず、そこには「0」しかないようにふるまいます。
(実際には、B レジスタが 0 クリアされます)
ニーモニックでは、レジスタの最上位ビットを 1 にする命令を sr* sl* のように、* を付けて表現しました。
1952年の末時点では、さらに「左サイクル」命令が追加されています。(1952年頭に書かれたサブルーチン集に登場しない、というだけで、追加時期は確定できません)
左シフトを行い、アキュムレータの左から「追い出された」ビットを、Bレジスタの右端に入れます。これにより、消えてしまうビットはなくなります。
これは、現在でいう「ローテート」命令です。シフトとは微妙に異なりますが、同じグループに入れておきます。
さらに、1952 年末の時点で、ニーモニックが変更になっています。* を付けるわかりにくい表記ではなく、Bレジスタクリアの有無が「別の命令」としてニーモニックが割り振られました。
sl sl* | 11011 | Shift Left | 左シフト |
---|---|---|---|
sr sr* | 11100 | Shift Right | 右シフト |
cl cl* | 11110 | Cycle Left | 左サイクル |
slr | 110110 | Shift Left and Round | 切り捨て左シフト |
slh | 110111 | Shift Left and Hold | 内容保持左シフト |
srr | 111000 | Shift Right and Round | 切り捨て右シフト |
srh | 111001 | Shift Right and Hold | 内容保持右シフト |
clc | 111100 | Cycle Left and Clear | クリアして左サイクル |
clh | 111101 | Cycle Left and Hold | 内容保持左サイクル |
呼び出し命令
呼び出し…というと、なんだかサブルーチンを呼び出すみたいです。
たしかにその目的で作られた命令なのですが、現代的な意味でのサブルーチンコールではなく、単にジャンプ命令です。
まだスタック構造は発明されておらず、return に相当する命令はありません。自己書き換えによって、サブルーチン最後のジャンプ命令のアドレスを書き換え、適切に戻れるようにする必要がありました。
無条件呼び出しは、指定されたアドレスにジャンプします。
条件呼び出しは、設計段階の記述では、アキュムレータが正の数(0を含まない)の場合のみ、指定アドレスにジャンプします。
しかし、実際の完成時には条件が逆になっており、アキュムレータが負の値を示している場合…つまり、最上位ビットが立っていれば指定アドレスにジャンプするようになっていたようです。
これらの呼出し命令は、実行時にプログラムカウンタをAレジスタにコピーします。この動作は計画当初のタイミングチャートには載っていないもので、1952年初頭までに追加された動作だと思われます。
普段は演算に使われるAレジスタですが、この動作の追加の意味については次の節で解説します。
sp | 01110 | SubProgram | 無条件呼び出し |
---|---|---|---|
cp | 01111 | Conditional Program | 条件呼び出し |
ストア命令
アキュムレータの内容を、メモリに書き込みます。
16bit すべてを書き込むこともできますし、アドレス部分の 11bit のみを書き込むこともできます。
11bit 書き込みの場合、命令部分 5bit は、以前のメモリ内容が保持されます。プログラムの自己書き換えテクニックが使用する際、アドレス部分のみの書き換えは非常に多く使われるため、重要な命令です。
1947年の計画当初では、メモリの書き込みと同時に、内容を CRT に出力する命令もありました。しかし、具体的にどのように表示を行うか、などは一切考えられていなかった様子がうかがわれます。
結局、この命令は完成時点ですでに実装されていません。当然、命令コードもありません。
1952年頭時点で、二つの命令が追加されているのが確認できます。
アキュムレータとメモリを1命令で交換する、ex 命令が追加されています。この命令は、当初別のニーモニックが割り振られていたようですが、このことは後述します。
ta 命令は、全命令の中で唯一の、Aレジスタを対象とする命令です。Aレジスタのアドレス部 11bit を、指定メモリに転送します。
「呼び出し命令」の節に書いた通り、呼び出し時にはAレジスタにプログラムカウンタがコピーされます。プログラムカウンタは、命令実行時にはすでにインクリメントされているので、この時点でAレジスタは「呼出し命令の次のアドレス」を格納しています。
このアドレス部分のみをメモリに書きだせる、ということは、命令の自己書き換えによってサブルーチンからの「復帰」命令を作り出せる、ということになります。
ts | 01000 | Transfer to Storage | メモリ書き込み |
---|---|---|---|
td | 01001 | Transfer to Digits | アドレス部分 11bit 書き込み |
sd | ----- | Store and Display | メモリと表示デバイスに書き込み |
ex | 01101 | EXchange | アキュムレータとメモリの交換 |
ta | 01010 | Transfer Address | 復帰アドレス(11bit)を書き込み |
計画当初に想定されていた15命令を含む命令群は、以上です。
これ以降、完成時までに追加された 27命令、もしくはその後追加された 33命令、ということになります。