PDP11, VAX: Fix DELQA device identity sensing (DEQNA & LockMode)

This commit is contained in:
Mark Pizzolato 2016-04-05 05:17:51 -07:00
parent ac2e3d9c62
commit 35180aabb0

View file

@ -2116,8 +2116,9 @@ void xq_sw_reset(CTLR* xq)
sim_debug(DBG_TRC, xq->dev, "xq_sw_reset()\n"); sim_debug(DBG_TRC, xq->dev, "xq_sw_reset()\n");
++xq->var->stats.reset; ++xq->var->stats.reset;
/* Return DELQA-T to DELQA Normal mode */ /* Return DELQA-T in DELQA-T mode to DELQA Normal mode */
if (xq->var->type == XQ_T_DELQA_PLUS) { if ((xq->var->type == XQ_T_DELQA_PLUS) && (xq->var->mode == XQ_T_DELQA_PLUS)){
xq->var->var |= XQ_VEC_MS;
xq->var->mode = XQ_T_DELQA; xq->var->mode = XQ_T_DELQA;
xq->var->iba = xq->var->srr = 0; xq->var->iba = xq->var->srr = 0;
} }
@ -2165,7 +2166,7 @@ void xq_sw_reset(CTLR* xq)
t_stat xq_wr_var(CTLR* xq, int32 data) t_stat xq_wr_var(CTLR* xq, int32 data)
{ {
uint16 save_var = xq->var->var; uint16 save_var = xq->var->var;
sim_debug(DBG_REG, xq->dev, "xq_wr_var(data= 0x%08X)\n", data); sim_debug(DBG_REG, xq->dev, "xq_wr_var(data=0x%08X)\n", data);
switch (xq->var->type) { switch (xq->var->type) {
case XQ_T_DEQNA: case XQ_T_DEQNA:
@ -2176,7 +2177,7 @@ t_stat xq_wr_var(CTLR* xq, int32 data)
if (xq->var->lockmode) if (xq->var->lockmode)
xq->var->var = data & (XQ_VEC_IV | XQ_VEC_ID); xq->var->var = data & (XQ_VEC_IV | XQ_VEC_ID);
else else
xq->var->var = (data & ~XQ_VEC_RO) | (XQ_VEC_ID & XQ_VEC_RW); xq->var->var = (data & XQ_VEC_RW);
if ((save_var ^ xq->var->var) & XQ_VEC_MS) { /* DEQNA-Lock mode changing? */ if ((save_var ^ xq->var->var) & XQ_VEC_MS) { /* DEQNA-Lock mode changing? */
if (~xq->var->var & XQ_VEC_MS) { if (~xq->var->var & XQ_VEC_MS) {
@ -2197,15 +2198,13 @@ t_stat xq_wr_var(CTLR* xq, int32 data)
xq->var->var |= XQ_VEC_S1; /* Indicate No Network Connection */ xq->var->var |= XQ_VEC_S1; /* Indicate No Network Connection */
else else
xq->var->var &= ~XQ_VEC_ST; /* Set success Status */ xq->var->var &= ~XQ_VEC_ST; /* Set success Status */
sim_debug(DBG_REG, xq->dev, "xq_wr_var(DELQA self test performed. Result: %d\n", xq->var->var & XQ_VEC_ST);
} }
break; break;
} }
/* set vector of SIMH device */ /* set vector of SIMH device */
if (data & XQ_VEC_IV) xq->dib->vec = (data & XQ_VEC_IV);
xq->dib->vec = (data & XQ_VEC_IV);
else
xq->dib->vec = 0;
sim_debug_bits(DBG_VAR, xq->dev, xq_var_bits, save_var, xq->var->var, 1); sim_debug_bits(DBG_VAR, xq->dev, xq_var_bits, save_var, xq->var->var, 1);
@ -2302,6 +2301,11 @@ t_stat xq_wr_csr(CTLR* xq, int32 data)
xq_stop_receiver(xq); xq_stop_receiver(xq);
} }
if (xq->var->csr & XQ_CSR_EL & ~data)
sim_debug(DBG_REG, xq->dev, "xq_wr_csr(data=0x%08X) - External Loopback %s\n", data, (data & XQ_CSR_EL) ? "enabled" : "disabled");
if (xq->var->csr & XQ_CSR_IL & ~data)
sim_debug(DBG_REG, xq->dev, "xq_wr_csr(data=0x%08X) - Internal Loopback %s\n", data, (data & XQ_CSR_IL) ? "disabled" : "enabled");
/* update CSR bits */ /* update CSR bits */
xq_csr_set_clr (xq, set_bits, clr_bits); xq_csr_set_clr (xq, set_bits, clr_bits);
@ -2317,11 +2321,6 @@ void xq_start_receiver(CTLR* xq)
if (!xq->var->etherface) if (!xq->var->etherface)
return; return;
/* clear read queue */
ethq_clear(&xq->var->ReadQ);
/* start the read service timer or enable asynch reading as appropriate */ /* start the read service timer or enable asynch reading as appropriate */
if (xq->var->must_poll) { if (xq->var->must_poll) {
if (sim_idle_enab) if (sim_idle_enab)
@ -2545,7 +2544,7 @@ t_stat xq_reset(DEVICE* dptr)
break; break;
case XQ_T_DELQA: case XQ_T_DELQA:
case XQ_T_DELQA_PLUS: case XQ_T_DELQA_PLUS:
xq->var->var = (xq->var->lockmode ? XQ_VEC_MS : 0) | ((xq->var->sanity.enabled & XQ_SAN_HW_SW) ? XQ_VEC_OS : 0); xq->var->var = (xq->var->lockmode ? 0 : XQ_VEC_MS) | ((xq->var->sanity.enabled & XQ_SAN_HW_SW) ? XQ_VEC_OS : 0);
xq->var->mode = (xq->var->lockmode ? XQ_T_DEQNA : XQ_T_DELQA); xq->var->mode = (xq->var->lockmode ? XQ_T_DEQNA : XQ_T_DELQA);
break; break;
} }
@ -2754,7 +2753,7 @@ t_stat xq_tmrsvc(UNIT* uptr)
sim_debug(DBG_TRC, xq->dev, "xq_tmrsvc(DELQA-PLUS Host Inactivity Expired\n"); sim_debug(DBG_TRC, xq->dev, "xq_tmrsvc(DELQA-PLUS Host Inactivity Expired\n");
xq->var->mode = XQ_T_DELQA; xq->var->mode = XQ_T_DELQA;
xq->var->iba = xq->var->srr = 0; xq->var->iba = xq->var->srr = 0;
xq->var->var = (xq->var->lockmode ? 0 : XQ_VEC_MS) | ((xq->var->sanity.enabled & XQ_SAN_HW_SW) ? XQ_VEC_OS : 0); xq->var->var = XQ_VEC_MS | ((xq->var->sanity.enabled & XQ_SAN_HW_SW) ? XQ_VEC_OS : 0);
} }
} }
} }