Commit | Line | Data |
---|---|---|
22d68ad0 | 1 | /* mkubglue.c 1.7 82/10/25 */ |
ba6a61e0 | 2 | |
e1f7f2fb MT |
3 | /* |
4 | * Make the uba interrupt file ubglue.s | |
5 | */ | |
6 | #include <stdio.h> | |
7 | #include "config.h" | |
8 | #include "y.tab.h" | |
9 | ||
10 | ubglue() | |
11 | { | |
22d68ad0 BJ |
12 | register FILE *fp; |
13 | register struct device *dp, *mp; | |
e1f7f2fb | 14 | |
22d68ad0 BJ |
15 | fp = fopen(path("ubglue.s"), "w"); |
16 | if (fp == 0) { | |
17 | perror(path("ubglue.s")); | |
18 | exit(1); | |
19 | } | |
20 | for (dp = dtab; dp != 0; dp = dp->d_next) { | |
21 | mp = dp->d_conn; | |
22 | if (mp != 0 && mp != (struct device *)-1 && | |
23 | !eq(mp->d_name, "mba")) { | |
24 | struct idlst *id, *id2; | |
25 | ||
26 | for (id = dp->d_vec; id; id = id->id_next) { | |
27 | for (id2 = dp->d_vec; id2; id2 = id2->id_next) { | |
28 | if (id2 == id) { | |
29 | dump_vec(fp, id->id, dp->d_unit); | |
30 | break; | |
31 | } | |
32 | if (!strcmp(id->id, id2->id)) | |
33 | break; | |
34 | } | |
35 | } | |
08f9a943 | 36 | } |
e1f7f2fb | 37 | } |
22d68ad0 | 38 | (void) fclose(fp); |
e1f7f2fb MT |
39 | } |
40 | ||
41 | /* | |
22d68ad0 | 42 | * print an interrupt vector |
e1f7f2fb | 43 | */ |
e1f7f2fb | 44 | dump_vec(fp, vector, number) |
22d68ad0 BJ |
45 | register FILE *fp; |
46 | char *vector; | |
47 | int number; | |
e1f7f2fb | 48 | { |
22d68ad0 BJ |
49 | char nbuf[80]; |
50 | register char *v = nbuf; | |
e1f7f2fb | 51 | |
22d68ad0 BJ |
52 | (void) sprintf(v, "%s%d", vector, number); |
53 | fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n", | |
54 | v, v); | |
55 | if (strncmp(vector, "dzx", 3) == 0) | |
56 | fprintf(fp, "\tmovl\t$%d,r0\n\tjmp\t_dzdma\n\n", number); | |
57 | else { | |
58 | fprintf(fp, "\tpushl\t$%d\n", number); | |
59 | fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n\trei\n\n", | |
60 | vector); | |
61 | } | |
e1f7f2fb | 62 | } |