|
|
1.1 ! root 1: /* ! 2: * routines for unibus devices ! 3: */ ! 4: ! 5: #include "mkconf.h" ! 6: ! 7: /* ! 8: * address parts ! 9: */ ! 10: ! 11: static char *ubafields[] = { ! 12: "ub", "reg", "vec", NULL ! 13: }; ! 14: ! 15: #define a_adp addr[0] /* adapter number */ ! 16: #define a_addr addr[1] /* UNIBUS address */ ! 17: #define a_vec addr[2] /* UNIBUS vector */ ! 18: ! 19: #define VFMT "X%s%d%d" ! 20: ! 21: /* ! 22: * syntax checks ! 23: */ ! 24: ! 25: int ! 26: ubasyntax(dp, ap, n) ! 27: register Dev *dp; ! 28: char **ap; ! 29: int n; ! 30: { ! 31: char *p; ! 32: ! 33: dp->a_vec = 0; ! 34: if ((p = keyread(dp->addr, ap, n, ubafields)) != NULL) { ! 35: fprint(STDERR, "%s %d: bad field %s\n", dp->mdev->name, dp->id, p); ! 36: errs++; ! 37: return (1); ! 38: } ! 39: if (dp->a_addr == 0) { ! 40: fprint(STDERR, "%s %d: no address\n", dp->mdev->name, dp->id); ! 41: return (1); ! 42: } ! 43: dp->a_addr |= 0760000; /* 16->18 bit language */ ! 44: return (0); ! 45: } ! 46: ! 47: /* ! 48: * intermediate fixups: ! 49: * find the parent ! 50: * store the vector ! 51: */ ! 52: ! 53: int ! 54: ubafixup(dp) ! 55: register Dev *dp; ! 56: { ! 57: register int vec; ! 58: register int i; ! 59: char vname[30]; ! 60: ! 61: ubaparent(dp); ! 62: if (dp->parent == NULL) { ! 63: fprint(STDERR, "%s %d: no unibus adapter %ld\n", ! 64: dp->mdev->name, dp->id, dp->a_adp); ! 65: errs++; ! 66: return; ! 67: } ! 68: if (dp->a_vec) { ! 69: vec = dp->parent->vecoff + dp->a_vec; ! 70: for (i = 0; i < dp->mdev->nvec; i++, vec += 4) { ! 71: sprint(vname, VFMT, dp->mdev->tag, dp->id, i); ! 72: newvec(vec, SINTR, vname); ! 73: } ! 74: } ! 75: } ! 76: ! 77: ubaparent(dp) ! 78: register Dev *dp; ! 79: { ! 80: register Dev *ep; ! 81: ! 82: for (ep = dlist; ep; ep = ep->next) ! 83: if (ep->mdev->adptype == dp->mdev->atype ! 84: && ep->id == dp->a_adp) ! 85: break; ! 86: dp->parent = ep; ! 87: } ! 88: ! 89: ubaputaddr(fd, dp) ! 90: register Dev *dp; ! 91: { ! 92: register int count; ! 93: register Mdev *mp; ! 94: ! 95: mp = dp->mdev; ! 96: count = 0; ! 97: fprint(fd, "struct ubaddr %saddr[] = {\n", mp->tag); ! 98: for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) { ! 99: while (count++ < dp->id) ! 100: fprint(fd, "\t{-1, -1, -1},\n"); ! 101: fprint(fd, "\t{0%lo, 0%lo, %ld},\n", ! 102: dp->a_addr, dp->a_vec, dp->a_adp); ! 103: } ! 104: count *= mp->rept; ! 105: fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count); ! 106: putstrs(fd, mp, count); ! 107: ! 108: } ! 109: ! 110: ubaputvec(fd, dp) ! 111: register Dev *dp; ! 112: { ! 113: register int i; ! 114: char vname[30]; ! 115: ! 116: if (dp->a_vec == 0) ! 117: return; ! 118: for (i = 0; i < dp->mdev->nvec; i++) { ! 119: sprint(vname, VFMT, dp->mdev->tag, dp->id, i); ! 120: stdputvec(fd, dp, vname, i); ! 121: } ! 122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.