on a memory-reference instruction specified whether the address should be modified by the M part of a Q Store, and, if so, whether the C part should be decremented by 1 and the M part incremented by the contents of the I part. This made the coding of counting loops very efficient. Three additional Nest levels and one additional SJNS level were reserved to Director, the Operating System, allowing short-path interrupts to be handled without explicit register saving and restoring. As a result, the interrupt overhead was only 3 clock cycles. Instruction set Instructions were of 1, 2 or 3 syllables. Most arithmetic took place at the top of the Nest and used zero-address, 1-syllable instructions, although address arithmetic and index updating were handled separately in the Q store. Q Store handling, and some memory reference instructions used 2 syllables. Memory reference instructions with a 16-bit address offset, most jump instructions, and 16-bit literal load instructions, all used 3 syllables. Dense instruction coding, and intensive use of the register sets, meant that relatively few store accesses were needed for common scientific codes, such as scalar product and polynomial inner loops. This did much to offset the relatively slow core cycle time, giving the KDF9 about a third of the speed of its much more famous, but 8 times more expensive and much less commercially successful contemporary, the Manchester/Ferranti Atlas Computer. Multiprogramming (timesharing) The KDF9 was one of the earliest fully hardware-secured multiprogramming systems. Up to four programs could be run at once under the control of its elegantly simple operating system, the Timesharing Director, each being confined to its own core area by BA (Base Address) and NOL (Number of Locations) registers. Each program had its own sets of stack and Q store registers, which were activated when that program was dispatched, so that context switching was very efficient. Each program could drive hardware I/O devices directly, but was limited by hardware checks to those that the Director had allocated to it. Any attempt to use an unallocated device caused an error interrupt. A similar interrupt resulted from overfilling (or over-emptying) the Nest or SJNS, or attempting to access storage at an address above that given in the NOL register. Somewhat different was the Lock-Out interrupt, which resulted from trying to access an area of store that was currently being used by an I/O device, so that there was hardware