Some basic statistics, see further down for more details:
P20 P19 P18 P17 P16 P15 P14 P13 P12 P11 | P10 P9 P8 P7 P6 | P5 P4 P3 P2 P1 Memory address of numeric value (n) Source function Destination functionDuring execution, the Source function is evaluated, resulting in a 20-bit value, referred to as the Source. Then the Destination function is evaluated which takes the Source value and performs some action with it. Most of the functions do not require the address or numeric value which can therefore be left as zeros, but may be used for other purposes if required. If both source and destination require an operand, the they must use the same value. For example, it is not possible to read from one store address and write to a different store address. However, it is possible to copy from a store address to the corresponding backing store address, which is useful.
When describing an instruction it is customary to divide up the address part into two 5-bit numbers, so the whole word could be described by four 5-bit numbers. In this sense the machine operates in base-32, which is not a format I had come across prior to this. While I can work easily with hexadecimal or octal, base-32 takes a bit of getting used to. To simply programming the Source function and Destination function are normally written as one or two-letter mnemonics.
numeric | mnemonic | value assigned to Source |
---|---|---|
0 | M | content of store at address n |
1 | I | Content of I register (data from selected tape reader), advance reader. |
2 | NA | Settings of the NA switches |
3 | NB | Settings of the NB switches |
4 | A | Content of the A register |
5 | SA | Sign bit of A register (P20) |
6 | HA | Content of A divided by 2 (Half A) |
7 | TA | Content of A multiplied by two (Twice A) |
8 | LA | Least significant bit of A (P1) |
9 | CA | Content of A, then clear A. |
10 | ZA | if A is zero, then 0 else P1 |
11 | B | Content of B |
12 | R | if most significant bit of B is 1, P1, otherwise 0. |
13 | RB | Content of B shifted right one bit, P20=0 |
14 | C | Content of C register |
15 | SC | Sign bit of C register |
16 | RC | Content of C shifted right one bit, P20=0 |
17 | D | Content of D[n] |
18 | SD | Sign bit of D[n] |
19 | RD | Content of D[n] shifted right one bit, P20=0 |
20 | Z | Zero (0) |
21 | HL | Content of H register in bits P1..P10, remainder 0 |
22 | HU | Content of H register in bits P11..P20, remainder 0 |
23 | S | Content of S register |
24 | PE | P11 (bit eleven) |
25 | PL | P1 (bit 1) |
26 | K | Upper half of K register (n), P1..P10=0 |
27 | MA | Drum store[n] |
28 | MB | Drum store[n+1024] |
29 | MC | Drum store[n+2048] |
30 | MD | Drum store[n+3072] |
31 | PS | P20 (sign bit) |
numeric | mnemonic | action |
---|---|---|
0 | M | Store[n+3072] = Source |
1 | Q | No effect |
2 | OT | Print bits 1..5 on the teleprinter |
3 | OP | Punch bits 1..5 on 5-hole punch, or 1..12 on 12-hole punch |
4 | A | set A=Source |
5 | PA | set A=A + Source |
6 | SA | set A=A - Source |
7 | CA | set A=A ∧ Source |
8 | DA | set A=A ∨ Source |
9 | NA | set A=A ≢ Source |
10 | P | Transmit Source to the loudspeaker |
11 | B | set B=Source |
12 | XB | Set B=Source, then set A,B = B * C (double length result) B[P1]=0 |
13 | L | Left shift A,B by n/2 places (1..7 places) |
14 | C | set C=Source |
15 | PC | set C=C + Source |
16 | SC | set C=C - Source |
17 | D | set D[n] = Source |
18 | PD | set D[n] += Source |
19 | SD | set D[n] -= Source |
20 | Z | No effect |
21 | HL | set H = Source[P1..P10] |
22 | HU | set H = Source[P11.P20] |
23 | S | set S = Source |
24 | PS | set S += Source |
25 | CS | if Source[P1..P11] or Source[P15..20] is non-zero, add P11 to S, if both are non-zero add 2*P11 to S |
26 | PK | set K=Source, this will add to the next instruction! |
27 | MA | set Drum store[n] = Source |
28 | MB | set Drum store[n+1024] = Source |
29 | MC | set Drum store[n+2048] = Source |
30 | MD | set Drum store[n+3072] = Source |
31 | T | if Source not zero, stop the machine. |
When read in the twelve bits are split, bits 1 to 10 are place in the corresponding bits of the Source, while X and Y are assigned to P19 and P20. This facilitates testing for these as P20 is easily tested and doubling the source will bring P19 to P20 for a further test.
I believe that the 12-hole tape was prepared using a customised keyboard which enabled the mnemonics to be easily entered, but tape preparation did need some skill and accuracy!
As things evolved, the Interprogram language was devised and this was geared towards using 5-hole tape for the programs. This could be more easily prepared by the average user. Friden flexwriters were used, which at that time used 5-hole tape, and only catered for upper case letters, digits and some punctuation.
Code | Binary | Gates | Teleprinter | Flexowriter | |||
---|---|---|---|---|---|---|---|
Src | Dest | Letter | Figure | Letter | Figure | ||
0 | 00000 | M | M | A | 0 | blank | |
1 | 00001 | I | Q | B | 1 | Q | 1 |
2 | 00010 | NA | OT | C | 2 | W | 2 |
3 | 00011 | NB | OP | D | 3 | C | * |
4 | 00100 | A | A | E | 4 | R | 4 |
5 | 00101 | SA | PA | F | 5 | K | ( |
6 | 00110 | HA | SA | G | 6 | L | ) |
7 | 00111 | TA | CA | H | 7 | U | 7 |
8 | 01000 | LA | DA | I | 8 | I | 8 |
9 | 01001 | CA | NA | J | 9 | D | # |
10 | 01010 | ZA | P | K | + | V | = |
11 | 01011 | B | B | L | - | A | - |
12 | 01100 | R | XB | M | . | F | & |
13 | 01101 | RB | L | N | ) | M | . |
14 | 01110 | C | C | O | ( | G | tab |
15 | 01111 | SC | PC | P | i | N | , |
16 | 10000 | RC | SC | Q | j | P | 0 |
17 | 10001 | D | D | R | k | J | stop* |
18 | 10010 | SD | PD | S | BC | H | £ |
19 | 10011 | RD | SD | T | φ | E | 3 |
20 | 10100 | Z | Z | U | Ψ | B | ' |
21 | 10101 | HL | HL | V | Θ | T | 5 |
22 | 10110 | HU | HU | W | Ω | Y | 6 |
23 | 10111 | S | S | X | Γ | S | / |
24 | 11000 | PE | PS | Y | π | X | x |
25 | 11001 | PL | CS | Z | Σ | O | 9 |
26 | 11010 | K | PK | Λ | Ξ | Z | + |
27 | 11011 | MA | MA | figs* | figs | ||
28 | 11100 | MB | MB | lets* | space | ||
29 | 11101 | MC | MC | lf* | cr | ||
30 | 11110 | MD | MD | cr | lets | ||
31 | 11111 | PS | T | space | lf** |
The panel went through various revisions over time, the above photo is a recent one of
the panel at the Victoria Museum. In the photo the row of Yellow switches is the NA
switches, while below it is the row of NB switches and then the IS
switches. The corresponding panel on the Java Emulator has a few minor differences, but the
essential functions are there.
A much better scheme is to load a 12-hole tape containing a bootstrap code at the start, you can arrange for this to be loaded into store in a simpler manner. The procedure is first to select the 12-hole tape reader, set the instruction:
0 0 I Monto the NA switches (just setting bit 6 is sufficient, in the photo above, that switch has a red stripe on it to make it easy to spot!), then set the NA&StoK (or NASK) switch, ensure the Start/Stop switch is in the Start position then press the Start button. The first section will be read in from tape. What is happening is that the NA register is read into the K register and the content of the S register is ORed into it. This means that each time the order is executed it will address successive locations. The data from the tape will be placed in successive store locations, starting at 0.
The next step is to stop the machine when it reaches the end of the initial trigger code. This is marked by a fairly length run of blank rows. At this point, the NASK switch would be reset, and the Clear S button pressed so that when the Start button is pressed, the machine will be executing the trigger code. A further section of code will be read in, comprising what amounts to a relocating loader, and this would be followed by the actual user program.
When the program has been loaded, the machine will either halt, or can be triggered into running the users program immediately.
Depending on how the program has been designed it may be possible for the user program to perform a series of runs, or it may simply halt, and another program will need to be loaded.
Bill Purvis, April 2021