|
|
1.1 ! root 1: /* ! 2: * Make the uba interrupt file ubglue.s ! 3: * mkubglue.c 1.4 81/05/22 ! 4: */ ! 5: #include <stdio.h> ! 6: #include "config.h" ! 7: #include "y.tab.h" ! 8: ! 9: ubglue() ! 10: { ! 11: register FILE *fp; ! 12: register struct device *dp, *mp; ! 13: ! 14: fp = fopen(LOCAL("ubglue.s"), "w"); ! 15: if (fp == NULL) { ! 16: perror(LOCAL("ubglue.s")); ! 17: exit(1); ! 18: } ! 19: for (dp = dtab ; dp != NULL; dp = dp->d_next) ! 20: { ! 21: mp = dp->d_conn; ! 22: if (mp != NULL && mp != TO_NEXUS && !eq(mp->d_name, "mba")) ! 23: { ! 24: struct idlst *id, *id2; ! 25: for (id = dp->d_vec; id; id = id->id_next) { ! 26: for (id2 = dp->d_vec; id2; id2 = id2->id_next) { ! 27: if (id2 == id) { ! 28: dump_vec(fp, id->id, dp->d_unit); ! 29: break; ! 30: } ! 31: if (!strcmp(id->id, id2->id)) ! 32: break; ! 33: } ! 34: } ! 35: } ! 36: } ! 37: fclose(fp); ! 38: } ! 39: ! 40: /* ! 41: * dump_vec ! 42: * Print an interrupt vector ! 43: */ ! 44: ! 45: dump_vec(fp, vector, number) ! 46: register FILE *fp; ! 47: char *vector; ! 48: int number; ! 49: { ! 50: char nbuf[80]; ! 51: register char *v = nbuf; ! 52: ! 53: sprintf(v, "%s%d", vector, number); ! 54: fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n", v, v); ! 55: if (strncmp(vector, "dzx", 3) == 0) ! 56: fprintf(fp, "\tmovl\t$%d,r0\n\tjbr\t_dzdma\n\n", number); ! 57: else ! 58: { ! 59: fprintf(fp, "\tpushl\t$%d\n", number); ! 60: fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n", vector); ! 61: /* meter unibus interrupts on 750 and 730 */ ! 62: fprintf(fp, "#if defined(VAX750) || defined(VAXZZ)\n"); ! 63: fprintf(fp, "\tincl\t_cnt+V_INTR\n"); ! 64: fprintf(fp, "#endif\n"); ! 65: fprintf(fp, "\trei\n\n"); ! 66: } ! 67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.