#include #define CHAR 01 #define BLOCK 02 #define INTR 04 #define EVEN 010 #define KL 020 #define ROOT 040 #define SWAP 0100 #define PIPE 0200 char *btab[] = { "rk", "rp", "rf", "tm", "tc", "hs", "hp", "ht", "rl", 0 }; char *ctab[] = { "console", "pc", "lp", "dc", "dh", "dp", "dj", "dn", "mem", "rk", "rf", "rp", "tm", "hs", "hp", "ht", "du", "tty", "rl", 0 }; struct tab { char *name; int count; int address; int key; char *codea; char *codeb; char *codec; char *coded; char *codee; char *codef; char *codeg; } table[] = { "console", -1, 60, CHAR+INTR+KL, " klin; br4\n klou; br4\n", ".globl _klrint\nklin: jsr r0,call; jmp _klrint\n", ".globl _klxint\nklou: jsr r0,call; jmp _klxint\n", "", " klopen, klclose, klread, klwrite, klioctl, nulldev, 0,", "", "int klopen(), klclose(), klread(), klwrite(), klioctl();", "mem", -1, 300, CHAR, "", "", "", "", " nulldev, nulldev, mmread, mmwrite, nodev, nulldev, 0, ", "", "int mmread(), mmwrite();", "pc", 0, 70, CHAR+INTR, " pcin; br4\n pcou; br4\n", ".globl _pcrint\npcin: jsr r0,call; jmp _pcrint\n", ".globl _pcpint\npcou: jsr r0,call; jmp _pcpint\n", "", " pcopen, pcclose, pcread, pcwrite, nodev, nulldev, 0, ", "", "int pcopen(), pcclose(), pcread(), pcwrite();", "clock", -2, 100, INTR, " kwlp; br6\n", ".globl _clock\n", "kwlp: jsr r0,call; jmp _clock\n", "", "", "", "", "parity", -1, 114, INTR, " trap; br7+7. / 11/70 parity\n", "", "", "", "", "", "", /* * 110 unused * 114 memory parity * 120 XY plotter * 124 DR11-B * 130 AD01 * 134 AFC11 * 140 AA11 * 144 AA11 * 150-174 unused */ "rl", 0, 160, BLOCK+CHAR+INTR, " rlio; br5\n", ".globl _rlintr\n", "rlio: jsr r0,call; jmp _rlintr\n", " rlopen, rlclose, rlstrategy, &rltab,", " rlopen, rlclose, rlread, rlwrite, nodev, nulldev, 0,", "int rlopen(), rlclose(), rlstrategy();\nstruct buf rltab;", "int rlread(), rlwrite();", "lp", 0, 200, CHAR+INTR, " lpou; br4\n", "", ".globl _lpint\nlpou: jsr r0,call; jmp _lpint\n", "", " lpopen, lpclose, nodev, lpwrite, nodev, nulldev, 0,", "", "int lpopen(), lpclose(), lpwrite();", "rf", 0, 204, BLOCK+CHAR+INTR, " rfio; br5\n", ".globl _rfintr\n", "rfio: jsr r0,call; jmp _rfintr\n", " nulldev, nulldev, rfstrategy, &rftab, ", " nulldev, nulldev, rfread, rfwrite, nodev, nulldev, 0,", "int rfstrategy();\nstruct buf rftab;", "int rfread(), rfwrite();", "hs", 0, 204, BLOCK+CHAR+INTR, " hsio; br5\n", ".globl _hsintr\n", "hsio: jsr r0,call; jmp _hsintr\n", " nulldev, nulldev, hsstrategy, &hstab, ", " nulldev, nulldev, hsread, hswrite, nodev, nulldev, 0,", "int hsstrategy();\nstruct buf hstab;", "int hsread(), hswrite();", /* * 210 RC */ "tc", 0, 214, BLOCK+INTR, " tcio; br6\n", ".globl _tcintr\n", "tcio: jsr r0,call; jmp _tcintr\n", " nulldev, tcclose, tcstrategy, &tctab,", "", "int tcstrategy(), tcclose();\nstruct buf tctab;", "", "rk", 0, 220, BLOCK+CHAR+INTR, " rkio; br5\n", ".globl _rkintr\n", "rkio: jsr r0,call; jmp _rkintr\n", " nulldev, nulldev, rkstrategy, &rktab,", " nulldev, nulldev, rkread, rkwrite, nodev, nulldev, 0,", "int rkstrategy();\nstruct buf rktab;", "int rkread(), rkwrite();", "tm", 0, 224, BLOCK+CHAR+INTR, " tmio; br5\n", ".globl _tmintr\n", "tmio: jsr r0,call; jmp _tmintr\n", " tmopen, tmclose, tmstrategy, &tmtab, ", " tmopen, tmclose, tmread, tmwrite, nodev, nulldev, 0,", "int tmopen(), tmclose(), tmstrategy();\nstruct buf tmtab;", "int tmread(), tmwrite();", "ht", 0, 224, BLOCK+CHAR+INTR, " htio; br5\n", ".globl _htintr\n", "htio: jsr r0,call; jmp _htintr\n", " htopen, htclose, htstrategy, &httab,", " htopen, htclose, htread, htwrite, nodev, nulldev, 0,", "int htopen(), htclose(), htstrategy();\nstruct buf httab;", "int htread(), htwrite();", "cr", 0, 230, CHAR+INTR, " crin; br6\n", "", ".globl _crint\ncrin: jsr r0,call; jmp _crint\n", "", " cropen, crclose, crread, nodev, nodev, nulldev, 0,", "", "int cropen(), crclose(), crread();", /* * 234 UDC11 */ "rp", 0, 254, BLOCK+CHAR+INTR, " rpio; br5\n", ".globl _rpintr\n", "rpio: jsr r0,call; jmp _rpintr\n", " nulldev, nulldev, rpstrategy, &rptab,", " nulldev, nulldev, rpread, rpwrite, nodev, nulldev, 0,", "int rpstrategy();\nstruct buf rptab;", "int rpread(), rpwrite();", "hp", 0, 254, BLOCK+CHAR+INTR, " hpio; br5\n", ".globl _hpintr\n", "hpio: jsr r0,call; jmp _hpintr\n", " nulldev, nulldev, hpstrategy, &hptab,", " nulldev, nulldev, hpread, hpwrite, nodev, nulldev, 0,", "int hpstrategy();\nstruct buf hptab;", "int hpread(), hpwrite();", /* * 260 TA11 * 264-274 unused */ "dc", 0, 308, CHAR+INTR, " dcin; br5+%d.\n dcou; br5+%d.\n", ".globl _dcrint\ndcin: jsr r0,call; jmp _dcrint\n", ".globl _dcxint\ndcou: jsr r0,call; jmp _dcxint\n", "", " dcopen, dcclose, dcread, dcwrite, dcioctl, nulldev, dc11,", "", "int dcopen(), dcclose(), dcread(), dcwrite(), dcioctl();\nstruct tty dc11[];", "kl", 0, 308, INTR+KL, " klin; br4+%d.\n klou; br4+%d.\n", "", "", "", "", "", "", "dp", 0, 308, CHAR+INTR, " dpin; br6+%d.\n dpou; br6+%d.\n", ".globl _dprint\ndpin: jsr r0,call; jmp _dprint\n", ".globl _dpxint\ndpou: jsr r0,call; jmp _dpxint\n", "", " dpopen, dpclose, dpread, dpwrite, nodev, nulldev, 0,", "", "int dpopen(), dpclose(), dpread(), dpwrite();", /* * DM11-A */ "dn", 0, 304, CHAR+INTR, " dnou; br5+%d.\n", "", ".globl _dnint\ndnou: jsr r0,call; jmp _dnint\n", "", " dnopen, dnclose, nodev, dnwrite, nodev, nulldev, 0,", "", "int dnopen(), dnclose(), dnwrite();", "dhdm", 0, 304, INTR, " dmin; br4+%d.\n", "", ".globl _dmint\ndmin: jsr r0,call; jmp _dmint\n", "", "", "", "", /* * DR11-A+ * DR11-C+ * PA611+ * PA611+ * DT11+ * DX11+ */ "dl", 0, 308, INTR+KL, " klin; br4+%d.\n klou; br4+%d.\n", "", "", "", "", "", "", /* * DJ11 */ "dh", 0, 308, CHAR+INTR+EVEN, " dhin; br5+%d.\n dhou; br5+%d.\n", ".globl _dhrint\ndhin: jsr r0,call; jmp _dhrint\n", ".globl _dhxint\ndhou: jsr r0,call; jmp _dhxint\n", "", " dhopen, dhclose, dhread, dhwrite, dhioctl, dhstop, dh11,", "", "int dhopen(), dhclose(), dhread(), dhwrite(), dhioctl(), dhstop();\nstruct tty dh11[];", /* * GT40 * LPS+ * DQ11 * KW11-W */ "du", 0, 308, CHAR+INTR, " duin; br6+%d.\n duou; br6+%d.\n", ".globl _durint\nduin: jsr r0,call; jmp _durint\n", ".globl _duxint\nduou: jsr r0,call; jmp _duxint\n", "", " duopen, duclose, duread, duwrite, nodev, nulldev, 0,", "", "int duopen(), duclose(), duread(), duwrite();", "tty", 1, 0, CHAR, "", "", "", "", " syopen, nulldev, syread, sywrite, sysioctl, nulldev, 0,", "", "int syopen(), syread(), sywrite(), sysioctl();", 0 }; char *stra[] = { "/ low core", "", ".data", "ZERO:", "", "br4 = 200", "br5 = 240", "br6 = 300", "br7 = 340", "", ". = ZERO+0", " br 1f", " 4", "", "/ trap vectors", " trap; br7+0. / bus error", " trap; br7+1. / illegal instruction", " trap; br7+2. / bpt-trace trap", " trap; br7+3. / iot trap", " trap; br7+4. / power fail", " trap; br7+5. / emulator trap", " start;br7+6. / system (overlaid by 'trap')", "", ". = ZERO+40", ".globl start, dump", "1: jmp start", " jmp dump", "", 0, }; char *strb[] = { "", ". = ZERO+240", " trap; br7+7. / programmed interrupt", " trap; br7+8. / floating point", " trap; br7+9. / segmentation violation", 0 }; char *strc[] = { "", "/ floating vectors", ". = ZERO+300", 0, }; char *strd[] = { "", "//////////////////////////////////////////////////////", "/ interface code to C", "//////////////////////////////////////////////////////", "", ".text", ".globl call, trap", 0 }; char *stre[] = { "#include \"../h/param.h\"", "#include \"../h/systm.h\"", "#include \"../h/buf.h\"", "#include \"../h/tty.h\"", "#include \"../h/conf.h\"", "#include \"../h/proc.h\"", "#include \"../h/text.h\"", "#include \"../h/dir.h\"", "#include \"../h/user.h\"", "#include \"../h/file.h\"", "#include \"../h/inode.h\"", "#include \"../h/acct.h\"", "", "int nulldev();", "int nodev();", 0 }; char *stre1[] = { "struct bdevsw bdevsw[] =", "{", 0, }; char *strf[] = { " 0", "};", "", 0, }; char *strf1[] = { "", "struct cdevsw cdevsw[] =", "{", 0, }; char strg[] = { " 0\n\ };\n\ int rootdev = makedev(%d, %d);\n\ int swapdev = makedev(%d, %d);\n\ int pipedev = makedev(%d, %d);\n\ int nldisp = %d;\n\ daddr_t swplo = %ld;\n\ int nswap = %l;\n\ "}; char strg1[] = { " \n\ struct buf buf[NBUF];\n\ struct file file[NFILE];\n\ struct inode inode[NINODE];\n" }; char *strg1a[] = { "int mpxchan();", "int (*ldmpx)() = mpxchan;", 0 }; char strg2[] = { "struct proc proc[NPROC];\n\ struct text text[NTEXT];\n\ struct buf bfreelist;\n\ struct acct acctbuf;\n\ struct inode *acctp;\n" }; char *strh[] = { " 0", "};", "", "int ttyopen(), ttyclose(), ttread(), ttwrite(), ttyinput(), ttstart();", 0 }; char *stri[] = { "int pkopen(), pkclose(), pkread(), pkwrite(), pkioctl(), pkrint(), pkxint();", 0 }; char *strj[] = { "struct linesw linesw[] =", "{", " ttyopen, nulldev, ttread, ttwrite, nodev, ttyinput, ttstart, /* 0 */", 0 }; char *strk[] = { " pkopen, pkclose, pkread, pkwrite, pkioctl, pkrint, pkxint, /* 1 */", 0 }; int pack; int mpx; int rootmaj = -1; int rootmin; int swapmaj = -1; int swapmin; int pipemaj = -1; int pipemin; long swplo = 4000; int nswap = 872; int pack; int nldisp = 1; main() { register struct tab *p; register char *q; int i, n, ev, nkl; int flagf, flagb, dumpht; while(input()); /* * pass1 -- create interrupt vectors */ nkl = 0; flagf = flagb = 1; freopen("l.s", "w", stdout); puke(stra); ev = 0; for(p=table; p->name; p++) if(p->count != 0 && p->key & INTR) { if(p->address>240 && flagb) { flagb = 0; puke(strb); } if(p->address >= 300) { if(flagf) { ev = 0; flagf = 0; puke(strc); } if(p->key & EVEN && ev & 07) { printf(" .=.+4\n"); ev += 4; } printf("/%s %o\n", p->name, 0300+ev); } else printf("\n. = ZERO+%d\n", p->address); n = p->count; if(n < 0) n = -n; for(i=0; ikey & KL) { printf(p->codea, nkl, nkl); nkl++; } else printf(p->codea, i, i); if (p->address<300) fprintf(stderr, "%s at %d\n", p->name, p->address+4*i); else fprintf(stderr, "%s at %o\n", p->name, 0300+ev); ev += p->address - 300; } } if(flagb) puke(strb); puke(strd); for(p=table; p->name; p++) if(p->count != 0 && p->key & INTR) printf("\n%s%s", p->codeb, p->codec); /* * pass 2 -- create configuration table */ freopen("c.c", "w", stdout); /* * declarations */ puke(stre); for (i=0; q=btab[i]; i++) { for (p=table; p->name; p++) if (equal(q, p->name) && (p->key&BLOCK) && p->count && *p->codef) printf("%s\n", p->codef); } puke(stre1); for(i=0; q=btab[i]; i++) { for(p=table; p->name; p++) if(equal(q, p->name) && (p->key&BLOCK) && p->count) { printf("%s /* %s = %d */\n", p->coded, q, i); if(p->key & ROOT) rootmaj = i; if (p->key & SWAP) swapmaj = i; if (p->key & PIPE) pipemaj = i; goto newb; } printf(" nodev, nodev, nodev, 0, /* %s = %d */\n", q, i); newb:; } if (swapmaj == -1) { swapmaj = rootmaj; swapmin = rootmin; } if (pipemaj == -1) { pipemaj = rootmaj; pipemin = rootmin; } puke(strf); for (i=0; q=ctab[i]; i++) { for (p=table; p->name; p++) if (equal(q, p->name) && (p->key&CHAR) && p->count && *p->codeg) printf("%s\n", p->codeg); } puke(strf1); for(i=0; q=ctab[i]; i++) { for(p=table; p->name; p++) if(equal(q, p->name) && (p->key&CHAR) && p->count) { printf("%s /* %s = %d */\n", p->codee, q, i); goto newc; } printf(" nodev, nodev, nodev, nodev, nodev, nulldev, 0, /* %s = %d */\n", q, i); newc:; } puke(strh); if (pack) { nldisp++; puke(stri); } puke(strj); if (pack) puke(strk); printf(strg, rootmaj, rootmin, swapmaj, swapmin, pipemaj, pipemin, nldisp, swplo, nswap); printf(strg1); if (!mpx) puke(strg1a); printf(strg2); if(rootmaj < 0) fprintf(stderr, "No root device given\n"); freopen("mch0.s", "w", stdout); dumpht = 0; for (i=0; table[i].name; i++) { if (equal(table[i].name, "ht") && table[i].count) dumpht = 1; } if (dumpht) { printf("HTDUMP = 1\n"); printf("TUDUMP = 0\n"); } else { printf("HTDUMP = 0\n"); printf("TUDUMP = 1\n"); } } puke(s, a) char **s; { char *c; while(c = *s++) { printf(c, a); printf("\n"); } } input() { char line[100]; register struct tab *q; int count, n; long num; char keyw[32], dev[32]; if (fgets(line, 100, stdin) == NULL) return(0); count = -1; n = sscanf(line, "%d%s%s%ld", &count, keyw, dev, &num); if (count == -1 && n>0) { count = 1; n++; } if (n<2) goto badl; for(q=table; q->name; q++) if(equal(q->name, keyw)) { if(q->count < 0) { fprintf(stderr, "%s: no more, no less\n", keyw); return(1); } q->count += count; if(q->address < 300 && q->count > 1) { q->count = 1; fprintf(stderr, "%s: only one\n", keyw); } return(1); } if (equal(keyw, "nswap")) { if (n<3) goto badl; if (sscanf(dev, "%ld", &num) <= 0) goto badl; nswap = num; return(1); } if (equal(keyw, "swplo")) { if (n<3) goto badl; if (sscanf(dev, "%ld", &num) <= 0) goto badl; swplo = num; return(1); } if (equal(keyw, "pack")) { pack++; return(1); } if (equal(keyw, "mpx")) { mpx++; return(1); } if(equal(keyw, "done")) return(0); if (equal(keyw, "root")) { if (n<4) goto badl; for (q=table; q->name; q++) { if (equal(q->name, dev)) { q->key |= ROOT; rootmin = num; return(1); } } fprintf(stderr, "Can't find root\n"); return(1); } if (equal(keyw, "swap")) { if (n<4) goto badl; for (q=table; q->name; q++) { if (equal(q->name, dev)) { q->key |= SWAP; swapmin = num; return(1); } } fprintf(stderr, "Can't find swap\n"); return(1); } if (equal(keyw, "pipe")) { if (n<4) goto badl; for (q=table; q->name; q++) { if (equal(q->name, dev)) { q->key |= PIPE; pipemin = num; return(1); } } fprintf(stderr, "Can't find pipe\n"); return(1); } fprintf(stderr, "%s: cannot find\n", keyw); return(1); badl: fprintf(stderr, "Bad line: %s", line); return(1); } equal(a, b) char *a, *b; { return(!strcmp(a, b)); }