home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- #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; i<n; i++) {
- if(p->key & 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));
- }
-