PDP11, VAX: Support explicit deregistering of I/O space addresses

This commit is contained in:
Mark Pizzolato 2018-09-10 06:04:50 -07:00
parent ac40e513cb
commit 0051082dc9

View file

@ -381,7 +381,7 @@ for (i = 0; i < dibp->vnum; i++) { /* loop thru vec */
int_vec[ilvl][ibit] = vec; int_vec[ilvl][ibit] = vec;
} }
} }
/* Register I/O space address and check for conflicts */ /* Register(Deregister) I/O space address and check for conflicts */
for (i = 0; i < (int32) dibp->lnt; i = i + 2) { /* create entries */ for (i = 0; i < (int32) dibp->lnt; i = i + 2) { /* create entries */
idx = ((dibp->ba + i) & IOPAGEMASK) >> 1; /* index into disp */ idx = ((dibp->ba + i) & IOPAGEMASK) >> 1; /* index into disp */
if ((iodispR[idx] && dibp->rd && /* conflict? */ if ((iodispR[idx] && dibp->rd && /* conflict? */
@ -411,11 +411,13 @@ for (i = 0; i < (int32) dibp->lnt; i = i + 2) { /* create entries */
"Device %s address conflict with %s at 0%o\n", "Device %s address conflict with %s at 0%o\n",
sim_dname (dptr), cdname, (int)dibp->ba); sim_dname (dptr), cdname, (int)dibp->ba);
} }
if (dibp->rd) /* set rd dispatch */ if ((dibp->rd == NULL) && (dibp->wr == NULL) && (dibp->vnum == 0))
iodispR[idx] = dibp->rd; iodibp[idx] = NULL; /* deregister DIB */
if (dibp->wr) /* set wr dispatch */ else {
iodispW[idx] = dibp->wr; iodispR[idx] = dibp->rd; /* set rd dispatch */
iodibp[idx] = dibp; /* remember DIB */ iodispW[idx] = dibp->wr; /* set wr dispatch */
iodibp[idx] = dibp; /* remember DIB */
}
} }
return SCPE_OK; return SCPE_OK;
} }