|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)mkubglue.c 5.1 (Berkeley) 5/8/85";
9: #endif not lint
10:
11: /*
12: * Make the uba interrupt file ubglue.s
13: */
14: #include <stdio.h>
15: #include "config.h"
16: #include "y.tab.h"
17:
18: ubglue()
19: {
20: register FILE *fp;
21: register struct device *dp, *mp;
22:
23: fp = fopen(path("ubglue.s"), "w");
24: if (fp == 0) {
25: perror(path("ubglue.s"));
26: exit(1);
27: }
28: for (dp = dtab; dp != 0; dp = dp->d_next) {
29: mp = dp->d_conn;
30: if (mp != 0 && mp != (struct device *)-1 &&
31: !eq(mp->d_name, "mba")) {
32: struct idlst *id, *id2;
33:
34: for (id = dp->d_vec; id; id = id->id_next) {
35: for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
36: if (id2 == id) {
37: dump_vec(fp, id->id, dp->d_unit);
38: break;
39: }
40: if (!strcmp(id->id, id2->id))
41: break;
42: }
43: }
44: }
45: }
46: dump_std(fp);
47: for (dp = dtab; dp != 0; dp = dp->d_next) {
48: mp = dp->d_conn;
49: if (mp != 0 && mp != (struct device *)-1 &&
50: !eq(mp->d_name, "mba")) {
51: struct idlst *id, *id2;
52:
53: for (id = dp->d_vec; id; id = id->id_next) {
54: for (id2 = dp->d_vec; id2; id2 = id2->id_next) {
55: if (id2 == id) {
56: dump_intname(fp, id->id,
57: dp->d_unit);
58: break;
59: }
60: if (!strcmp(id->id, id2->id))
61: break;
62: }
63: }
64: }
65: }
66: dump_ctrs(fp);
67: (void) fclose(fp);
68: }
69:
70: static int cntcnt = 0; /* number of interrupt counters allocated */
71:
72: /*
73: * print an interrupt vector
74: */
75: dump_vec(fp, vector, number)
76: register FILE *fp;
77: char *vector;
78: int number;
79: {
80: char nbuf[80];
81: register char *v = nbuf;
82:
83: (void) sprintf(v, "%s%d", vector, number);
84: fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n",
85: v, v);
86: fprintf(fp, "\tincl\t_fltintrcnt+(4*%d)\n", cntcnt++);
87: if (strncmp(vector, "dzx", 3) == 0)
88: fprintf(fp, "\tmovl\t$%d,r0\n\tjmp\tdzdma\n\n", number);
89: else {
90: if (strncmp(vector, "uur", 3) == 0) {
91: fprintf(fp, "#ifdef UUDMA\n");
92: fprintf(fp, "\tmovl\t$%d,r0\n\tjsb\tuudma\n", number);
93: fprintf(fp, "#endif\n");
94: }
95: fprintf(fp, "\tpushl\t$%d\n", number);
96: fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n", vector);
97: fprintf(fp, "\tincl\t_cnt+V_INTR\n\trei\n\n");
98: }
99: }
100:
101: /*
102: * Start the interrupt name table with the names
103: * of the standard vectors not on the unibus.
104: * The number and order of these names should correspond
105: * with the definitions in scb.s.
106: */
107: dump_std(fp)
108: register FILE *fp;
109: {
110: fprintf(fp, "\n\t.globl\t_intrnames\n");
111: fprintf(fp, "\n\t.globl\t_eintrnames\n");
112: fprintf(fp, "\t.data\n");
113: fprintf(fp, "_intrnames:\n");
114: fprintf(fp, "\t.asciz\t\"clock\"\n");
115: fprintf(fp, "\t.asciz\t\"cnr\"\n");
116: fprintf(fp, "\t.asciz\t\"cnx\"\n");
117: fprintf(fp, "\t.asciz\t\"tur\"\n");
118: fprintf(fp, "\t.asciz\t\"tux\"\n");
119: fprintf(fp, "\t.asciz\t\"mba0\"\n");
120: fprintf(fp, "\t.asciz\t\"mba1\"\n");
121: fprintf(fp, "\t.asciz\t\"mba2\"\n");
122: fprintf(fp, "\t.asciz\t\"mba3\"\n");
123: fprintf(fp, "\t.asciz\t\"uba0\"\n");
124: fprintf(fp, "\t.asciz\t\"uba1\"\n");
125: fprintf(fp, "\t.asciz\t\"uba2\"\n");
126: fprintf(fp, "\t.asciz\t\"uba3\"\n");
127: #define I_FIXED 13 /* number of names above */
128: }
129:
130: dump_intname(fp, vector, number)
131: register FILE *fp;
132: char *vector;
133: int number;
134: {
135: register char *cp = vector;
136:
137: fprintf(fp, "\t.asciz\t\"");
138: /*
139: * Skip any "int" or "intr" in the name.
140: */
141: while (*cp)
142: if (cp[0] == 'i' && cp[1] == 'n' && cp[2] == 't') {
143: cp += 3;
144: if (*cp == 'r')
145: cp++;
146: } else {
147: putc(*cp, fp);
148: cp++;
149: }
150: fprintf(fp, "%d\"\n", number);
151: }
152:
153: dump_ctrs(fp)
154: register FILE *fp;
155: {
156: fprintf(fp, "_eintrnames:\n");
157: fprintf(fp, "\n\t.globl\t_intrcnt\n");
158: fprintf(fp, "\n\t.globl\t_eintrcnt\n");
159: fprintf(fp, "_intrcnt:\n", I_FIXED);
160: fprintf(fp, "\t.space\t4 * %d\n", I_FIXED);
161: fprintf(fp, "_fltintrcnt:\n", cntcnt);
162: fprintf(fp, "\t.space\t4 * %d\n", cntcnt);
163: fprintf(fp, "_eintrcnt:\n\n");
164: fprintf(fp, "\t.text\n");
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.