|
|
researchv10 Norman
/*
* 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");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.