Research V7 development
[unix-history] / usr / sys / conf / mkconf.c
CommitLineData
27821c6a
KT
1#include <stdio.h>
2
3#define CHAR 01
4#define BLOCK 02
5#define INTR 04
6#define EVEN 010
7#define KL 020
8#define ROOT 040
9#define SWAP 0100
10#define PIPE 0200
11
12char *btab[] =
13{
14 "rk",
15 "rp",
16 "rf",
17 "tm",
18 "tc",
19 "hs",
20 "hp",
21 "ht",
22 "rl",
23 0
24};
25char *ctab[] =
26{
27 "console",
28 "pc",
29 "lp",
30 "dc",
31 "dh",
32 "dp",
33 "dj",
34 "dn",
35 "mem",
36 "rk",
37 "rf",
38 "rp",
39 "tm",
40 "hs",
41 "hp",
42 "ht",
43 "du",
44 "tty",
45 "rl",
46 0
47};
48struct tab
49{
50 char *name;
51 int count;
52 int address;
53 int key;
54 char *codea;
55 char *codeb;
56 char *codec;
57 char *coded;
58 char *codee;
59 char *codef;
60 char *codeg;
61} table[] =
62{
63 "console",
64 -1, 60, CHAR+INTR+KL,
65 " klin; br4\n klou; br4\n",
66 ".globl _klrint\nklin: jsr r0,call; jmp _klrint\n",
67 ".globl _klxint\nklou: jsr r0,call; jmp _klxint\n",
68 "",
69 " klopen, klclose, klread, klwrite, klioctl, nulldev, 0,",
70 "",
71 "int klopen(), klclose(), klread(), klwrite(), klioctl();",
72
73 "mem",
74 -1, 300, CHAR,
75 "",
76 "",
77 "",
78 "",
79 " nulldev, nulldev, mmread, mmwrite, nodev, nulldev, 0, ",
80 "",
81 "int mmread(), mmwrite();",
82
83 "pc",
84 0, 70, CHAR+INTR,
85 " pcin; br4\n pcou; br4\n",
86 ".globl _pcrint\npcin: jsr r0,call; jmp _pcrint\n",
87 ".globl _pcpint\npcou: jsr r0,call; jmp _pcpint\n",
88 "",
89 " pcopen, pcclose, pcread, pcwrite, nodev, nulldev, 0, ",
90 "",
91 "int pcopen(), pcclose(), pcread(), pcwrite();",
92
93 "clock",
94 -2, 100, INTR,
95 " kwlp; br6\n",
96 ".globl _clock\n",
97 "kwlp: jsr r0,call; jmp _clock\n",
98 "",
99 "",
100 "",
101 "",
102
103 "parity",
104 -1, 114, INTR,
105 " trap; br7+7. / 11/70 parity\n",
106 "",
107 "",
108 "",
109 "",
110 "",
111 "",
112
113/*
114 * 110 unused
115 * 114 memory parity
116 * 120 XY plotter
117 * 124 DR11-B
118 * 130 AD01 & RL01
119*/
120
121 "rl",
122 0, 130, BLOCK+CHAR+INTR,
123 " rlio; br5\n",
124 ".globl _rlintr\n",
125 "rlio: jsr r0,call; jmp _rlintr\n",
126 " nulldev, nulldev, rlstrategy, &rltab,",
127 " rlopen, rlclose, rlread, rlwrite, nodev, nulldev, 0,",
128 "int rlstrategy();\nstruct buf rltab;",
129 "int rlopen(), rlclose(), rlread(), rlwrite();",
130
131/*
132 * 134 AFC11
133 * 140 AA11
134 * 144 AA11
135 * 150-174 unused
136 */
137
138 "lp",
139 0, 200, CHAR+INTR,
140 " lpou; br4\n",
141 "",
142 ".globl _lpint\nlpou: jsr r0,call; jmp _lpint\n",
143 "",
144 " lpopen, lpclose, nodev, lpwrite, nodev, nulldev, 0,",
145 "",
146 "int lpopen(), lpclose(), lpwrite();",
147
148 "rf",
149 0, 204, BLOCK+CHAR+INTR,
150 " rfio; br5\n",
151 ".globl _rfintr\n",
152 "rfio: jsr r0,call; jmp _rfintr\n",
153 " nulldev, nulldev, rfstrategy, &rftab, ",
154 " nulldev, nulldev, rfread, rfwrite, nodev, nulldev, 0,",
155 "int rfstrategy();\nstruct buf rftab;",
156 "int rfread(), rfwrite();",
157
158 "hs",
159 0, 204, BLOCK+CHAR+INTR,
160 " hsio; br5\n",
161 ".globl _hsintr\n",
162 "hsio: jsr r0,call; jmp _hsintr\n",
163 " nulldev, nulldev, hsstrategy, &hstab, ",
164 " nulldev, nulldev, hsread, hswrite, nodev, nulldev, 0,",
165 "int hsstrategy();\nstruct buf hstab;",
166 "int hsread(), hswrite();",
167
168/*
169 * 210 RC
170 */
171
172 "tc",
173 0, 214, BLOCK+INTR,
174 " tcio; br6\n",
175 ".globl _tcintr\n",
176 "tcio: jsr r0,call; jmp _tcintr\n",
177 " nulldev, tcclose, tcstrategy, &tctab,",
178 "",
179 "int tcstrategy(), tcclose();\nstruct buf tctab;",
180 "",
181
182 "rk",
183 0, 220, BLOCK+CHAR+INTR,
184 " rkio; br5\n",
185 ".globl _rkintr\n",
186 "rkio: jsr r0,call; jmp _rkintr\n",
187 " nulldev, nulldev, rkstrategy, &rktab,",
188 " nulldev, nulldev, rkread, rkwrite, nodev, nulldev, 0,",
189 "int rkstrategy();\nstruct buf rktab;",
190 "int rkread(), rkwrite();",
191
192 "tm",
193 0, 224, BLOCK+CHAR+INTR,
194 " tmio; br5\n",
195 ".globl _tmintr\n",
196 "tmio: jsr r0,call; jmp _tmintr\n",
197 " tmopen, tmclose, tmstrategy, &tmtab, ",
198 " tmopen, tmclose, tmread, tmwrite, nodev, nulldev, 0,",
199 "int tmopen(), tmclose(), tmstrategy();\nstruct buf tmtab;",
200 "int tmread(), tmwrite();",
201
202 "ht",
203 0, 224, BLOCK+CHAR+INTR,
204 " htio; br5\n",
205 ".globl _htintr\n",
206 "htio: jsr r0,call; jmp _htintr\n",
207 " htopen, htclose, htstrategy, &httab,",
208 " htopen, htclose, htread, htwrite, nodev, nulldev, 0,",
209 "int htopen(), htclose(), htstrategy();\nstruct buf httab;",
210 "int htread(), htwrite();",
211
212 "cr",
213 0, 230, CHAR+INTR,
214 " crin; br6\n",
215 "",
216 ".globl _crint\ncrin: jsr r0,call; jmp _crint\n",
217 "",
218 " cropen, crclose, crread, nodev, nodev, nulldev, 0,",
219 "",
220 "int cropen(), crclose(), crread();",
221
222/*
223 * 234 UDC11
224 */
225
226 "rp",
227 0, 254, BLOCK+CHAR+INTR,
228 " rpio; br5\n",
229 ".globl _rpintr\n",
230 "rpio: jsr r0,call; jmp _rpintr\n",
231 " nulldev, nulldev, rpstrategy, &rptab,",
232 " nulldev, nulldev, rpread, rpwrite, nodev, nulldev, 0,",
233 "int rpstrategy();\nstruct buf rptab;",
234 "int rpread(), rpwrite();",
235
236 "hp",
237 0, 254, BLOCK+CHAR+INTR,
238 " hpio; br5\n",
239 ".globl _hpintr\n",
240 "hpio: jsr r0,call; jmp _hpintr\n",
241 " nulldev, nulldev, hpstrategy, &hptab,",
242 " nulldev, nulldev, hpread, hpwrite, nodev, nulldev, 0,",
243 "int hpstrategy();\nstruct buf hptab;",
244 "int hpread(), hpwrite();",
245
246/*
247 * 260 TA11
248 * 264-274 unused
249 */
250
251 "dc",
252 0, 308, CHAR+INTR,
253 " dcin; br5+%d.\n dcou; br5+%d.\n",
254 ".globl _dcrint\ndcin: jsr r0,call; jmp _dcrint\n",
255 ".globl _dcxint\ndcou: jsr r0,call; jmp _dcxint\n",
256 "",
257 " dcopen, dcclose, dcread, dcwrite, dcioctl, nulldev, dc11,",
258 "",
259 "int dcopen(), dcclose(), dcread(), dcwrite(), dcioctl();\nstruct tty dc11[];",
260
261 "kl",
262 0, 308, INTR+KL,
263 " klin; br4+%d.\n klou; br4+%d.\n",
264 "",
265 "",
266 "",
267 "",
268 "",
269 "",
270
271 "dp",
272 0, 308, CHAR+INTR,
273 " dpin; br6+%d.\n dpou; br6+%d.\n",
274 ".globl _dprint\ndpin: jsr r0,call; jmp _dprint\n",
275 ".globl _dpxint\ndpou: jsr r0,call; jmp _dpxint\n",
276 "",
277 " dpopen, dpclose, dpread, dpwrite, nodev, nulldev, 0,",
278 "",
279 "int dpopen(), dpclose(), dpread(), dpwrite();",
280
281/*
282 * DM11-A
283 */
284
285 "dn",
286 0, 304, CHAR+INTR,
287 " dnou; br5+%d.\n",
288 "",
289 ".globl _dnint\ndnou: jsr r0,call; jmp _dnint\n",
290 "",
291 " dnopen, dnclose, nodev, dnwrite, nodev, nulldev, 0,",
292 "",
293 "int dnopen(), dnclose(), dnwrite();",
294
295 "dhdm",
296 0, 304, INTR,
297 " dmin; br4+%d.\n",
298 "",
299 ".globl _dmint\ndmin: jsr r0,call; jmp _dmint\n",
300 "",
301 "",
302 "",
303 "",
304
305/*
306 * DR11-A+
307 * DR11-C+
308 * PA611+
309 * PA611+
310 * DT11+
311 * DX11+
312 */
313
314 "dl",
315 0, 308, INTR+KL,
316 " klin; br4+%d.\n klou; br4+%d.\n",
317 "",
318 "",
319 "",
320 "",
321 "",
322 "",
323
324/*
325 * DJ11
326 */
327
328 "dh",
329 0, 308, CHAR+INTR+EVEN,
330 " dhin; br5+%d.\n dhou; br5+%d.\n",
331 ".globl _dhrint\ndhin: jsr r0,call; jmp _dhrint\n",
332 ".globl _dhxint\ndhou: jsr r0,call; jmp _dhxint\n",
333 "",
334 " dhopen, dhclose, dhread, dhwrite, dhioctl, dhstop, dh11,",
335 "",
336 "int dhopen(), dhclose(), dhread(), dhwrite(), dhioctl(), dhstop();\nstruct tty dh11[];",
337
338/*
339 * GT40
340 * LPS+
341 * DQ11
342 * KW11-W
343 */
344
345 "du",
346 0, 308, CHAR+INTR,
347 " duin; br6+%d.\n duou; br6+%d.\n",
348 ".globl _durint\nduin: jsr r0,call; jmp _durint\n",
349 ".globl _duxint\nduou: jsr r0,call; jmp _duxint\n",
350 "",
351 " duopen, duclose, duread, duwrite, nodev, nulldev, 0,",
352 "",
353 "int duopen(), duclose(), duread(), duwrite();",
354
355 "tty",
356 1, 0, CHAR,
357 "",
358 "",
359 "",
360 "",
361 " syopen, nulldev, syread, sywrite, sysioctl, nulldev, 0,",
362 "",
363 "int syopen(), syread(), sywrite(), sysioctl();",
364
365 0
366};
367
368char *stra[] =
369{
370 "/ low core",
371 "",
372 ".data",
373 "ZERO:",
374 "",
375 "br4 = 200",
376 "br5 = 240",
377 "br6 = 300",
378 "br7 = 340",
379 "",
380 ". = ZERO+0",
381 " br 1f",
382 " 4",
383 "",
384 "/ trap vectors",
385 " trap; br7+0. / bus error",
386 " trap; br7+1. / illegal instruction",
387 " trap; br7+2. / bpt-trace trap",
388 " trap; br7+3. / iot trap",
389 " trap; br7+4. / power fail",
390 " trap; br7+5. / emulator trap",
391 " start;br7+6. / system (overlaid by 'trap')",
392 "",
393 ". = ZERO+40",
394 ".globl start, dump",
395 "1: jmp start",
396 " jmp dump",
397 "",
398 0,
399};
400
401char *strb[] =
402{
403 "",
404 ". = ZERO+240",
405 " trap; br7+7. / programmed interrupt",
406 " trap; br7+8. / floating point",
407 " trap; br7+9. / segmentation violation",
408 0
409};
410
411char *strc[] =
412{
413 "",
414 "/ floating vectors",
415 ". = ZERO+300",
416 0,
417};
418
419char *strd[] =
420{
421 "",
422 "//////////////////////////////////////////////////////",
423 "/ interface code to C",
424 "//////////////////////////////////////////////////////",
425 "",
426 ".text",
427 ".globl call, trap",
428 0
429};
430
431char *stre[] =
432{
433 "#include \"../h/param.h\"",
434 "#include \"../h/systm.h\"",
435 "#include \"../h/buf.h\"",
436 "#include \"../h/tty.h\"",
437 "#include \"../h/conf.h\"",
438 "#include \"../h/proc.h\"",
439 "#include \"../h/text.h\"",
440 "#include \"../h/dir.h\"",
441 "#include \"../h/user.h\"",
442 "#include \"../h/file.h\"",
443 "#include \"../h/inode.h\"",
444 "#include \"../h/acct.h\"",
445 "",
446 "int nulldev();",
447 "int nodev();",
448 0
449};
450
451char *stre1[] =
452{
453 "struct bdevsw bdevsw[] =",
454 "{",
455 0,
456};
457
458char *strf[] =
459{
460 " 0",
461 "};",
462 "",
463 0,
464};
465
466char *strf1[] =
467{
468 "",
469 "struct cdevsw cdevsw[] =",
470 "{",
471 0,
472};
473
474char strg[] =
475{
476" 0\n\
477};\n\
478int rootdev = makedev(%d, %d);\n\
479int swapdev = makedev(%d, %d);\n\
480int pipedev = makedev(%d, %d);\n\
481int nldisp = %d;\n\
482daddr_t swplo = %ld;\n\
483int nswap = %l;\n\
484"};
485
486char strg1[] =
487{
488" \n\
489struct buf buf[NBUF];\n\
490struct file file[NFILE];\n\
491struct inode inode[NINODE];\n"
492};
493
494char *strg1a[] =
495{
496 "int mpxchan();",
497 "int (*ldmpx)() = mpxchan;",
498 0
499};
500
501char strg2[] =
502{
503"struct proc proc[NPROC];\n\
504struct text text[NTEXT];\n\
505struct buf bfreelist;\n\
506struct acct acctbuf;\n\
507struct inode *acctp;\n"
508};
509
510char *strh[] =
511{
512 " 0",
513 "};",
514 "",
515 "int ttyopen(), ttyclose(), ttread(), ttwrite(), ttyinput(), ttstart();",
516 0
517};
518
519char *stri[] =
520{
521 "int pkopen(), pkclose(), pkread(), pkwrite(), pkioctl(), pkrint(), pkxint();",
522 0
523};
524
525char *strj[] =
526{
527 "struct linesw linesw[] =",
528 "{",
529 " ttyopen, nulldev, ttread, ttwrite, nodev, ttyinput, ttstart, /* 0 */",
530 0
531};
532
533char *strk[] =
534{
535 " pkopen, pkclose, pkread, pkwrite, pkioctl, pkrint, pkxint, /* 1 */",
536 0
537};
538
539int pack;
540int mpx;
541int rootmaj = -1;
542int rootmin;
543int swapmaj = -1;
544int swapmin;
545int pipemaj = -1;
546int pipemin;
547long swplo = 4000;
548int nswap = 872;
549int pack;
550int nldisp = 1;
551
552main()
553{
554 register struct tab *p;
555 register char *q;
556 int i, n, ev, nkl;
557 int flagf, flagb, dumpht;
558
559 while(input());
560
561/*
562 * pass1 -- create interrupt vectors
563 */
564 nkl = 0;
565 flagf = flagb = 1;
566 freopen("l.s", "w", stdout);
567 puke(stra);
568 ev = 0;
569 for(p=table; p->name; p++)
570 if(p->count != 0 && p->key & INTR) {
571 if(p->address>240 && flagb) {
572 flagb = 0;
573 puke(strb);
574 }
575 if(p->address >= 300) {
576 if(flagf) {
577 ev = 0;
578 flagf = 0;
579 puke(strc);
580 }
581 if(p->key & EVEN && ev & 07) {
582 printf(" .=.+4\n");
583 ev += 4;
584 }
585 printf("/%s %o\n", p->name, 0300+ev);
586 } else
587 printf("\n. = ZERO+%d\n", p->address);
588 n = p->count;
589 if(n < 0)
590 n = -n;
591 for(i=0; i<n; i++) {
592 if(p->key & KL) {
593 printf(p->codea, nkl, nkl);
594 nkl++;
595 } else
596 printf(p->codea, i, i);
597 if (p->address<300)
598 fprintf(stderr, "%s at %d\n", p->name, p->address+4*i);
599 else
600 fprintf(stderr, "%s at %o\n", p->name, 0300+ev);
601 ev += p->address - 300;
602 }
603 }
604 if(flagb)
605 puke(strb);
606 puke(strd);
607 for(p=table; p->name; p++)
608 if(p->count != 0 && p->key & INTR)
609 printf("\n%s%s", p->codeb, p->codec);
610
611/*
612 * pass 2 -- create configuration table
613 */
614
615 freopen("c.c", "w", stdout);
616 /*
617 * declarations
618 */
619 puke(stre);
620 for (i=0; q=btab[i]; i++) {
621 for (p=table; p->name; p++)
622 if (equal(q, p->name) &&
623 (p->key&BLOCK) && p->count && *p->codef)
624 printf("%s\n", p->codef);
625 }
626 puke(stre1);
627 for(i=0; q=btab[i]; i++) {
628 for(p=table; p->name; p++)
629 if(equal(q, p->name) &&
630 (p->key&BLOCK) && p->count) {
631 printf("%s /* %s = %d */\n", p->coded, q, i);
632 if(p->key & ROOT)
633 rootmaj = i;
634 if (p->key & SWAP)
635 swapmaj = i;
636 if (p->key & PIPE)
637 pipemaj = i;
638 goto newb;
639 }
640 printf(" nodev, nodev, nodev, 0, /* %s = %d */\n", q, i);
641 newb:;
642 }
643 if (swapmaj == -1) {
644 swapmaj = rootmaj;
645 swapmin = rootmin;
646 }
647 if (pipemaj == -1) {
648 pipemaj = rootmaj;
649 pipemin = rootmin;
650 }
651 puke(strf);
652 for (i=0; q=ctab[i]; i++) {
653 for (p=table; p->name; p++)
654 if (equal(q, p->name) &&
655 (p->key&CHAR) && p->count && *p->codeg)
656 printf("%s\n", p->codeg);
657 }
658 puke(strf1);
659 for(i=0; q=ctab[i]; i++) {
660 for(p=table; p->name; p++)
661 if(equal(q, p->name) &&
662 (p->key&CHAR) && p->count) {
663 printf("%s /* %s = %d */\n", p->codee, q, i);
664 goto newc;
665 }
666 printf(" nodev, nodev, nodev, nodev, nodev, nulldev, 0, /* %s = %d */\n", q, i);
667 newc:;
668 }
669 puke(strh);
670 if (pack) {
671 nldisp++;
672 puke(stri);
673 }
674 puke(strj);
675 if (pack)
676 puke(strk);
677 printf(strg, rootmaj, rootmin,
678 swapmaj, swapmin,
679 pipemaj, pipemin,
680 nldisp,
681 swplo, nswap);
682 printf(strg1);
683 if (!mpx)
684 puke(strg1a);
685 printf(strg2);
686 if(rootmaj < 0)
687 fprintf(stderr, "No root device given\n");
688 freopen("mch0.s", "w", stdout);
689 dumpht = 0;
690 for (i=0; table[i].name; i++) {
691 if (equal(table[i].name, "ht") && table[i].count)
692 dumpht = 1;
693 }
694 if (dumpht) {
695 printf("HTDUMP = 1\n");
696 printf("TUDUMP = 0\n");
697 } else {
698 printf("HTDUMP = 0\n");
699 printf("TUDUMP = 1\n");
700 }
701}
702
703puke(s, a)
704char **s;
705{
706 char *c;
707
708 while(c = *s++) {
709 printf(c, a);
710 printf("\n");
711 }
712}
713
714input()
715{
716 char line[100];
717 register struct tab *q;
718 int count, n;
719 long num;
720 char keyw[32], dev[32];
721
722 if (fgets(line, 100, stdin) == NULL)
723 return(0);
724 count = -1;
725 n = sscanf(line, "%d%s%s%ld", &count, keyw, dev, &num);
726 if (count == -1 && n>0) {
727 count = 1;
728 n++;
729 }
730 if (n<2)
731 goto badl;
732 for(q=table; q->name; q++)
733 if(equal(q->name, keyw)) {
734 if(q->count < 0) {
735 fprintf(stderr, "%s: no more, no less\n", keyw);
736 return(1);
737 }
738 q->count += count;
739 if(q->address < 300 && q->count > 1) {
740 q->count = 1;
741 fprintf(stderr, "%s: only one\n", keyw);
742 }
743 return(1);
744 }
745 if (equal(keyw, "nswap")) {
746 if (n<3)
747 goto badl;
748 if (sscanf(dev, "%ld", &num) <= 0)
749 goto badl;
750 nswap = num;
751 return(1);
752 }
753 if (equal(keyw, "swplo")) {
754 if (n<3)
755 goto badl;
756 if (sscanf(dev, "%ld", &num) <= 0)
757 goto badl;
758 swplo = num;
759 return(1);
760 }
761 if (equal(keyw, "pack")) {
762 pack++;
763 return(1);
764 }
765 if (equal(keyw, "mpx")) {
766 mpx++;
767 return(1);
768 }
769 if(equal(keyw, "done"))
770 return(0);
771 if (equal(keyw, "root")) {
772 if (n<4)
773 goto badl;
774 for (q=table; q->name; q++) {
775 if (equal(q->name, dev)) {
776 q->key |= ROOT;
777 rootmin = num;
778 return(1);
779 }
780 }
781 fprintf(stderr, "Can't find root\n");
782 return(1);
783 }
784 if (equal(keyw, "swap")) {
785 if (n<4)
786 goto badl;
787 for (q=table; q->name; q++) {
788 if (equal(q->name, dev)) {
789 q->key |= SWAP;
790 swapmin = num;
791 return(1);
792 }
793 }
794 fprintf(stderr, "Can't find swap\n");
795 return(1);
796 }
797 if (equal(keyw, "pipe")) {
798 if (n<4)
799 goto badl;
800 for (q=table; q->name; q++) {
801 if (equal(q->name, dev)) {
802 q->key |= PIPE;
803 pipemin = num;
804 return(1);
805 }
806 }
807 fprintf(stderr, "Can't find pipe\n");
808 return(1);
809 }
810 fprintf(stderr, "%s: cannot find\n", keyw);
811 return(1);
812badl:
813 fprintf(stderr, "Bad line: %s", line);
814 return(1);
815}
816
817equal(a, b)
818char *a, *b;
819{
820 return(!strcmp(a, b));
821}