?? mkconf.c
字號(hào):
#define CHAR 01#define BLOCK 02#define INTR 04#define EVEN 010#define KL 020#define ROOT 040char *btab[]{ "rk", "rp", "rf", "tm", "tc", "hs", "hp", "ht", 0};char *ctab[]{ "console", "pc", "lp", "dc", "dh", "dp", "dj", "dn", "mem", "rk", "rf", "rp", "tm", "hs", "hp", "ht", 0};struct tab{ char *name; int count; int address; int key; char *codea; char *codeb; char *codec; char *coded; char *codee;} table[]{ "console", -1, 60, CHAR+INTR+KL, "\tklin; br4\n\tklou; br4\n", ".globl\t_klrint\nklin:\tjsr\tr0,call; _klrint\n", ".globl\t_klxint\nklou:\tjsr\tr0,call; _klxint\n", "", "\t&klopen, &klclose, &klread, &klwrite, &klsgtty,", "mem", -1, 300, CHAR, "", "", "", "", "\t&nulldev, &nulldev, &mmread, &mmwrite, &nodev,", "pc", 0, 70, CHAR+INTR, "\tpcin; br4\n\tpcou; br4\n", ".globl\t_pcrint\npcin:\tjsr\tr0,call; _pcrint\n", ".globl\t_pcpint\npcou:\tjsr\tr0,call; _pcpint\n", "", "\t&pcopen, &pcclose, &pcread, &pcwrite, &nodev,", "clock", -2, 100, INTR, "\tkwlp; br6\n", ".globl\t_clock\n", "kwlp:\tjsr\tr0,call; _clock\n", "", "", "parity", -1, 114, INTR, "\ttrap; br7+7.\t\t/ 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 */ "lp", 0, 200, CHAR+INTR, "\tlpou; br4\n", "", ".globl\t_lpint\nlpou:\tjsr\tr0,call; _lpint\n", "", "\t&lpopen, &lpclose, &nodev, &lpwrite, &nodev,", "rf", 0, 204, BLOCK+CHAR+INTR, "\trfio; br5\n", ".globl\t_rfintr\n", "rfio:\tjsr\tr0,call; _rfintr\n", "\t&nulldev,\t&nulldev,\t&rfstrategy, \t&rftab,", "\t&nulldev, &nulldev, &rfread, &rfwrite, &nodev,", "hs", 0, 204, BLOCK+CHAR+INTR, "\thsio; br5\n", ".globl\t_hsintr\n", "hsio:\tjsr\tr0,call; _hsintr\n", "\t&nulldev,\t&nulldev,\t&hsstrategy, \t&hstab,", "\t&nulldev, &nulldev, &hsread, &hswrite, &nodev,",/* * 210 RC */ "tc", 0, 214, BLOCK+INTR, "\ttcio; br6\n", ".globl\t_tcintr\n", "tcio:\tjsr\tr0,call; _tcintr\n", "\t&nulldev,\t&tcclose,\t&tcstrategy, \t&tctab,", "", "rk", 0, 220, BLOCK+CHAR+INTR, "\trkio; br5\n", ".globl\t_rkintr\n", "rkio:\tjsr\tr0,call; _rkintr\n", "\t&nulldev,\t&nulldev,\t&rkstrategy, \t&rktab,", "\t&nulldev, &nulldev, &rkread, &rkwrite, &nodev,", "tm", 0, 224, BLOCK+CHAR+INTR, "\ttmio; br5\n", ".globl\t_tmintr\n", "tmio:\tjsr\tr0,call; _tmintr\n", "\t&tmopen,\t&tmclose,\t&tmstrategy, \t&tmtab,", "\t&tmopen, &tmclose, &tmread, &tmwrite, &nodev,", "ht", 0, 224, BLOCK+CHAR+INTR, "\thtio; br5\n", ".globl\t_htintr\n", "htio:\tjsr\tr0,call; _htintr\n", "\t&htopen,\t&htclose,\t&htstrategy, \t&httab,", "\t&htopen, &htclose, &htread, &htwrite, &nodev,", "cr", 0, 230, CHAR+INTR, "\tcrin; br6\n", "", ".globl\t_crint\ncrin:\tjsr\tr0,call; _crint\n", "", "\t&cropen, &crclose, &crread, &nodev, &nodev,",/* * 234 UDC11 */ "rp", 0, 254, BLOCK+CHAR+INTR, "\trpio; br5\n", ".globl\t_rpintr\n", "rpio:\tjsr\tr0,call; _rpintr\n", "\t&nulldev,\t&nulldev,\t&rpstrategy, \t&rptab,", "\t&nulldev, &nulldev, &rpread, &rpwrite, &nodev,", "hp", 0, 254, BLOCK+CHAR+INTR, "\thpio; br5\n", ".globl\t_hpintr\n", "hpio:\tjsr\tr0,call; _hpintr\n", "\t&hpopen,\t&nulldev,\t&hpstrategy, \t&hptab,", "\t&hpopen, &nulldev, &hpread, &hpwrite, &nodev,",/* * 260 TA11 * 264-274 unused */ "dc", 0, 308, CHAR+INTR, "\tdcin; br5+%d.\n\tdcou; br5+%d.\n", ".globl\t_dcrint\ndcin:\tjsr\tr0,call; _dcrint\n", ".globl\t_dcxint\ndcou:\tjsr\tr0,call; _dcxint\n", "", "\t&dcopen, &dcclose, &dcread, &dcwrite, &dcsgtty,", "kl", 0, 308, INTR+KL, "\tklin; br4+%d.\n\tklou; br4+%d.\n", "", "", "", "", "dp", 0, 308, CHAR+INTR, "\tdpin; br6+%d.\n\tdpou; br6+%d.\n", ".globl\t_dprint\ndpin:\tjsr\tr0,call; _dprint\n", ".globl\t_dpxint\ndpou:\tjsr\tr0,call; _dpxint\n", "", "\t&dpopen, &dpclose, &dpread, &dpwrite, &nodev,",/* * DM11-A */ "dn", 0, 304, CHAR+INTR, "\tdnou; br5+%d.\n", "", ".globl\t_dnint\ndnou:\tjsr\tr0,call; _dnint\n", "", "\t&dnopen, &dnclose, &nodev, &dnwrite, &nodev,", "dhdm", 0, 304, INTR, "\tdmin; br4+%d.\n", "", ".globl\t_dmint\ndmin:\tjsr\tr0,call; _dmint\n", "", "",/* * DR11-A+ * DR11-C+ * PA611+ * PA611+ * DT11+ * DX11+ */ "dl", 0, 308, INTR+KL, "\tklin; br4+%d.\n\tklou; br4+%d.\n", "", "", "", "",/* * DJ11 */ "dh", 0, 308, CHAR+INTR+EVEN, "\tdhin; br5+%d.\n\tdhou; br5+%d.\n", ".globl\t_dhrint\ndhin:\tjsr\tr0,call; _dhrint\n", ".globl\t_dhxint\ndhou:\tjsr\tr0,call; _dhxint\n", "", "\t&dhopen, &dhclose, &dhread, &dhwrite, &dhsgtty,",/* * GT40 * LPS+ * VT20 */ 0};char *stra[]{ "/ low core", "", "br4 = 200", "br5 = 240", "br6 = 300", "br7 = 340", "", ". = 0^.", "\tbr\t1f", "\t4", "", "/ trap vectors", "\ttrap; br7+0.\t\t/ bus error", "\ttrap; br7+1.\t\t/ illegal instruction", "\ttrap; br7+2.\t\t/ bpt-trace trap", "\ttrap; br7+3.\t\t/ iot trap", "\ttrap; br7+4.\t\t/ power fail", "\ttrap; br7+5.\t\t/ emulator trap", "\ttrap; br7+6.\t\t/ system entry", "", ". = 40^.", ".globl\tstart, dump", "1:\tjmp\tstart", "\tjmp\tdump", "", 0,};char *strb[]{ "", ". = 240^.", "\ttrap; br7+7.\t\t/ programmed interrupt", "\ttrap; br7+8.\t\t/ floating point", "\ttrap; br7+9.\t\t/ segmentation violation", 0};char *strc[]{ "", "/ floating vectors", ". = 300^.", 0,};char *strd[]{ "", "//////////////////////////////////////////////////////", "/\t\tinterface code to C", "//////////////////////////////////////////////////////", "", ".globl\tcall, trap", 0};char *stre[]{ "/*", " */", "", "int\t(*bdevsw[])()", "{", 0,};char *strf[]{ "\t0", "};", "", "int\t(*cdevsw[])()", "{", 0,};char *strg[]{ "\t0", "};", "", "int\trootdev\t{(%d<<8)|0};", "int\tswapdev\t{(%d<<8)|0};", "int\tswplo\t4000;\t/* cannot be zero */", "int\tnswap\t872;", 0,};int fout;int root -1;main(){ register struct tab *p; register *q; int i, n, ev, nkl; int flagf, flagb; while(input());/* * pass1 -- create interrupt vectors */ nkl = 0; flagf = flagb = 1; fout = creat("l.s", 0666); puke(stra); 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("\t.=.+4\n"); ev =+ 4; } ev =+ p->address - 300; } else printf("\n. = %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(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); flush(); close(fout);/* * pass 2 -- create configuration table */ fout = creat("c.c", 0666); 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) { printf("%s\t/* %s */\n", p->coded, q); if(p->key & ROOT) root = i; goto newb; } printf("\t&nodev,\t\t&nodev,\t\t&nodev,\t\t0,\t/* %s */\n", q); newb:; } 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) { printf("%s\t/* %s */\n", p->codee, q); goto newc; } printf("\t&nodev, &nodev, &nodev, &nodev, &nodev,\t/* %s */\n", q); newc:; } puke(strg, root); flush(); close(fout); if(root < 0) write(2, "no block device given\n", 22);}puke(s, a)char **s;{ char *c; while(c = *s++) { printf(c, a); printf("\n"); }}input(){ char line[100]; register char *p; register struct tab *q; register n; p = line; while((n=getchar()) != '\n') { if(n == 0) return(0); if(n == ' ' || n == '\t') continue; *p++ = n; } *p++ = 0; n = 0; p = line; while(*p>='0' && *p<='9') { n =* 10; n =+ *p++ - '0'; } if(n == 0) n = 1; if(*p == 0) return(1); for(q=table; q->name; q++) if(equal(q->name, p)) { if(root < 0 && (q->key&BLOCK)) { root = 0; q->key =| ROOT; } if(q->count < 0) { printf("%s: no more, no less\n", p); return(1); } q->count =+ n; if(q->address < 300 && q->count > 1) { q->count = 1; printf("%s: only one\n", p); } return(1); } if(equal(p, "done")) return(0); printf("%s: cannot find\n", p); return(1);}equal(a, b)char *a, *b;{ while(*a++ == *b) if(*b++ == 0) return(1); return(0);}getchar(){ int c; c = 0; read(0, &c, 1); return(c);}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -