1 /* 2 * Make the uba interrupt file ubglue.s 3 * mkubglue.c 1.3 81/02/26 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 if (dp->d_vec1 != NULL) 25 dump_vec(fp, dp->d_vec1, dp->d_unit); 26 if (dp->d_vec2 != NULL) 27 dump_vec(fp, dp->d_vec2, dp->d_unit); 28 } 29 } 30 fclose(fp); 31 } 32 33 /* 34 * dump_vec 35 * Print an interrupt vector 36 */ 37 38 dump_vec(fp, vector, number) 39 register FILE *fp; 40 char *vector; 41 int number; 42 { 43 char nbuf[80]; 44 register char *v = nbuf; 45 46 sprintf(v, "%s%d", vector, number); 47 fprintf(fp, "\t.globl\t_X%s\n\t.align\t2\n_X%s:\n\tpushr\t$0x3f\n", v, v); 48 if (strncmp(vector, "dzx", 3) == 0) 49 fprintf(fp, "\tmovl\t$%d,r0\n\tjbr\t_dzdma\n\n", number); 50 else 51 { 52 fprintf(fp, "\tpushl\t$%d\n", number); 53 fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n\trei\n\n", vector); 54 } 55 } 56