216 lines
8.8 KiB
Plaintext
216 lines
8.8 KiB
Plaintext
[Caesar cipher for Rosetta Code.
|
|
EDSAC program, Initial Orders 2.]
|
|
|
|
[Table for converting alphabetic position 0..25 to EDSAC code.
|
|
The EDSAC code is in the high 5 bits.]
|
|
T 54 K [access table via C parameter]
|
|
P 56 F
|
|
T 56 K
|
|
AFBFCFDFEFFFGFHFIFJFKFLFMFNFOFPFQFRFSFTFUFVFWFXFYFZF
|
|
|
|
[Table for converting 5-bit EDSAC code to alphabetic position 0..25.
|
|
Computed at run time (so the programmer doesn't need to know the EDSAC codes).
|
|
32 entries; entry is -1 if the EDSAC code does not represent a letter.]
|
|
T 53 K [access table via B parameter]
|
|
P 82 F
|
|
|
|
[Subroutine to read string from input and
|
|
store with char codes in high 5 bits.
|
|
String is terminated by blank row of tape, which is stored.
|
|
Input: 0F holds address of string in address field (bits 1..11).
|
|
22 locations; workspace: 4D]
|
|
T 114 K
|
|
GKA3FT19@AFA20@T10@I5FA4DR16FT4DA4FUFE14@A21@G18@T5FA10@A2FE4@T5FEFUFK2048F
|
|
|
|
[Subroutine to print string with character codes in high 5 bits.
|
|
String is terminated by blank row of tape, which is not printed.
|
|
Input: 0F holds address of string in address field (bits 1..11).
|
|
18 locations; orkspace: 4F]
|
|
T 136 K
|
|
GKA3FT16@AFA2@T5@AFU4FE10@A17@G15@O4FT4FA5@A2FG4@TFEFK2048F
|
|
|
|
[Define start of user message]
|
|
T 47 K [access message via M parameter]
|
|
P 350 F [address of message]
|
|
|
|
T 154 K
|
|
G K
|
|
[Constants]
|
|
[0] P M [address of user message]
|
|
[1] A B
|
|
[2] A C
|
|
[3] T B
|
|
[4] P 25 F
|
|
[5] P 26 F
|
|
[6] P 31 F
|
|
[7] K 2048 F [(1) letter shift (2) used in test for
|
|
blank row of tape at end of message]
|
|
[8] @ F [carriage return]
|
|
[9] & F [line feed]
|
|
[10] K 4096 F [null char]
|
|
|
|
[Constant messages. Each includes new line at the end.]
|
|
[11] TF EF SF TF IF NF GF @F &F K4096F
|
|
[21] P 11 @
|
|
[22] EF NF TF EF RF !F MF EF SF SF AF GF EF @F &F K4096F
|
|
[38] P 22 @
|
|
[39] MF UF SF TF !F SF TF AF RF TF !F WF IF TF HF !F BF !F TF OF !F ZF @F &F K4096F
|
|
[64] P 39 @
|
|
|
|
[Subroutine to convert EDSAC code to alphabetic position.
|
|
Input: 4F holds EDSAC code in high 5 bits
|
|
Output: 4F holds alphabetic position (0..25, or -1 if not a letter).
|
|
Workspace: 5F]
|
|
[65] A 3 F [make jump for return]
|
|
T 75 @ [plant in code]
|
|
A 4 F [load EDSAC code]
|
|
R 512 F [shift code into address field]
|
|
T 5 F [temp store]
|
|
C 5 F [acc := address bits only]
|
|
A 1 @ [make order to load alphabetic position]
|
|
T 73 @ [plant in code]
|
|
[73] A B [load alphabetic position]
|
|
T 4 F [store in 4F]
|
|
[75] E F [return]
|
|
|
|
[Subroutine to encipher or decipher a message by Caesar shift.
|
|
Input: Message is accessed by the M parameter, and
|
|
terminated by a blank row of tape.
|
|
Output: 0F = error flag: 0 if OK, < 0 if error (bad message prefix)
|
|
Workspace 4F.]
|
|
[76] A 3 F [make jump for return]
|
|
T 119 @ [plant in code]
|
|
A 80 @ [load order to access first char]
|
|
T 95 @ [plant in code]
|
|
[80] A M [load first char of message]
|
|
T 4 F [pass to subroutine]
|
|
[82] A 82 @ [get alphabetic position]
|
|
G 65 @
|
|
A 4 F [load alphabetic position]
|
|
U F [to 0F for use as shift]
|
|
S 2 F [check it's not 0 or -1]
|
|
G 118 @ [error exit if it is]
|
|
T 1 F [clear acc]
|
|
S F [load negative of shift]
|
|
G 108 @ [jump to store first char
|
|
and convert rest of message]
|
|
[Here after skipping non-letter]
|
|
[91] T 4 F [clear acc]
|
|
[Here after converting letter]
|
|
[92] A 95 @ [load order to read character]
|
|
A 2 F [inc address to next character]
|
|
T 95 @ [store back]
|
|
[95] A M [load char from message (in top 5 bits)]
|
|
E 100 @ [if >= 0 then not blank row]
|
|
A 7 @ [if < 0, test for blank row]
|
|
G 117 @ [jump out if so]
|
|
S 7 @ [restore after test]
|
|
[100] T 4 F [character to 4F for subroutine]
|
|
[101] A 101 @ [for return from subroutine]
|
|
G 65 @ [sets 4F := alphabetic position]
|
|
A 4 F [to acc]
|
|
G 91 @ [if < 0 then not a letter; don't change it]
|
|
A F [apply Caesar shift]
|
|
[Subtract 26 if required, so result is in range 0..25]
|
|
S 5 @ [subtract 26]
|
|
E 109 @ [skip next if result >= 0]
|
|
[108] A 5 @ [add 26]
|
|
[109] A 2 @ [make order to read EDSAC letter at that position]
|
|
T 114 @ [plant in code]
|
|
A 95 @ [load A order from above]
|
|
A 14 C [add 'O F' to make T order]
|
|
T 115 @ [plant in code]
|
|
[114] A C [load enciphered letter]
|
|
[115] T M [overwrite original letter]
|
|
E 92 @ [loop back]
|
|
[117] T F [flag = 0 for OK]
|
|
[118] T F [flag to 0F: 0 if OK, < 0 if error]
|
|
[119] E F [return with acc = 0]
|
|
|
|
[Subroutine to print encipered or deciphered message, plus new line]
|
|
[120] A 3 F [make jump order for return]
|
|
T 128 @ [plant in code]
|
|
A @ [load address of message]
|
|
T F [to 0F for print subroutine]
|
|
[124] A 124 @
|
|
G 136 F [print message, clears acc]
|
|
O 8 @ [print new line]
|
|
O 9 @
|
|
[128] E F [return with acc = 0]
|
|
|
|
[Main routine]
|
|
[129] O 7 @ [set letter shift]
|
|
H 6 @ [mult reg has this value throughout;
|
|
selects bits 1..5 of 17-bit value]
|
|
[Build inverse table from direct table
|
|
First initialize all 32 locations to -1]
|
|
A 6 @ [work backwards]
|
|
[132] A 3 @ [make T order for inverse table]
|
|
T 135 @ [plant in code]
|
|
S 2 F [make -1 in address field]
|
|
[135] T B [store in inverse table]
|
|
A 135 @ [get T order]
|
|
S 2 F [dec address]
|
|
S 3 @ [compare with start of table]
|
|
E 132 @ [loop till done]
|
|
[Now fill in entries by reversing direct table]
|
|
T F [clear acc]
|
|
A 4 @ [work backwards]
|
|
[142] U 5 F [index in 5F]
|
|
A 2 @ [make A order for direct table]
|
|
T 145 @ [plant in code]
|
|
[145] A C [load entry from direct table, code in top 5 bits]
|
|
R 512 F [shift 11 right, 5-bit code to address field]
|
|
T 4 F [temp store]
|
|
C 4 F [pick out 5-bit code]
|
|
A 3 @ [make T order for inverse table]
|
|
T 152 @ [plant in code]
|
|
A 5 F [load index]
|
|
[152] T B [store in inverse table]
|
|
A 5 F [load index again]
|
|
S 2 F [update index]
|
|
E 142 @ [loop back]
|
|
[Here when inverse table is complete]
|
|
[156] T F [clear acc]
|
|
[157] A 21 @ [load address of "testing" message]
|
|
T F [to 0F for print subroutine]
|
|
[159] A 159 @
|
|
G 136 F [print "testing message"]
|
|
E 168 @ [jump to read from end of this file]
|
|
[Loop back here to get message from user]
|
|
[162] A 38 @ [load address of prompt]
|
|
T F [to 0F for print subroutine]
|
|
[164] A 164 @
|
|
G 136 F [print prompt]
|
|
O 10 @ [print null to flush teleprinter buffer]
|
|
Z F [stop]
|
|
[First time here, read message from end of this file.
|
|
Later times, read message from file chosen by the user.]
|
|
[168] A @ [load address of message]
|
|
T F [to 0F for input]
|
|
[170] A 170 @
|
|
G 114 F [read message]
|
|
[172] A 172 @
|
|
G 120 @ [print message]
|
|
[174] A 174 @
|
|
G 76 @ [call Caesar shift subroutine]
|
|
A F [load error flag]
|
|
E 184 @ [jump if OK]
|
|
T F [error, clear acc]
|
|
A 64 @ [load address of error message]
|
|
T F
|
|
[181] A 181 @
|
|
G 136 F [print error message]
|
|
E 162 @ [back to try again]
|
|
[Here if message was enciphered without error]
|
|
[184] A 184 @
|
|
G 120 @ [print enciphered message]
|
|
[186] A 186 @
|
|
G 76 @ [call Caesar shift subroutine]
|
|
[188] A 188 @
|
|
G 120 @ [print deciphered message]
|
|
E 162 @ [back for another message]
|
|
E 129 Z [define entry point]
|
|
P F [acc = 0 on entry]
|
|
DGAZA!FREQUENS!LIBYCUM!DUXIT!KARTHAGO!TRIUMPHUM.
|