|
|
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.