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(path("ubglue.s"), "w"); 15 if (fp == NULL) { 16 perror(path("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 != -1 && !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\trei\n\n", vector); 61 } 62 } 63