|
|
researchv10 Norman
/*
* MASSBUS device address routines
*
* interrupt vectors are all in the nexus code;
* they come for the adapter, not the device
*/
#include "mkconf.h"
/*
* addressing stuff
*/
static char *mbafields[] = {
"mb", "drive", NULL
};
#define a_adp addr[0] /* MBA number */
#define a_drive addr[1] /* drive within MBA */
#define NMBD 8 /* max drives per massbus */
#define NMBA 10 /* enough */
static Dev *mbdev[NMBD][NMBA];
static int mbamax;
static newmbdev(), mbaputtab();
mbasyntax(dp, ap, n)
register Dev *dp;
char **ap;
int n;
{
char *p;
if ((p = keyread(dp->addr, ap, n, mbafields)) != NULL) {
fprint(STDERR, "%s %d: bad field %s\n", dp->mdev->name, dp->id, p);
errs++;
return (1);
}
if (dp->a_drive < 0 || dp->a_drive >= NMBD) {
fprint(STDERR, "%s %d: only %d drives per massbus\n", dp->mdev->name, dp->id, NMBD);
errs++;
return (1);
}
return (0);
}
mbafixup(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;
if (ep == NULL) {
fprint(2, "%s %d: orphan massbus device\n", dp->mdev->name, dp->id);
errs++;
return;
}
dp->parent = ep;
newmbdev(dp);
}
mbaputaddr(fd, dp)
int fd;
register Dev *dp;
{
register int count;
register Mdev *mp;
mbaputtab(fd);
mp = dp->mdev;
count = 0;
fprint(fd, "struct mbaddr %saddr[] = {\n", mp->tag);
for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) {
while (count++ < dp->id)
fprint(fd, "\t{-1, -1},\n");
fprint(fd, "\t{%ld, %ld},\n", dp->a_drive, dp->a_adp);
}
count *= mp->rept;
fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count);
putstrs(fd, mp, count);
}
static
newmbdev(dp)
register Dev *dp;
{
register Dev *ep;
ep = dp->parent;
if (ep->id > mbamax)
mbamax = ep->id;
if (ep->id >= NMBA) {
fprint(STDERR, "%s %d: too many mbas, max %d\n", ep->mdev->tag, ep->id, NMBA);
errs++;
return;
}
mbdev[dp->a_drive][ep->id] = dp;
}
static
mbaputtab(fd)
int fd;
{
static int done;
register int i, j;
register Dev *dp;
if (done++)
return;
for (i = 0; i <= mbamax; i++)
for (j = 0; j < NMBD; j++)
if ((dp = mbdev[j][i]) != NULL)
fprint(fd, "extern %s0int();\n", dp->mdev->tag);
fprint(fd, "char mbaid[][%d] = {\n", NMBD);
for (i = 0; i <= mbamax; i++) {
for (j = 0; j < NMBD; j++) {
if ((dp = mbdev[j][i]) == NULL)
fprint(fd, " 0%o,", (i<<3)|j); /* stray track */
else
fprint(fd, " %d,", dp->id);
}
fprint(fd, "\n");
}
fprint(fd, "};\nint mbastray();\nint (*mbavec[][%d])() = {\n", NMBD);
for (i = 0; i <= mbamax; i++) {
for (j = 0; j < NMBD; j++) {
if ((dp = mbdev[j][i]) == NULL)
fprint(fd, " mbastray,");
else
fprint(fd, " %s0int,", dp->mdev->tag);
}
fprint(fd, "\n");
}
fprint(fd, "};\n");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.