/* http://members.iinet.net.au/~dgreen/deuce/deuce.html > I have a soft spot for DEUCE. It was the computer on which I learned to program. > However, I think DEUCE has a fair claim to being, for programmers, the most complicated > computer ever put into general production. See for yourself. The programming manual is > available at John Barrett's Web site. Or check out an example of some program code - the > solution to a simple programming exercise given to new chums at Kidsgrove: specification > (44kB), flowchart (261kB), coding sheet (551kB). I was bored at work this afternoon, so when I saw this page, I thought I'd see if I could remember my 'tables of finite differences' lecture from 30 years ago... The code below is written in a simple style that should transliterate pretty easily to DEUCE code (ignoring the C code for I/O). If I were programming for the machine I'd effectively hand compile this after learning the instruction set. I've tried to keep this to relatively simple 3-address metacode to ease translation. Note, no use of multiply. Just like the old days :-) (Did the DEUCE have a hardware multiply or did the Kidsgrove programmers also use a table of finite differences? Or was there a soft multiply subroutine or extracode available?) It's actually still quite a challenging problem, at least if you limit yourself to coding with one hand tied behind your back :-) Graham Toal <gtoal@gtoal.com> */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { int rc, mem[328], init[6] = {0, -1, 0, -6, 0, 1}; toploop: memmove(mem, init, 6*sizeof(int)); /* move from constant area to ram */ fprintf(stderr, "\nN1:"); rc = scanf("%d", &mem[6]); if (rc != 1) goto err; if (mem[6] <= 0) goto err; fprintf(stderr, "N2:"); rc = scanf("%d", &mem[7]); if (rc != 1) goto err; if (mem[7] > 1024) goto err; mem[7] -= mem[6]; if ((unsigned int)mem[7] > 319) goto err; mem[7] += mem[6]; rc = fgetc(stdin); ungetc(rc, stdin); if (rc > 32) goto err; /* Ascii */ /* Calculate cubes efficiently (ie without using a multiply) */ loop: if (mem[0] >= mem[7]) goto print; /* upper bound */ mem[1] += 1; mem[2] += mem[1]; mem[3] += 6; mem[5] += mem[3]; mem[4] += mem[5]; mem[0] += 1; if (mem[0] < mem[6]) goto loop; /* lower bound - time to start */ /* Store results in mem[8..327] corresponding to 1..320 (really 0..319)*/ /* Would have been easier to print on the fly, but this enforces a memory test) */ mem[0] -= mem[6]; (mem+8)[mem[0]] = mem[4]; mem[0] += mem[6]; goto loop; print: mem[1] = mem[7] - mem[6]; mem[0] = 8; mem[1] += 8; printloop: fprintf(stderr, "%d", mem[mem[0]]); mem[0] += 1; if ((mem[0] & 7) == 0) goto line; /* print 8 per line (I think the specified */ /* 12 per line would require an extra variable, or too complex bit twiddling... (x+x+x)>>1) */ fprintf(stderr, " "); goto endline; line: fprintf(stderr, "\n"); endline: if (mem[0] <= mem[1]) goto printloop; goto toploop; err: fprintf(stderr, "No!\n"); exit(1); return(1); }