マーク1の詳細
目次
条件処理
70番は「CHOICE COUNTER」(選択カウンタ)と呼ばれます。
他のカウンタを使用した計算の際に、「符号」だけを計算に揃えることができました。
計算自体は、70番を使う必要はありません。
たとえば、30番の計算結果がマイナスになったとき、計算時に「符号を70番に送る」と指示しておけば、70番の符号がマイナスになります。
これにより、条件分岐とまでは行かないまでも、条件によって計算結果を変えることができました。
(計算結果を思い通りに制御するには、数学的なテクニックを駆使する必要はありましたが。)
条件停止
72番は「AUTOMATIC CHECK COUNTER」(自動停止カウンタ)と呼ばれます。
このカウンタの符号を見て、プログラムの実行を停止する命令がありました。
その命令を使うと、負の時はそのままですが、正になると停止します。
ASCC には条件分岐はありませんでしたが、これにより「条件停止」は可能でした。
使い方のマニュアルに書かれたプログラム例でも、条件停止を積極的に使っています。
停止した命令が紙テープのどの位置にあるか、によって「人間が」判断して、次の実行開始位置を変えてやる、というプログラム例もあります。
完全自動ではなく、人間の作業が必要ですが、条件分岐やループなどを実現しているのです。
どうやら、特殊なカウンタは完成当初は存在せず、後から追加されたようです。
バベジは解析機関の重要な機能として「条件判断」を考えていたのですが、バベジの影響を受けたエイケンは、計算に条件判断が必要だとは思っていなかった様子。
実際に動かしてから、多少の条件判断が必要なことに気付き、機能を追加したものの機能として不十分だった、ということのようです。
プログラム
ASCC の最大の特徴は、プログラムができたことです。
プログラムには、紙テープを使います。24つの穴が空けられましたが、8個づつ3グループに分かれていました。
穴8個が1グループですから、これは 8bit を意味します。
当時は、穴の位置を 1~8 で表現する独特の記法でした。
7321 とあれば、2進数で 01000111 、10進法では 64+4+2+1 = 71 のことでした。
それぞれのグループとして、 OUT / IN / MISC. と名付けられています。
左がテープ、右がプログラム。下から上に実行される。
プログラムに「ニーモニック」のような概念は無く、すべてを特殊な二進法で書いていった。
(実際には、先に数式を書き、その数式を翻訳する形でプログラムを作るのだが)
基本は、OUT に示した番号のカウンターや装置から数値を読み取り、IN に送る、という書き方です。
これだけで、加算に相当します。
「乗算器」や「除算器」に対して値を送れば、乗算・除算が行われます。
プリンタに対して値を送ればプリントされます。
MISC. には、計算以外の動作を書きます。
(英語で miscellaneous。雑多、という意味です)
OUT から読み出す値の符号を反転する、強制的に正/負にする、など、計算と同時に使うこともできます。
符号を反転して IN に足せば引き算になるわけで、これで四則演算が揃います。
計算を停止する、データ用紙テープ装置から数値を読み込む、紙テープを送る/巻き戻す、等の命令もあります。
MISC. の 7 番目の穴を空けると、「その命令で停止できる」という意味でした。
装置の「停止スイッチ」を押しても、すぐには機械は実行を停止せず、MISC. の7番目の穴が開いた命令に来た時点でやっと停止します。
計算の区切り等以外では停止しないようにすることで、途中で停止して値を読み取るにしても、無意味な値にならないように出来ました。
プログラムの「ループ」
マーク1には分岐命令などが無いため、「ループさせたいときは最初と最後を糊付けし、物理的なループを作った」という記述を見ることがあります。
確実なことは言えないのですが、この記述は、ASCC の後に作られた SSEC との混同があるように思います。
マーク1のテープ読み取り機は、テープの「端」から挿入する形式だったため、糊付けしてしまうとプログラムを読み込ませられなくなります。
一方、SSEC では積極的にループを作り、その輪をテープ読み取り機に「ひっかける」ようにセットする方式でした。
いずれ SSEC についても書こうと思っていますが、SSEC の紙テープが輪になっていることには妥当な理由があり、設計当初から意図していた使い方です。
マーク1の使い方マニュアルでは、各種プログラムの実例も出てきます。この中には「繰り返し」によって演算精度を高めるアルゴリズムなどもあります。
しかし、そこではループを作るような指示はなく、プログラムの実行が停止したら、テープ位置を見て状況を判断し、人間がテープを「巻き戻して」再び計算を再開する、という説明がついています。
ただし、使い方マニュアルに載っていない、ということが「その使用方法はなかった」ことにはならないと思います。物理的にテープの「端」が無いと挿入できないように思えるのも、実は特殊な機構で横からテープを滑り込ませることが可能だった、等の可能性もあります。
命令詳細
加算
OUT から読み出して、 IN に入れるだけです。
もともと IN に指定されたカウンタに入っていた数値に対し、OUT のカウンタの数値が足されます。
減算
加算と同様ですが、MISC. に「符号を逆にする」命令(32)を置きます。
符号を扱う命令には、符号を逆にする以外に「強制的に正」(1)、「強制的に負」(2)もありました。
カウンタのリセット
OUT と IN に同じカウンタを指定すると、カウンタはリセットされ、0になります。
「カウンタに値を入れる」命令はありませんが、0にしてから加算すれば入れられることになります。
乗除算
3ステップで指定します。
1) OUT に1つ目の数値を、IN に乗算(761)/乗算器(76)を指定。
2) OUT に2つ目の数値を指定。(IN は指定なし)
3) IN に、結果を入れるアドレスを指定。(OUT は指定なし)
これで、3つ目に指定したアドレスに、乗除算の結果が送られました。
乗算には 8~20cycle 、除算には 6~52cycle かかります。
23桁のどこに小数点があるのかを、あらかじめ配線で設定しておくことで、固定小数点演算も行えました。
1,2,3 の間に、別の命令を挟むこともできる、と当時のマニュアルにあるのですが、そうすることの効果は不明です。
特に、2 と 3 の間に挟んだ際に、速度の遅い乗除算器に計算をさせながら、同時に別の動作ができたのかどうか、不明です。