マーク1の詳細

目次

計算の仕組み

特殊なカウンタ

倍精度演算条件処理条件停止

プログラム

プログラムの「ループ」

命令詳細

加算減算カウンタのリセット乗除算符号転送条件停止関数自動増加正規化

そのほか周辺機器

バリューテープ

余談

おわりに


条件処理

70番は「CHOICE COUNTER」(選択カウンタ)と呼ばれます。

他のカウンタを使用した計算の際に、「符号」だけを計算に揃えることができました。


計算自体は、70番を使う必要はありません。

たとえば、30番の計算結果がマイナスになったとき、計算時に「符号を70番に送る」と指示しておけば、70番の符号がマイナスになります。


これにより、条件分岐とまでは行かないまでも、条件によって計算結果を変えることができました。

(計算結果を思い通りに制御するには、数学的なテクニックを駆使する必要はありましたが。)


条件停止

72番は「AUTOMATIC CHECK COUNTER」(自動停止カウンタ)と呼ばれます。


このカウンタの符号を見て、プログラムの実行を停止する命令がありました。

その命令を使うと、負の時はそのままですが、正になると停止します。


ASCC には条件分岐はありませんでしたが、これにより「条件停止」は可能でした。

使い方のマニュアルに書かれたプログラム例でも、条件停止を積極的に使っています。


停止した命令が紙テープのどの位置にあるか、によって「人間が」判断して、次の実行開始位置を変えてやる、というプログラム例もあります。

完全自動ではなく、人間の作業が必要ですが、条件分岐やループなどを実現しているのです。



2015.6.5 追記
どうやら、特殊なカウンタは完成当初は存在せず、後から追加されたようです。
バベジは解析機関の重要な機能として「条件判断」を考えていたのですが、バベジの影響を受けたエイケンは、計算に条件判断が必要だとは思っていなかった様子。
実際に動かしてから、多少の条件判断が必要なことに気付き、機能を追加したものの機能として不十分だった、ということのようです。

プログラム

ASCC の最大の特徴は、プログラムができたことです。


プログラムには、紙テープを使います。24つの穴が空けられましたが、8個づつ3グループに分かれていました。

穴8個が1グループですから、これは 8bit を意味します。


当時は、穴の位置を 1~8 で表現する独特の記法でした。

7321 とあれば、2進数で 01000111 、10進法では 64+4+2+1 = 71 のことでした。


プログラムテープそれぞれのグループとして、 OUT / IN / MISC. と名付けられています。


図は、使い方マニュアルにあったプログラムテープの例。
左がテープ、右がプログラム。下から上に実行される。

プログラムに「ニーモニック」のような概念は無く、すべてを特殊な二進法で書いていった。
(実際には、先に数式を書き、その数式を翻訳する形でプログラムを作るのだが)

基本は、OUT に示した番号のカウンターや装置から数値を読み取り、IN に送る、という書き方です。

これだけで、加算に相当します。


「乗算器」や「除算器」に対して値を送れば、乗算・除算が行われます。

プリンタに対して値を送ればプリントされます。


そういう意味では、メモリマップドI/O っぽくもある。

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 の間に挟んだ際に、速度の遅い乗除算器に計算をさせながら、同時に別の動作ができたのかどうか、不明です。


次ページ: 符号転送


前ページ 1 2 3 次ページ

(ページ作成 2015-06-01)
(最終更新 2015-06-05)

前記事:ハーバード・マーク1     戻る
トップページへ

-- share --

2000

-- follow --




- Reverse Link -