V10/sys/mkconf/writlow.c

Compare this file to the similar file:
Show the results in this format:

/*
 * write system control block
 */

#include <libc.h>
#include "mkconf.h"

#define	SVSIZE	4	/* size of an scb vector */

writlow(f)
char *f;
{
	int fd;
	register Scb *sp;
	register int ssize;
	register int i;
	register Dev *dp;

	if ((fd = creat(f, 0666)) < 0) {
		perror(f);
		exit(1);
	}
	/*
	 * system control block
	 */
	fprint(fd, "\t.text\n\t.align 9\n\t.set INTSTACK,1\n");
	fprint(fd, "\t.globl\tscb\nscb:\n");
	for (ssize = 0, sp = llist; sp; ssize = sp->offset+SVSIZE, sp = sp->next) {
		for (; ssize < sp->offset; ssize += SVSIZE)
			fprint(fd, "\t.long straycatch+0x%x+INTSTACK\n", ssize);
		fprint(fd, "\t.long %s%s\n", sp->name, sp->type == SINTR ? "+INTSTACK" : "");
	}
	while ((ssize & 0x1fc) != 0) {
		fprint(fd, "\t.long straycatch+0x%x+INTSTACK\n", ssize);
		ssize += SVSIZE;
	}
	/*
	 * stray catching stuff
	 */
	fprint(fd, "\t.globl\tstraycatch\nstraycatch:\n");
	for (i = 0; i < ssize; i += SVSIZE)
		fprint(fd, "\t.align 2; bsbw stray\n");
	/*
	 * trampoline, because assembler can't cope with global bsbw
	 */
	fprint(fd, "stray:\tjmp Xstray\n");
	/*
	 * interface routines
	 */
	for (dp = dlist; dp; dp = dp->next)
		(*acode[dp->mdev->atype].putvec)(fd, dp);
	close(fd);
}

stdputvec(fd, dp, name, ix)
int fd;
Dev *dp;
char *name;
int ix;
{
	Mdev *mp;

	mp = dp->mdev;
	if (mp->flags & FRAWVEC)
		return;
	fprint(fd, "\t.align 2\n.globl _%s%dint\n%s:\n", mp->tag, ix, name);
	fprint(fd, "\tpushr\t$0x3f\n");
	if (dp->id == 0)
		fprint(fd, "\tclrl\t-(sp)\n");
	else
		fprint(fd, "\tpushl\t$%d\n", dp->id);
	fprint(fd, "\tcalls\t$1,_%s%dint\n", mp->tag, ix);
	fprint(fd, "\tpopr\t$0x3f\n\trei\n");
}