99 lines
4.3 KiB
Plaintext
99 lines
4.3 KiB
Plaintext
[Gray code task for Rosetta Code.
|
|
EDSAC program, Initial Orders 2.]
|
|
|
|
[Library subroutine M3. Prints header at load time,
|
|
then M3 and header are overwritten.]
|
|
PFGKIFAFRDLFUFOFE@A6FG@E8FEZPF
|
|
*BINARY!!GRAY!!!!ROUND!TRIP@&
|
|
..PK [after header, blank tape and PK (WWG, 1951, p. 91)]
|
|
|
|
T64K [load at location 64 (arbitrary choice)]
|
|
GK [set @ (theta) parameter]
|
|
[Subroutine to print 5-bit number in binary.
|
|
Input: 1F = number (preserved) in low 5 bits.
|
|
Workspace: 0F, 4F.]
|
|
[0] A3F T17@ [plant return link as usual]
|
|
H19@ [mult reg := mask to remove top 4 bits]
|
|
A1F [acc := code in low 5 bits]
|
|
L32F [shift 7 left]
|
|
TF [store in workspace]
|
|
S18@ [initialize negative count of digits]
|
|
[7] T4F [update negative count]
|
|
AF LD TF [shift workspace 1 left]
|
|
CF [remove top 4 bits]
|
|
TF [store result]
|
|
OF [print character '0' or '1' in top 5 bits]
|
|
A4F A2F G7@ [inc count, loop if not yet 0]
|
|
[17] ZF [{planted} jump back to caller]
|
|
[18] P5F [addres field = number of bits]
|
|
[19] Q2047D [00001111111111111 binary]
|
|
|
|
[Subroutine to convert binary code to Gray code.
|
|
Input: 1F = binary code (preserved).
|
|
Output: 0F = Gray code.]
|
|
[20] A3F T33@ [plant return link as usual]
|
|
A1F RD TF [0F := binary shifted 1 right]
|
|
[One way to get p XOR q on EDSAC: Let r = p AND q.
|
|
Then p XOR q = (p - r) + (q - r) = -(2r - p - q).]
|
|
HF [mult reg := 0F]
|
|
C1F [acc := 0F AND 1F]
|
|
LD [times 2]
|
|
SF S1F [subtract 0F and 1F]
|
|
TF SF TF [return result negated]
|
|
[33] ZF [{planted} jump back to caller]
|
|
|
|
[Subroutine to convert 5-digit Gray code to binary.
|
|
Uses a chain of XORs.
|
|
If bits in Gray code are ghijk then bits in binary are
|
|
g, g.h, g.h.i, g.h.i.j, g.h.i.j.k where dot means XOR.
|
|
Input: 1F = Gray code (preserved).
|
|
Output: 0F = binary code.
|
|
Workspace: 4F, 5F.]
|
|
[34] A3F T55@ [plant return link as usual]
|
|
A1F UF [initialize result to Gray code]
|
|
T5F [5F = shifted Gray code, shift = 0 initialiy]
|
|
S56@ [initialize negative count]
|
|
[40] T4F [update negative count]
|
|
HF [mult reg := partial result]
|
|
A5F RD T5F [shift Gray code 1 right]
|
|
[Form 5F XOR 0F as in the previous subroutine]
|
|
C5F LD SF S5F TF SF
|
|
TF [update partial result]
|
|
A4F A2F G40@ [inc count, loop back if not yet 0]
|
|
[55] ZF [{planted} jump back to caller]
|
|
[56] P4F [address field = 1 less than number of bits]
|
|
|
|
[Main routine]
|
|
[Variable]
|
|
[57] PF [binary code is in low 5 bits]
|
|
[Constants]
|
|
[58] P16F [exclusive maximum code, 100000 binary]
|
|
[59] PD [17-bit 1]
|
|
[60] #F [teleprinter figures mode]
|
|
[61] !F [space]
|
|
[62] @F [carriage return]
|
|
[63] &F [line feed]
|
|
[Enter with acc = 0]
|
|
[64] O60@ [set teleprinter to figures]
|
|
S58@ [to make acc = 0 after next instruction]
|
|
[66] A58@ [loop: restore acc after test below]
|
|
U57@ T1F [save binary code, and pass it to print soubroutine]
|
|
[69] A69@ G@ [print binary code]
|
|
O61@ O61@ O61@ [print 3 spaces]
|
|
[74] A74@ G20@ [convert binary (still in 1F) to Gray]
|
|
AF T1F [pass Gray code to print subroutine]
|
|
[78] A78@ G@ [print Gray code]
|
|
O61@ O61@ O61@ [print 3 spaces]
|
|
[83] A83@ G34@ [convert Gray (still in 1F) back to binary]
|
|
AF T1F [pass binary code to print subroutine]
|
|
[87] A87@ G@ [print binary]
|
|
O62@ O63@ [print CR, LF]
|
|
A57@ A59@ [inc binary]
|
|
S58@ [test for all done]
|
|
G66@ [loop back if not]
|
|
O60@ [dummy character to flush teleprinter buffer]
|
|
ZF [stop]
|
|
E64Z [define entry point]
|
|
PF [acc = 0 on entry]
|
|
[end]
|