/* * routines for unibus devices */ #include "mkconf.h" /* * address parts */ static char *ubafields[] = { "ub", "reg", "vec", NULL }; #define a_adp addr[0] /* adapter number */ #define a_addr addr[1] /* UNIBUS address */ #define a_vec addr[2] /* UNIBUS vector */ #define VFMT "X%s%d%d" /* * syntax checks */ int ubasyntax(dp, ap, n) register Dev *dp; char **ap; int n; { char *p; dp->a_vec = 0; if ((p = keyread(dp->addr, ap, n, ubafields)) != NULL) { fprint(STDERR, "%s %d: bad field %s\n", dp->mdev->name, dp->id, p); errs++; return (1); } if (dp->a_addr == 0) { fprint(STDERR, "%s %d: no address\n", dp->mdev->name, dp->id); return (1); } dp->a_addr |= 0760000; /* 16->18 bit language */ return (0); } /* * intermediate fixups: * find the parent * store the vector */ int ubafixup(dp) register Dev *dp; { register int vec; register int i; char vname[30]; ubaparent(dp); if (dp->parent == NULL) { fprint(STDERR, "%s %d: no unibus adapter %ld\n", dp->mdev->name, dp->id, dp->a_adp); errs++; return; } if (dp->a_vec) { vec = dp->parent->vecoff + dp->a_vec; for (i = 0; i < dp->mdev->nvec; i++, vec += 4) { sprint(vname, VFMT, dp->mdev->tag, dp->id, i); newvec(vec, SINTR, vname); } } } ubaparent(dp) register Dev *dp; { register Dev *ep; for (ep = dlist; ep; ep = ep->next) if (ep->mdev->adptype == dp->mdev->atype && ep->id == dp->a_adp) break; dp->parent = ep; } ubaputaddr(fd, dp) register Dev *dp; { register int count; register Mdev *mp; mp = dp->mdev; count = 0; fprint(fd, "struct ubaddr %saddr[] = {\n", mp->tag); for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) { while (count++ < dp->id) fprint(fd, "\t{-1, -1, -1},\n"); fprint(fd, "\t{0%lo, 0%lo, %ld},\n", dp->a_addr, dp->a_vec, dp->a_adp); } count *= mp->rept; fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count); putstrs(fd, mp, count); } ubaputvec(fd, dp) register Dev *dp; { register int i; char vname[30]; if (dp->a_vec == 0) return; for (i = 0; i < dp->mdev->nvec; i++) { sprint(vname, VFMT, dp->mdev->tag, dp->id, i); stdputvec(fd, dp, vname, i); } }