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:
parent
8876755006
commit
edb8bbeceb
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user