From edb8bbeceb75baf519be7bf6c97f6fc22a7af429 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Mon, 16 Mar 2020 19:43:45 -0400 Subject: [PATCH] KA10: Fixed some bugs in disabled devices. --- PDP10/kx10_rh.c | 17 ++++------------- PDP10/kx10_rp.c | 4 ++-- PDP10/kx10_tu.c | 15 ++++++--------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/PDP10/kx10_rh.c b/PDP10/kx10_rh.c index 5751222..c2e5d72 100644 --- a/PDP10/kx10_rh.c +++ b/PDP10/kx10_rh.c @@ -243,10 +243,8 @@ t_stat rh_devio(uint32 dev, uint64 *data) { } if (rhc->reg < 040) { int parity; - if (rhc->dev_read(dptr, rhc, rhc->reg, &drdat)) { - rhc->rae |= 1 << rhc->drive; + if (rhc->dev_read(dptr, rhc, rhc->reg, &drdat)) rhc->status |= RH20_DR_RESP; - } *data = (uint64)(drdat & 0177777); parity = (int)((*data >> 8) ^ *data); parity = (parity >> 4) ^ parity; @@ -290,10 +288,8 @@ t_stat rh_devio(uint32 dev, uint64 *data) { set_interrupt(rhc->devnum, rhc->status); return SCPE_OK; } - if (rhc->dev_write(dptr, rhc, rhc->reg & 037, (int)(*data & 0777777))) { - rhc->rae |= 1 << rhc->drive; + if (rhc->dev_write(dptr, rhc, rhc->reg & 037, (int)(*data & 0777777))) rhc->status |= RH20_DR_RESP; - } if (((rhc->status & IADR_ATTN) != 0 && rhc->attn != 0) || (rhc->status & PI_ENABLE)) set_interrupt(rhc->devnum, rhc->status); @@ -390,10 +386,8 @@ t_stat rh_devio(uint32 dev, uint64 *data) { return SCPE_OK; } if (rhc->reg == 040) { - if (rhc->dev_read(dptr, rhc, 0, &drdat)) { - rhc->rae |= (1 << rhc->drive); + if (rhc->dev_read(dptr, rhc, 0, &drdat)) rhc->status |= CR_DRE; - } *data = (uint64)(drdat & 077); *data |= ((uint64)(rhc->cia)) << 6; *data |= ((uint64)(rhc->xfer_drive)) << 18; @@ -459,7 +453,6 @@ t_stat rh_devio(uint32 dev, uint64 *data) { rh_setup(rhc, (uint32)(*data >> 6)); rhc->xfer_drive = (int)(*data >> 18) & 07; if (rhc->dev_write(dptr, rhc, 0, (uint32)(*data & 077))) { - rhc->rae |= 1 << rhc->drive; rhc->status |= CR_DRE; } sim_debug(DEBUG_DATAIO, dptr, @@ -482,10 +475,8 @@ t_stat rh_devio(uint32 dev, uint64 *data) { if (rhc->rae & (1 << rhc->drive)) { return SCPE_OK; } - if (rhc->dev_write(dptr, rhc, rhc->reg & 037, (uint32)(*data & 0777777))) { - rhc->rae |= 1 << rhc->drive; + if (rhc->dev_write(dptr, rhc, rhc->reg & 037, (uint32)(*data & 0777777))) rhc->status |= CR_DRE; - } } } clr_interrupt(dev); diff --git a/PDP10/kx10_rp.c b/PDP10/kx10_rp.c index 2232419..a7040d9 100644 --- a/PDP10/kx10_rp.c +++ b/PDP10/kx10_rp.c @@ -497,7 +497,7 @@ rp_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) { UNIT *uptr = &dptr->units[unit]; int dtype = GET_DTYPE(uptr->flags); - if ((uptr->flags & UNIT_DIS) != 0) + if ((uptr->flags & UNIT_DIS) != 0 && reg != 04) return 1; if ((uptr->CMD & CS1_GO) && reg != 04) { uptr->CMD |= (ER1_RMR << 16)|DS_ERR; @@ -661,7 +661,7 @@ rp_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) { uint32 temp = 0; int i; - if ((uptr->flags & UNIT_DIS) != 0) + if ((uptr->flags & UNIT_DIS) != 0 && reg != 04) return 1; if ((uptr->flags & UNIT_ATT) == 0 && reg != 04) { /* not attached? */ *data = 0; diff --git a/PDP10/kx10_tu.c b/PDP10/kx10_tu.c index 3886bad..34370f3 100644 --- a/PDP10/kx10_tu.c +++ b/PDP10/kx10_tu.c @@ -254,7 +254,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) { UNIT *uptr = &dptr->units[unit]; int i; - if (rhc->drive != 0) /* Only one unit at 0 */ + if (rhc->drive != 0 && reg != 04) /* Only one unit at 0 */ return 1; if (uptr->CMD & CS1_GO) { @@ -334,11 +334,9 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) { break; case 004: /* atten summary */ rhc->attn = 0; - for (i = 0; i < 8; i++) { - if (data & (1<units[i].CMD &= ~CS_ATA; - if (dptr->units[i].CMD & CS_ATA) - rhc->attn = 1; } break; case 005: /* frame count */ @@ -367,7 +365,7 @@ tu_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) { uint32 temp = 0; int i; - if (rhc->drive != 0) /* Only one unit at 0 */ + if (rhc->drive != 0 && reg != 4) /* Only one unit at 0 */ return 1; switch(reg) { @@ -408,9 +406,8 @@ tu_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) { break; case 004: /* atten summary */ for (i = 0; i < 8; i++) { - if (dptr->units[i].CMD & CS_ATA) { - temp |= 1 << i; - } + if (dptr->units[i].CMD & CS_ATA) + temp |= 1; } break; case 005: /* frame count */