This program was originally run on the SSEM and is one of three programs mentioned in a letter by Williams and Kilburn published in the 25 September 1948 issue of Nature magazine. This code was recovered from Tootill's notebook from the period and has been rewritten in modern mnemonics.
Frankly, this is hardly a complete division routine. The Divisor and d parameters must be prepared for the routine before execution. The Divisor must be shifted up n digits such that: Dividend/2 < Divisor*2^n <= Dividend. For integer division, parameter "d" (line 29) must then be set to d=31-n. The resultant Quotient is shifted such that the ON bit of d indicates the units digit of the quotient.
Written by: | Attributed to Alan Turing with corrections by Geoffrey C. Tootill. |
Obtained from: | Annals of the History of Computing, V20/N3, Jul-Sep 1998 |
Description: | Quotient = Dividend / Divisor |
Parameter Lines: | 29: d = 31 - n
30: Divisor shifted such that Dividend/2 < Divisor*2^n <= Dividend 31: Dividend |
Result Lines: | 28: Quotient (shifted, d indicates the units digit) |
00: NUM 19 -- jump address 01: LDN 31 -- Accumulator := -A 02: STO 31 -- Store as -A 03: LDN 31 -- Accumulator := -(-A) i.e., +A 04: SUB 30 -- Subtract B*2^n ; Accumulator = A - B*2^n 05: SKN -- Skip if (A-B*2^n) is Negative 06: JMP 0 -- otherwise go to line 20 ( A-B*2^n >= 0 ) 07: LDN 31 -- Accumulator := -(-A) 08: STO 31 -- Store as +A 09: LDN 28 -- Accumulator := -Quotient 10: SUB 28 -- Accumulator := -Quotient - Quotient (up-shift) 11: STO 28 -- Store -2*Quotient as Quotient (up-shifted) 12: LDN 31 -- Accumulator := -A 13: SUB 31 -- Accumulator := -A-A (up-shift A) 14: STO 31 -- Store -2*A (up-shifted A) 15: LDN 28 -- Accumulator := -Quotient 16: STO 28 -- Store as +Quotient (restore shifted Quotient) 17: SKN -- Skip if MSB of Quotient is 1 (at end) 18: JMP 26 -- otherwise go to line 3 (repeat) 19: HLT -- Stop ; Quotient in line 28 20: STO 31 -- From line 6 - Store A-B*2^n as A 21: LDN 29 -- Routine to set bit d of Quotient 22: SUB 28 -- and up-shift 23: SUB 28 -- Quotient 24: STO 28 -- Store -(2*Quotient)-1 as Quotient 25: JMP 27 -- Go to line 12 26: NUM 2 -- jump address 27: NUM 11 -- jump address 28: -- Quotient (Answer appears here) 29: BNUM 00000000000000000000000000000100 -- 2^d where d=31-n, see line 30 for n 30: NUM 20 -- B (Divisor*2^n) (example: 5*2^2=20) 31: NUM 36 -- A (initial Dividend) (example: 36/5=7)