この最後の方にInfluence on programming for other machinesという章があり, 東大のTACのことも述べているが, E. Wada, who was responsible for programming, designed a new set of initial orders based on those of Wheeler, but incorporating floating addresses and some other small refinements.と書かれているのを知った.
今回のブログの目的はその論文にあるEDSACのプログラムの例を説明することである. MartinはEDSACの例にTPKプログラムを使った. なんの変哲もない問題だが, アセンブリ械語のプログラムとしては長さ的に適当かも知れない.
11個のデータを読み込み, 配列aの0から10に置き, t =a[t ]として,
y =√|t|+5×t 3 (*)
を計算, 印刷するものである.
t が<1なら, 最初の項は平方根だからtより小さくなるから無視し, 次の項は3乗なのでこれが結果の大きさに利く. t が±10位ならyは±5000程度のt3の曲線を考えればよい.
EDSACの頃の計算機は, 扱う値を±1以下としていたから, tが10程度までなら1/16にし, yも1/213=1/8192として計算する.
つまり *の式にy=213y', t=24t'を入れ, y' =2-11√t' +5×2^-1t'3 を計算し, 後で213倍する. t=1とすると, t'=2^-4. その平方根は2^-2. 2^-11を掛けると2^-13. またtの3乗は2^-12. 5.2^-1を掛けて5.2^-13. 両方を足して2^13を掛けると6になる.
EDSACに用意してあるライブラリのサブルーチンもみなこの範囲と思って働く.
さてMartinの書いた主プログラムはこうだ.

上から数行目の 0 |A θ と書いてある行を0番地としたアドレスにはθを最後に付ける. 下の方 M 0|P 4 D の行を0番地とするときは, Mを付ける. そのMは38θであること, set M-parameterの行で設定する.
0と1行目はWheelerリンケージで, 56絶対番地のR1へサブルーチンジャンプする. 2行目 T20Dはサブルーチンに20Dからデータを格納せよとの指定である.
データはテープに15+8+6-95+23+99+21+21-6+0001+0002-Fとパンチしてあり, Fが來るまで0.15, 0.8, -0.6, ...のように20番地, 22番地, 24番地, ...,40番地に読み込まれる. そして3番地に戻ってくる.
O 10M, O 11Mは10MにCarriage return(復帰), 11MにLine feed(改行)のコードがあって, 出力装置を改行する. こういう機能鍵にはアルファベットが書いてないので, パンチの都合上ギリシア文字が割り当てられている.
4,5番地にT Dが2度あるが, 最初のはアキュムレータを0にするもの, 次はその0を0番地の長語に格納するものだ. そして7M番地にある10を0番地の短語に設定し, 9,10番地でP7へサブルーチンジャンプする. EDSACの短語は, EDSACのプログラム技法のブログの2012年9月22日の命令語の図にあるように, L/Sビットのところが整数の1の桁であり, アドレスはその上に1ビットずれているから, P5Fと書くと10になり, 8MのようにPD, つまりアドレス部が0でL/Sビットがあると, 整数の1になる. (ファンクション部のPは0である.)
11番地へ戻るとO 12Mでスペースを2文字出力する. 次はtを16で割りt'にするのだが, もともと読み込むデータが1/10になっているとしたので, (15は0.15と読まれたが, 1.5のつもりであった.) 10/16を掛けることになる.
EDSACの乗算は一方の数を乗算レジスタへ置き, ある番地にある数と掛けて積をアキュムレータに置くので, H 4Mで10/16を乗算レジスタに置く. 4Mを見ると J F である. F はL/Sビットが0のことだが, Jはなにかというと, 前のブログでEDSACの文字コードを見るとJは01010である. 左端の0の次に小数点があるから, これが10/16なのである.
14番地のV40Dで40番地にある長語のデータと乗算が出来た. それを8Dに置いてサブルーチンへ行き, y' を計算する. y' も8Dに置いてある.
まだまだ続くが, 今回はここまでにしよう.

0 件のコメント:
コメントを投稿