[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]