⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkconf.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#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	0200char	*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));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -