ICT 1301 - Software

ICT 1301 - How do you program a 1960s computer?

Below is an example of a program sheet for a very "simple" program for the ICT1301 which loops, updating some of the lights on the front of the console and incrementing one of the registers. This page will try to run through each of the commands to give an idea of how each one is being used.

This program sheet was used by the programmers to layout their code ready for someone to complete onto a pack of punch cards. Initially, the programmer would write up their program as a flow chart before writing it down on the program sheet.

The top section is for information and includes the Job being written up, the programmer and other useful data. The Block Number was set if several programmers were each working on different sub-parts of the same routine. It allowed each programmer to access their own relative part of the memory, irrespective of where it was actually finally placed in the IAS in the completed full program. (Immediate Access Code Store - a quick access core store, the RAM of this computer). A senior programmer would be assigned the job of assigning where in memory to place each of the programmer's subroutines for the full program.

Each single order is made up of four parts, the designation, function, address and relitiviser.
The headers are as follows:

  • C : Card number - Each punch card in the "normal" card form can store three order-pairs, each with two functions stored in a single word.
  • I : Instruction Number - This count enables us to jump to a specific instruction later. Each order-pair is made up of 2 commands.
  • D : Designation - A single digit character or number used to enable specific control words.
  • F : Function - A decimal 2 digit value, usually which command function to run
  • A : Address - The address consists of four decimal digits.
  • R : Relitiviser - Used to specify a relative block to address. The letter B is used to reference the current block, a numeric value means access another block of code

Taking a closer look at the program

Card 1

1 B  00Control Designation B: Set Block Relativiser

This first line is not a function call to the computer logic, but rather a special control word to the computer. This is referenced by a specific set of single character commands (for more information on these control words, see the Initial Orders Manual, pg 7: Initial Orders Manual)

This one is command "B" or the block relativiser control word. Its function is to inform Initial Orders (the bootstrap program) where it is to store the block of program about to be read. This block is to be stored at the 00 relative position on the drum.

This single command in this case takes up the entire first punch card as it's not actually part of our program.

Card 2

20810  Set Program Indicator 10
811  Set Program Indicator 11
 1812  Set Program Indicator 12
813  Set Program Indicator 13
 2814  Set Program Indicator 14
815  Set Program Indicator 15

The second punch card (card 2) has three order-pairs on it, including instructions 0,1 and 2.

The first order has a designation 8 and a function 10. The combination of designation and function specify the operation to be carried out by the computer when obeying the order.

Designation 8 is a command to set an indicator on the computer. There are three different types of indicator, each of which is a boolean value, either set or unset:

  • Automatic Indicator: A communicating link between the computer and a program, usually set or unset by the computer or peripheral unit (printer/card punch etc) or by a response from the Mill (the arithmetic calculation unit). These are referenced by the numbers 00 to 09.
  • Programmed Indicator: These are set, unset and tested by the running program. Think of them like boolean variables we can toggle on/off and are displayed as lights on the console. These are referenced by the numbers 10 to 19.
  • Manual Indicator: These are read-only and are set using manual control switches on the console so the operator can affect the running of a program. These are referenced by the numbers 20 to 29.

Therefore, order designation 8 says "Set Program Indicator" and the function, in this case, assigns which indicator to set. The first line is requesting to set the indicator 10 (the first of the program indicators), so this will light the first programmed indicator lights on the console.

ICT 1301 system console

The second order is very similar, and is requesting to set the program indicator 11, the second light on the console should now be set on. This continues for each of the other orders in this first card, switching on the first 6 lights on the console!

Card 3

33816  Set Program Indicator 16
817  Set Program Indicator 17
 4818  Set Program Indicator 18
819  Set Program Indicator 19
 5910  Unset Program Indicator 10
911  Unset Program Indicator 11

Card 3 continues on the pattern for the next two instructions, setting program indicator 16, 17, 18 and 19, but instruction 5 is slightly different.

The designation for these commands has changed to a 9 rather than an 8. The 9 designation command says to Unset the program indicator referenced by the Function value.

Therefore, we start unsetting the indictor 10 and 11, extinguishing those lights on the console. You can probably guess what the next punch card will be!

Card 4 & 5

46912  Unset Program Indicator 12
913  Unset Program Indicator 13
 7914  Unset Program Indicator 14
915  Unset Program Indicator 15
 8916  Unset Program Indicator 16
917  Unset Program Indicator 17
59918  Unset Program Indicator 18
919  Unset Program Indicator 19

For card 4, and the first order-pair of card 5, we're just continuing as the last card and unsetting each of the program indicator lights 12 to 17.

 10 6613BAdds 1 to a word of I.A.S
 3713BTransfers the contents of I.A.S 13 to Reg.B

From instruction 10, we're starting to get some new functions we haven't come across before. There's no designation, so we can look straight at the function to find out what command we're running. The first order is function 66, which is "Add 1 to a word of I.A.S", which means we just want to increment a number in the specified memory address by 1. The basic address location specified is 0013 and the Relativiser tells the computer which block of memory to place it in. In this case, it's the letter B, which means the current block.

To try to understand the Relativiser value, imagine that the senior programmer has decided to store the whole block of the program at IAS address 0200. That means, when we ask to increment address 0013, the computer knows that we're asking it to update address 0213. If this block is used elsewhere, say at address 0600, we don't need to rewrite where all our addresses write to, it will just automatically adjust to the new relative position 0613.

The second order of instruction 10 is function 37, which says "Transfer the contents of I.A.S address specified to Register B". Again, the address that has been specified is this block's address 0013, so it will transfer the value we've just incremented into Register B, overwriting the current value there.

You may be asking what exactly is at block address 0013? Let's jump ahead and take a quick peek of the next card and address 0013.

 13P000000 A positive number

At instruction 13, we find another of our special command designation letters, this time the letter P. The letter P tells the Initial Orders that we're going to define a Positive value. A word size in the ICT 1301 is 12 bits, so we set the 12 bits of our value in the Function and Address of the next two order-pairs. In this case, we're setting address 13 to be a positive value of zero.

Looking back above at our order-pair in instruction 10 therefore, you can hopefully see that we're incrementing this zero value by 1 then transferring that value into Register B.

 11 000 Do nothing
42911BIf Manual Indicator 29 jump 11

Instruction 11, starts with the first instruction of the order-pair being function 00, which is "do nothing"!. Ignoring that for the moment, we can see the second part of the order-pair introduces us to yet another Designation value: 4.

The 4 designation says that we want to check one of our indicators (automatic, programmed or manual) and if it's set, jump to a the new program address specified. If it's not set, then the program will continue to the next instruction.

So what, in this case, is indicator 29 that it wants to check? Looking at our paragraph above about the indicators, we can see that indicator 29 is one of the ten manual switches on the console.

Therefore, this instruction says, "Check if the switch on the console 29. If it is set, then jump to program address 0011 (within this block).". Instruction 0011 is this exact same instruction, so what we have here is a pause loop which means if the operator sets switch 29 on, the program will pause. If the switch is unset, then the program will continue.

Card 6

6124000BIf Unconditional 00, jump 0
Y 111111 Stop
 13P000000 Positive Number (constant)
 14P000000 Positive Number (constant)

Instruction 12, which is the first order-pair of card 6, again has a designation of 4 (check indicator and jump to new address if set).

The indicator we're checking in this case is indicator 00. Indicator 00 is one of the special Automatic Indicators which are set by the computer. In the case of indicator 00, this is a special indicator that is always set as true!

Therefore, this instruction is to always just jump to the specified address, in this case, to this block's address 0000 - the beginning of the program

Note that there is a further instruction written here for the second part of the order-pair, this is function 11, which is a command to stop the program and show the error message 1111 on the command console. This stop command, in this program, should never be run as the command above is to jump to address 0, but I suspect that this is just a safety command to just make sure we don't overrun further into unspecified program addresses later on should something go very wrong and somehow, the indicator 00 fails!

The final two instructions, 13 and 14 we've already discussed above, we're just initialising two words to zero so we can use them later (note that the number stored at instruction 14 is not used in this program currently).

You may have spotted one other difference on this card. The Y character shown just under the card 6 reference on the sheet! This is a note for the person who will be punching the card to punch a special marker on that card which shows that this is the end of the block. An X character here normally is the end block marker, the Y shows an end of a library subroutine and a Z is normally to show the last card in the program.

So what does our complete program do? First it sets all 10 of the Programmed Indicator lights one after the other, then switches them all off again in order. Next, it increments a counter and sets it into Register B (we can display Register B on the console, so be able to watch as the counter counts up from 1 continuously). Finally, if you set the Manual Switch 29 on the console, the program will pause and then continue if you set the switch off. This program has been used on the real "Flossie" ICT 1301 computer when it was running and we know exactly how long it took to run several loops. This means we've also been able to use this program to test that this simulation can run the commands at the same speed as the original computer! You can find out how to run this on Virtual ICT 1301 on the next page "ICT 1301 - Simulation"

Hopefully, this has given you a little bit of an example on how to write a program for the ICT 1301. More examples and a list of all the functions available can be found in the manuals below. Do let me know if you manage to write any new programs for this computer!

Learn more by reading the comprehensive manuals!

The following manuals were scanned to PDF files by the ICT 1301 Resurrection Project at http://ict1301.co.uk

Initial Orders Manual
Programmers Reference Manual
Operators Reference Manual

In the mean time, for more information, please check the ICT 1301 Resurrection Project at http://www.ict1301.co.uk/13010310.htm.