RosettaCodeData/Task/A+B/EDSAC-order-code/a+b-2.edsac

109 lines
4.0 KiB
Plaintext

[A + B for Rosetta Code.
Read two integers and find their sum.
EDSAC program, Initial Orders 2.]
[Print signed number, up to 10 digits, right-justified.
Modification of library subroutine P7.
55 locations, load at even address.]
T 56 K
GKA3FT42@A47@T31@ADE10@T31@A48@T31@SDTDH44#@NDYFLDT4DS43@TF
H17@S17@A43@G23@UFS43@T1FV4DAFG50@SFLDUFXFOFFFSFL4FT4DA49@T31@
A1FA43@G20@XFP1024FP610D@524D!FO46@O26@XFO46@SFL8FT4DE39@
[Subroutine to read signed number from input, up to 10 digits.
Partly based on library subroutine R2. Result in 4D.
Working registers: 0F = dump to clear acc
1F < 0 if number starts with minus, = 0 if not.
6D = character code, as double-word value]
T 120 K
G K
A 3 F [make link for return]
T 36 @ [plant in code; clear acc]
H 7 @ [mult reg := 10/32]
T 4 D [initialize result to 0]
T 1 F [no minus sign yet]
T 6 D [ensure 7F and sandwich bit are 0]
[Loop until find valid first character of integer, namely
decimal digit (char codes 0..9), plus (13), or minus (22).]
[6] I 6 F [char code from input]
[7] T F [clear acc; also serves as constant 10/32]
S 6 F [load negative of char code]
A 39 @ [add 9]
E 24 @ [if decimal digit, out]
A 38 @ [add 3]
E 6 @ [if 10..12, try again]
A 37 @ [add 1]
E 20 @ [if plus, out with acc = 0]
A 39 @ [add 9]
G 6 @ [if 23..31, try again]
S 37 @ [subtract 1]
E 6 @ [if 14..21, try again]
T 1 F [minus, acc = -1, store in sign]
[Loop to read characters after first. Assumes acc = 0 here.]
[20] I 6 F [next char from input]
S 6 F [negative to acc]
A 39 @ [add 9]
G 30 @ [finished if not digit]
[24] T F [clear acc]
V 4 D [acc := 10/32 times partial sum]
L 8 F [shift 5 left]
A 6 D [add latest digit]
T 4 D [update partial sum]
E 20 @ [loop for next char]
[Here when no more digits]
[30] T F [clear acc]
A 1 F [load sign of result]
E 36 @ [exit (with acc = 0) if >= 0]
T F [< 0, clear acc]
S 4 D [subtract number]
T 4 D [store back negated; clear acc]
[36] E F [exit with acc = 0 (EDSAC convention)]
[Constants]
[37] P D [1]
[38] P 1 D [3]
[39] P 4 D [9]
[Main routine]
T 200 K
G K
[Variables]
[0] P F P F [integer A]
[2] P F P F [integer B]
[Constants]
[4] # F [figures]
[5] @ F [carriage return]
[6] & F [line feed]
[7] K 4096 F [null char]
[Enter with acc = 0]
[8] O 4 @ [set teleprinter to figures]
A 9 @
G 120 F [read integer A from input]
A 4 D [load]
U #@ [save]
T D [to 0D for printing]
A 14 @
G 56 F [print A]
O 5 @ [followed by new line]
O 6 @
A 18 @
G 120 F [read integer B from input]
A 4 D [load]
U 2#@ [save]
T D [to 0D for printing]
A 23 @
G 56 F [print B]
O 5 @ [followed by new line]
O 6 @
A #@ [load A]
A 2#@ [add B]
T D [A + B to 0D for printing]
A 30 @
G 56 F [print A + B]
O 5 @ [followed by new line]
O 6 @
O 7 @ [print null to flush teleprinter buffer]
Z F [stop]
E 8 Z
P F
-987.123.