111 lines
4.3 KiB
Text
111 lines
4.3 KiB
Text
[For Rosetta Code. EDSAC program, Initial Orders 2.]
|
|
[Finds the index of a given rational in the Calkin-Wilf series.]
|
|
|
|
[Library subroutine R2: input of positive integers.
|
|
Runs during input of the program, and is then overwritten.
|
|
Allows integers to be written in decimal, rather than as "pseudo-orders".
|
|
See Wilkes, Williams & Gill, 1951 edn, pp. 96-97, 148.]
|
|
T 54 K [to access integers via C parameter]
|
|
P 110 F [where to load integers]
|
|
GKT20FVDL8FA40DUDTFI40FA40FS39FG@S2FG23FA5@T5@E4@E13Z
|
|
T #C [tell R2 where to load integers]
|
|
[F after each integer except the last, and # after the last.]
|
|
83116F51639#
|
|
|
|
[Modified library subroutine P7.
|
|
Prints signed integer up to 10 digits, left-justified.
|
|
Input: Number to be printed is at 0D.
|
|
54 locations. Load at even address. Workspace 4D.]
|
|
|
|
T 56 K
|
|
GKA3FT42@A49@T31@ADE10@T31@A48@T31@SDTDH44#@NDYFLDT4DS43@
|
|
TFH17@S17@A43@G23@UFS43@T1FV4DAFG50@SFLDUFXFOFFFSFL4FT4DA49@
|
|
T31@A1FA43@G20@XFP1024FP610D@524D!FO46@O26@XFSFL8FT4DE39@
|
|
|
|
[Main routine.]
|
|
T 120 K [define load address (must be even)]
|
|
G K [set up relative addressing via @ (theta)]
|
|
|
|
[Put 35-bit values first, to ensure each is at an even address]
|
|
[Variables]
|
|
[0] P F P F [a]
|
|
[2] P F P F [b]
|
|
[4] P F P F [power of 2]
|
|
[6] P F P F [calculated index]
|
|
[Constants]
|
|
T8#Z PF T8Z [clears sandwich digit between 8 and 9]
|
|
[8] P D P F [35-bit constant 1]
|
|
[Teleprinter characters]
|
|
[10] # F [set figures mode]
|
|
[11] X F [slash (in figures mode)]
|
|
[12] K 2048 F [set letters mode]
|
|
[13] I F [letter I]
|
|
[14] R F [letter R]
|
|
[15] ! F [space]
|
|
[16] @ F [carriage return]
|
|
[17] & F [line feed]
|
|
[18] K 4096 F [null char]
|
|
|
|
[Enter with acc = 0]
|
|
[19] A #C [acc := initial a]
|
|
T #@ [copy to variable]
|
|
A 2#C [acc := initial b]
|
|
T 2#@ [copy to variable]
|
|
[23] A 8#@ [acc := 1]
|
|
[24] T 4#@ [initialize power of 2]
|
|
T 6#@ [initialize index to 0]
|
|
[Loop]
|
|
[26] A #@ [acc := a]
|
|
[27] S 2#@ [subtract b]
|
|
[28] E 33 @ [jump if a >= b]
|
|
[Here if a < b]
|
|
T D [store a - b in 0D]
|
|
S D [negate]
|
|
T 2#@ [b := b - a]
|
|
E 40 @ [join common code]
|
|
[Here if a >= b]
|
|
[33] S 8#@ [acc = a - b; test for a = b]
|
|
G 45 @ [jump out of loop if so]
|
|
A 8#@ [restore a - b]
|
|
T #@ [a := a - b]
|
|
A 6#@ [acc := index]
|
|
A 4#@ [inc index by power of 2]
|
|
T 6#@
|
|
[Code common to both cases]
|
|
[40] A 4#@ [acc := power of 2]
|
|
L D [shift left]
|
|
G 76 @
|
|
T 4#@ [update power of 2]
|
|
E 26 @ [loop back]
|
|
[Exit from loop.]
|
|
[45] T D [dump acc to clear it]
|
|
A 6#@ [acc := index]
|
|
A 4#@ [add power of 2 ]
|
|
T 6#@ [store final value of index]
|
|
[Finished calcualting index, now do printing]
|
|
O 10 @ [set teleprinter to figures]
|
|
A #C [acc := initial a]
|
|
T D [to 0D for printing]
|
|
[52] A 52 @ [for return from subroutine]
|
|
G 56 F [call print subroutine, clears acc]
|
|
O 11 @ [print slash]
|
|
A 2#C [print initial b similarly]
|
|
T D
|
|
[57] A 57 @
|
|
G 56 F
|
|
O 12 @ [set teleprinter to letters and print ' IS AT ']
|
|
O15@ O13@ O27@ O15@ O23@ O24@ O15@
|
|
O 10 @ [set teleprinter to figures]
|
|
A 6#@ [acc := calculated index]
|
|
T D [send to print subroutine]
|
|
[70] A 70 @
|
|
G 56 F
|
|
[72] O16@ O17@ [print CR, LF]
|
|
O 18 @ [print null to flush teleprinter buffer]
|
|
Z F [stop]
|
|
[Here if power of 2 goes negative (accumulator overflow)]
|
|
[76] O 12 @ [set teleprinter to letters]
|
|
O28@ O14@ O14@ O76@ O14@ [print'ERROR']
|
|
G 72 @ [jump to common exit]
|
|
E 19 Z [relative address of entry point]
|
|
P F [enter with acc = 0]
|