SSEC のプログラム方法
目次
バスの指定(b)
先に書きましたが、バスが8本あり、必ずバスに接続されたレジスタに受け取らないと、データは使えませんでした。
この指定が1桁。
レジスタは1~8の番号で示し、必ず指定する必要がありました。
周辺機器番号が 000 の場合(テープに穴が無い状態)は、レジスタをそのまま使用します。
書き込み時は、レジスタに書き込むだけで、周辺機器にはデータを送りません。
読み込み時は、レジスタに書いてある値をそのまま使い、周辺機器からデータを受け取りません。
SSEC はクロック同期式ではなく、各種準備が整えば動く、という形式でした。
そのため、真空管で作られているレジスタを活用すれば、高速に動作することができます。
そのほかの設定(s)
残る1桁は、データの扱いを示します。
まず、そのデータが「書き込み」なのか「読み込み」なのかを決める必要がありました。
現代の CPU では、命令の中のデータの指定位置で、読み込みと書き込みが決定します。
たとえば、Z80 で LD A,B と書くと、「B の内容を A に入れる」という意味です。決して逆にはなりません。
CPU ごとに位置の持つ意味合いは異なりますが、データを示す位置は重要なのです。
しかし、SSEC では指定位置には大きな意味はなく、別の数値で扱いを決める必要がありました。
読み取りの際は、その符号の扱いを決定します。
0) 符号を強制的に正に
1) 符号を逆に
2) 符号はそのまま
3) 符号を強制的に負に
SSEC では、加算命令はありますが、減算命令がありません。
しかし、符号を逆にして加算すれば、減算したことになります。
書き込みの際は、数値の桁をシフトしてから書き込みができます。
4) 0~ 9の範囲で右シフト
5) 0~ 9の範囲で左シフト
6) 10~19の範囲で右シフト
7) 10~19の範囲で左シフト
8) 20~29の範囲で右シフト
9) 20~29の範囲で左シフト
シフトの「1の位」は、別途指定します。
SSEC が 19桁までしか扱えないのに、20以上の数が指定可能な理由は、後で書きます。
データの扱いの1桁を、0~3にすれば読み込み、4~9 にすれば書き込みを意味します。
四つ組
SSEC の命令は四つ組になっています。
SSEC の前身(?)であるハーバード・マーク1は、歯車計算機でした。そのため、データを「格納する」という概念がありません。
データの転送は、常に足し算になります。単に転送したい場合、先に 0 にクリアしてから足し算します。
実はこの考え方は現代の CPU にも名残が残っていて、たとえば Z80 で ADD A,B は「足し算する」命令…ではありません。
B の値の分だけ A を増加させる、歯車計算機のように A を変化させる命令です。結果として足し算になるだけです。
現在 Windows でも Mac でも使われている、Intel x86 系プロセッサでは、基本的にこの形式で演算を行います。
命令と2つのデータ、3つの要素が組み合わされるので、「三つ組」と呼びます。
SSEC の内部、IBM 603 は集計機なのでまさに「累積」していくのですが、それは周辺機器のアクセスとは無関係です。
1命令ごとにアキュムレータをクリアし、外から得た2つのデータをアキュムレータに送り(これで加算になる)、結果を外に送り出す、というのが基本動作でした。
そのため、入力データ2つと出力データ置場の指定、そして命令の4つの要素を指定しなくてはなりません。「四つ組」と呼ばれる形式です。
実は、近代的な CPU では、四つ組の方が一般的です。入力に指定したデータが勝手に書き変わるなどの動作が無く、コンパイラが作りやすいためです。
逆に言えば、四つ組の CPU はコンパイラが前提であり、アセンブラをいじる人が減ったため、あまり馴染みがないのですが…。
実行ユニット
さて、全体構造と、その全体構造を使いこなすためのデータ構造を知ってもらったところで、プログラム方法です。
まず、SSEC は同時に2命令を読み込み、順次実行します。
最初に見てもらった「全体構造図」で、命令記憶回路に A B と書いてあったのを覚えてますでしょうか?
これは、2命令が同時に格納されることを意味していたのです。
プログラムが紙テープという「低速な」機器に保存されているため、少しでも高速化する工夫です。
以下、命令を S1 / S2 に分けて区別します。
2命令のうち、先に実行されるのが S1 命令、後に実行されるのが S2 命令です。
(特許では、「左」「右」という名称も使われていますが、ここでは S1 / S2 に統一します)
S1 / S2 命令が順次実行されるのは、演算部分である IBM 603 が1つしかないためです。
しかし、S1 命令が実行している間に、S2 命令のデータが準備されるようになっています。
S1 命令の結果が書き込まれる間には、S2 命令が実行されます。
並行して動作を行うことで、高速化する工夫があるのです。
非対称
さて、並行動作のために、「命令」は異なる回路を通ります。
この回路の…おそらくは技術上の制約からくる差により、S1 / S2 命令は少し動作が異なるのです。
先に、データの並べ方は自由で、そのため入出力の別を指定する必要がある、と書きました。
しかし、S1 命令には読み取り専用のデータ位置が1か所あります。
同様に、S2 命令には書き込み専用のデータ位置が1か所あります。
これにより、データの並べ方は事実上1つの方法に制限されました。