1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-13 23:35:30 +00:00

KA10: Fixed some bugs in disabled devices.

This commit is contained in:
Richard Cornwell 2020-03-16 19:43:45 -04:00
parent 8876755006
commit edb8bbeceb
3 changed files with 12 additions and 24 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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<<i))
if (data & 1) {
for (i = 0; i < 8; i++)
dptr->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 */