https://www.crimson-systems.com YouTube
  
ENIAC プログラミング  go・Tcl/Tk版のプログラム    → ENIACシュミレーター   → ENIAC 10進リングカウンタ
 Pulse-level simulator of the ENIAC

ENIACシミュレーション( https://ieeexplore.ieee.org/document/8326772 ) のサンプルプログラムの紹介です。






ENIACのプログラミングは、計算(数式)をENIACで処理できるように分解しなければなりません。
さらに処理の手順・組合わせを考えます。(データフロー・マシン)
これらは、相当に経験を積まないと出来ないと思います。

     X = A + (B + C) * D



   ・ユニットの演算結果を次のユニットに渡し、終了パルスを送ります。(ケーブル配線)




   ・上図の単純な計算でなく、ループ・条件分岐が入ると更に複雑になります。 → マスタプログラマ(Master Programmer)

   ※計算を順にする(直列)のは、分かりやすいですが、
    アキュームレータの計算と、乗算器・除算/開平器では処理速度が違うので並列処理をおこない全体の処理時間を短くし、
    更に時間差を考慮し調整する必要があるので、大変厄介なプログラミング。




プログラム作成に於いて 配線図 (Setup Table) が必要なので、未記入の用紙を作成しました。



数値データ: デジットラインを介しをユニット間に転送されます。
制御信号 : 数値をユニット間で入力・出力する指示をします。






ENIAC技術マニュアル Adele K. Goldstine          左の女性: ベティ・ホルバートン

ENIACのプログラミングに於いて、技術マニュアルの第1章〜4章に基本的な記述がありますます。

 1.1 ENIACの簡単な説明
 1.2 電子部品
 1.3 ENIAC回路の分類:数値計算とプログラミング
 1.4 ENIACのプログラミング
 1.5 ENIAC関連機器

   ・・・

 4.0 アキュムレータの概要
 4.1 プログラム制御と重要な数字および選択的クリアスイッチ
 4.2 共通プログラミング回路
 4.3 数値回路
 4.4 10桁未満または10桁を超える数値に対する累算器の使用
 4.5 例示的な問題




SETUP DIAGRAM SYMBOLS FOR ACCUMULATOR







アキュームレータのプログラム制御は 12個あります。

上段の4個(1〜4)は、レシーバー(Receiver)
  ・入力のみ(α,β,γ,δ,ε)
  ・プログラムパルスの入力端子のみ


下段の8個(5〜12)は、トランシーバー(Transceiver)
  ・入出力(α,β,γ,δ,ε,A,S)
  ・リピート(繰り返し)の設定
  ・プログラムパルスの入力端子と出力端子




■アキュームレータの操作概要




PX-5-304: Accumulator Block Diagram  https://www.cs.drexel.edu/~bls96/eniac/drawings/px-5-304.pdf




■分岐(IF文) 

4.5.3 Magnitude Discrimination Programs (大きさ区分で判定)  




Dummy Program:(ダミー・プログラム)による分岐

大きさ比較で
符号表示M(−)には9つの数字パルスが送信され、符号表示P(+)には送信されない。
これを利用し、数字パルスをプログラミングパルスに変換するためのSpecialAdaptor(特殊アダプタ)を利用する


  ※ダミープログラムとは、
   演算スイッチとクリアコレクトスイッチが 0に設定され、リピートスイッチが 1に設定されているプログラム。

  ※複雑な処理は、マスタープログラマーを使用。





●GitHub → programs 内に小さなプログラムがあります。   sq.e、sq2.e、sq3.e の順に試しました。






●ENIACの操作コマンド



●ENIACのユニット



●記法 (抜粋)

i  開始ユニット 


p  マスタープログラマ 


a1〜a20  アキュームレータ 


c 定数送信器


pr プリンター    8つのアキュムレータ1、2、15、16、17、18、19、20に、プリンター(IBMのカードパンチ)が接続されている。


  






●Adele K. Goldstine の技術マニュアルにある、ENIACの基本操作より、べき乗表を計算するプログラムのサンプル




上記を利用し、1 〜 1000 迄の2乗の表を作成するには、

 n  : ACC6 = 0
 n^2: ACC7 = 0

 for n < 999
   ACC6 + ACC7 → ACC7    2*n +1
   ACC6 + ACC7 → ACC7
   ACC7 + 1   → ACC7
   ACC6 + 1   → ACC6    次のn







●ENIACのプラグボードの接続・スイッチの設定


�@プログラムライン1-1の開始ユニット出力信号は、アキュムレータ6と7のプログラム5と、定数送信器のプログラム26を起動します。
 この結果、2つのアキュムレータのそれぞれに1が加算されます。




�Aプログラム 5 が完了すると、アキュムレータ 6 はプログラム ライン 1-2 に接続された 5o ラインに制御パルスを送信し、
 マスター プログラマのステッパー C の入力に送られます。




�Bステッパー C のカウントが 999 を超えていない場合、
 マスター プログラマはプログラム ライン 1-3 に接続された C1o ラインに制御パルスを送信します。




�Cプログラムライン1-3の信号は、両方のアキュムレータのプログラム6をトリガーします。
 このプログラムは、アキュムレータ6にデータを2回送信させ、アキュムレータ7にデータを2回受信させ、現在の値に加算します。
 つまり、アキュムレータ6の値が2倍になった値がアキュムレータ7に加算されることになります。




�Dこの加算が完了すると、アキュムレータ 7 は 6o 端子に制御パルスを送信し、
 プログラム ライン 1-1 を駆動して、プロセス全体を再度開始します。






●プログラム ( 操作コマンド )





【  開始ユニットの設定  】





PX-9-302 開始ユニットのパネル









【  マスタープログラマの設定  】

・ステッパー(Steppers)は、Cチャンネル
・ディケイドカウンター(Decade Counters)に、 繰り返し回数 999をセット(ステージ 1)
・ステージ 2 で、ディケイドカウンターを1にセット
・ステージ 2で、ステッパーCをクリア





端末とスィッチ ( Master Programmer  PANEL 1 )



マスタープログラマの機能は、処理のループ・ネスト、分岐処理等のコントロール
ステッパーと呼ばれる10個の6段リングカウンターで構成されている






    DI: 入力にn個のパルスを送ると、ステッパーはn段進む
    SI: 入力にCPP(Central Programming Pulse)を送ると、その段から、1加算後CPPが出力される
    CI: ステッパーは、最初の段に戻る

    




PX-8-303 Master Programmer 






ステッパー(Steppers)は、10個 (A,B,C,D.E.F.G.H,J,K)   各ステッパーは、1〜6のステージ切替可

 Master Programmer  PANEL 1    Master Programmer  PANEL 2


   



1di 〜 20di   Decade direct input terminals

Adi 〜 Kdi DI Stepper direct input terminals 指定したステージ番号へ直接ジャンプさせる
Ai 〜 Ki SI Stepper pulse input terminals 各ステージの処理を実行するためのトリガー入力
Acdi 〜 Kcdi CI Stepper clear direct input terminals マスタープログラマーのステッパーを、強制的にステージ1にする
A1o 〜 A6o; ... K1o 〜 K6o   Stepper program pulse output terminals  








【 アキュームレータ 6 の設定 】










 






【 アキュームレータ 7の設定 】

















【 定数送信器の設定 】

・ 定数 1をセット
 






定数送信器は、パンチカードから読み込んだ数値と、手動スィッチで設定した4個の数値を保持できる。

数値の名称は、A 〜 H(8個)とJ ・ K(2個)の10個で
  A〜H: IBMパンチカードリーダーから読み込まれた数値
  J ・ K: 手動スィッチで設定

また、2組毎に送信可能。 AB, CD, EF, GH & JK







ポータブル関数テーブル

・行数は、000〜099の100行と -2,-1, 100,101行で 合計104行
・データの格納は、12桁の数値x1列 と 6桁の数値x2列のいずれかに設定可










 例)ファンクションテーブルのスイッチ設定記述








PX-7-72 FUNCTION TABLE









■シュミレーション結果




各セクタの表示は、  [S1 View] 〜 [S5 View] のボタンをクリック




Secter 2の ACC6 & ACC7


ACC6: n=1000    ACC7: n^2=1000000


動画





stepを0〜2の範囲でテストしました。



step=0


step=1


step=2








※同様なプログラムを修正したもの



計算結果 ACC19 & ACC20











●Cube3.e  nの2乗、3乗






プリンター








●アダプター(Adapters) のテスト
�@ デジット・アダプター(Digit Adapters):
 10桁の数値信号(デジット・パルス)の順序を入れ替えたり、特定の桁だけを抽出したりする

�Aプログラム・アダプター(Program Adapters)
複数のユニットを並行して動かしたり、特定の条件で計算の順序を変えたりする際の論理ゲート的な役割を、物理的なプラグの差し込みによって実現。


【 testpd.e】


・定数送信器に、 1234567890 をセット
・ACC1に定数器から 1234567890を取り込む
・ACC1の内容をアダプターで5桁上下交換
・アダプターの上下 交換結果をACC2に送る
 








●高速乗算器(High-Speed Multiplier)
乗算は、九九表を使い積を10位桁と1位桁に分け、10位(LHPP)と1位(RHPP)の部分積を集計して積を計算します。

被乗数:3の九九表の部分

※サイクリングユニットの 1P, 2P, 2'P, 4Pで、乗数の1〜9を生成することができます。
※10Pのみ位相が違い、deline lineにより5μsずらす設計。



被乗数3の 積を求め、Left Hand Partial Product(10の位) と Rigth Hand Partial Product(1の位)の値から、
サイクリングユニットの 1P, 2P, 2'P, 4Pで数値が生成できるようにします。



上図の被乗数3の積の表から、
 ・マトリックス回路で、パルスが通過できないよう抵抗で抑制します。
 ・また数値の生成不要なパルスは省きます。





●Arthur W. Burksの乗算器の構造図 → https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-8-pdf/k-8-r5367-1-ENIAC-circuits.pdf



     Drawing  PX-6-54  →  https://www.cs.drexel.edu/~bls96/eniac/drawings/px-6-54.pdf


●乗算処理の概要
�@被乗数をACC11、乗数をACC12へ
�A乗算器は 10の位をACC13、1の位をACC14 or ACC15へ
�B各々の部分積(LHPPとRHPP)を求める
�C部分積は、シフター(桁処理)をおこない、L側・右側を加算する
�D左側と右側の合計が乗算積(20桁)


  10の位: LHPP(Left Hand Partial Product)     1の位: RHPP(Right Hand Partial Product)




例) 3 x 6 = 18 ・・・ 計算結果 1(Left Hand Partial roduct) と 8(Right Hand Partial roduct)の信号が生成される
                 LとRの部分積を累計して結果のACCへ 


乗算器のセットップ図の一部 (アデル・ゴールドスタイン技術マニュアル)






【 multtest2.e 】  42 x 347



















ENIAC 第2世代プログラミング
1948年にファンクションテーブルを、プログラムの命令コードを保存する場所として流用し、現代的なプログラミングができるようになりました。
(物理的な配線ケーブルによるプログラミングからの脱却)

51命令: 小型ユニットの10段ステッパーとマスタープログラマの10個の6段ステッパーを組み合わせる。 
60命令: コンバータを追加し、命令を拡張
91〜94命令: 60命令の拡張版



→ https://ftp.arl.army.mil/~mike/comphist/48eniac-coding/index.html
  Section I ENIACの概要
  Section II デジタルパルスからプログラミングパルスへの変換
  Section III 60codeの詳細な説明
  Section IV 命令の概要
  Section V 推奨されるテストプログラム
  Section VI 典型的な問題のフロー図
  Section VII 操作ボックスのコーディング
  Section VIII 改良型ENIAC



ファンクションテーブルに、プログラムの命令コードをセット

 ポータブル関数テーブルに命令コードを2桁づつロータリーSWをセットする。
 命令コード(数字2桁)の10位→α、1位→β




新たに10段ステッパーを用意し、マスタープログラマの10個の6段ステッパーと組み合わせてコンバーターを構成する。

    α: 0 〜 9、 β: 0 〜 5
DI Stepper direct input terminals 指定したステージ番号へ直接ジャンプさせる
SI Stepper pulse input terminals 各ステージの処理を実行するためのトリガー入力



ACC6の役割・構造
 ・6(3,2,1) は、プログラムカウンターであり、現在実行している命令のアドレス(ファンクションテーブルの行)を保持している。
 ・条件分岐させるには、分岐先のアドレスをセットする。
 ・1行分の命令の実行が終わると、命令アドレスが1増加する(ファンクションテーブルの次の行)
 ・6(8,7)、6(11,10,9)は、独立した累算器として使われる。







その後、新たに追加されたユニット(パネル)

�@コンバータ
 ・任意の2桁の数値を、1回の加算時間でCPP(Central Programming Pulse)に変換 → 命令が60から100に増加

�Aレジスタ
 ・遅延線メモリ

 




Description and use of the ENIAC Converter Code
 → https://eniacinaction.com/docs/DescriptionandUse1949.pdf

データの流れ




1951年版 命令一覧


   A.V.  Absolute value
   A.T.  Add time (200 μ sec)
   C.T.  Conditional transfer  条件付き転送命令
   D.S.  Drop sign
   FTN  Function table numeric  関数表から数値データを読み出すための低水準命令(疑似マイクロコード) ・・・ FTCも同様
   L  Listen 塁算器αは、塁算器15から数を受け取るために聞く。
   M  Minus
  N3D8 Next 3 Digits to Accumulator 8   Acc8のアドレス下位フィールドをクリアし、ファンクションテーブルの次の2つの命令位置から、3桁数値を転送する
  N3D6 Next 3 Digits to Accumulator 6   Acc6のアドレス下位フィールドをクリアし、ファンクションテーブルの次の2つの命令位置から、3桁数値を転送する
  N6D6 Next 6 Digits to Accumulator 6   Acc6のアドレスフィールドをクリアし、ファンクションテーブルの次の3つの命令位置から、6桁の数値を転送する
   NaD  Next a digits
   P  Plus
   Pr  Print (IBM Card)
   Rd  Read (IBM Card)
   S.C.  Selective clear
   SL  Shift left (followed by a digit to represent no. of places)
   SR  Shift right (followed by a digit to represent no. of places)
   T  Talk  塁算器αは話す。 (塁算器15に加算)


  ・listen: ACCが、ディジタルトランク、他ACCから数値受け取る。 → 現代のLOADに相当
   talk:  ACCの数値を他の装置へ送り出す。 → 現代のSTOREに近い動作

  ・FTNと同様なFTC(Function Table Constant)は、定数(Constant)を読む命令

  See also → https://history.computer.org/annals/extras/eniac28-2.pdf




命令の種類





ENIAC プログラム




プログラム例   21 70 05 92 02




PX-1-302-2  ENIAC レイアウト (アバディーン)     ENIAC Floor Layout (Aberdeen)








 https://www.crimson-systems.com