73 lines
3.2 KiB
Plaintext
73 lines
3.2 KiB
Plaintext
[Demo of subroutine to calculate factorial.
|
|
EDSAC program, Initial Orders 2.]
|
|
|
|
[Arrange the storage]
|
|
T45K P56F [H parameter: subroutine for factorial]
|
|
T46K P80F [N parameter: library subroutine P7 to print integer]
|
|
T47K P128F [M parameter: main routine]
|
|
|
|
[================================ H parameter ================================]
|
|
E25K TH
|
|
[Subroutine for N factorial. Works for 0 <= N <= 13 (no checking done).
|
|
Input: 17-bit integer N in 6F (preserved).
|
|
Output: 35-bit N factorial is returned in 0D.
|
|
Workspace: 7F]
|
|
GK
|
|
A3F T19@ [plant return link as usual]
|
|
TD [clear the whole of 0D, including the sandwich bit]
|
|
A20@ TF [0D := 35-bit 1]
|
|
A6F T7F [7F = current factor, initialize to N]
|
|
E15@ [jump into middle of loop]
|
|
[Head of loop: here with 7F = factor, acc = factor - 2]
|
|
[8] H7F [mult reg := factor]
|
|
A20@ [acc := factor - 1]
|
|
T7F [update factor, clear acc]
|
|
VD [acc := 0D times factor]
|
|
L64F L64F [shift 16 left (as 8 + 8) for integer scaling]
|
|
TD [update product, clear acc]
|
|
[15] A7F S2F [is factor >= 2 ? (2F permanently holds P1F)]
|
|
E8@ [if so, loop back]
|
|
T7F [clear acc on exit]
|
|
[19] ZF [(planted) return to caller]
|
|
[20] PD [constant: 17-bit 1]
|
|
|
|
[================================ M parameter ================================]
|
|
E25K TM GK
|
|
[Main routine]
|
|
[Teleprinter characters]
|
|
[0] K2048F [1] #F [letters mode, figures mode]
|
|
[2] FF [3] AF [4] CF [5] VF [F, A, C, equals]
|
|
[6] !F [7] @F [8] &F [space, carriage return, line feed]
|
|
|
|
[Enter here with acc = 0]
|
|
[9] TD [clear the whole of 0D, including the sandwich bit]
|
|
A33@ [load 17-bit number N whose factorial is required]
|
|
UF [store N in 0D, extended to 35 bits for printing]
|
|
T6F [also store N in 6F, for factorial subroutine]
|
|
O1@ [set teleprinter to figures]
|
|
[14] A14@ GN [print N (print subroutine preserves 6F)]
|
|
|
|
[Print " FAC = " (EDSAC teleprinter had no exclamation mark)]
|
|
O@ O6@ O2@ O3@ O4@ O1@ O6@ O5@ O6@
|
|
|
|
[25] A25@ GH [call the above subroutine, 0D := N factorial]
|
|
[27] A27@ GN [call subroutine to print 0D]
|
|
O7@ O8@ [print CR, LF]
|
|
O1@ [print dummy character to flush teleprinter buffer]
|
|
ZF [stop]
|
|
[33] P6D [constant: 17-bit 13]
|
|
|
|
[================================ N parameter ================================]
|
|
E25K TN
|
|
[Library subroutine P7, prints long strictly positive integer in 0D.
|
|
10 characters, right justified, padded left with spaces.
|
|
Even address; 35 storage locations; working position 4D.]
|
|
GKA3FT26@H28#@NDYFLDT4DS27@TFH8@S8@T1FV4DAFG31@SFLDUFOFFFSFL4F
|
|
T4DA1FA27@G11@XFT28#ZPFT27ZP1024FP610D@524D!FO30@SFL8FE22@
|
|
|
|
[============================= M parameter again =============================]
|
|
E25K TM GK
|
|
E9Z [define entry point]
|
|
PF [acc = 0 on entry]
|
|
[end]
|