From 21d524eda0c32bf7f295e256884991ee294cc784 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Fri, 23 Apr 2021 21:46:07 -0400 Subject: [PATCH] KA10: Clean up support for KS10. Tape still not working. --- PDP10/kx10_rh.c | 14 ++++++++++---- PDP10/kx10_tu.c | 14 +++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/PDP10/kx10_rh.c b/PDP10/kx10_rh.c index 6678942..0b045e3 100644 --- a/PDP10/kx10_rh.c +++ b/PDP10/kx10_rh.c @@ -228,8 +228,14 @@ uba_rh_write(DEVICE *dptr, t_addr addr, uint16 data, int32 access) { switch(addr) { case 000: /* CS1 */ - if (access == BYTE && addr & 1) - break; + if (access == BYTE) { + if (addr & 1) { + rhc->dev_read(dptr, rhc, 0, &temp); + data = data | (rhc->cs1 & 0377) | (temp & 076); + } else { + data = ((rhc->cda & 0600000) >> 8) | data; + } + } rhc->cs1 &= ~(CS1_IE); rhc->cs1 |= data & (CS1_IE); rhc->cda = ((data << 8) & 0600000) | (rhc->cda & 0177777); @@ -302,8 +308,8 @@ uba_rh_write(DEVICE *dptr, t_addr addr, uint16 data, int32 access) { rhc->cs2 |= CS2_NED; r = 0; } - sim_debug(DEBUG_DETAIL, dptr, "RH%o write %06o %06o\n", rhc->drive, - addr, data); + sim_debug(DEBUG_DETAIL, dptr, "RH%o write %06o %06o %o\n", rhc->drive, + addr, data, access); return r; } diff --git a/PDP10/kx10_tu.c b/PDP10/kx10_tu.c index 2d2e7c2..5a58386 100644 --- a/PDP10/kx10_tu.c +++ b/PDP10/kx10_tu.c @@ -281,7 +281,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) { if (rhc->drive != 0 && reg != 04) /* Only one unit at 0 */ return -1; - if (uptr->CMD & CS1_GO) { + if ((uptr->CMD & CS1_GO) != 0 || (uptr->STATUS & DS_PIP) != 0) { regs[TUER1] |= ER1_RMR; return 0; } @@ -365,6 +365,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) { regs[TUER1] |= ER1_ILF; uptr->STATUS = DS_ATA; rhc->attn = 1; + rh_setattn(rhc, 0); } sim_debug(DEBUG_DETAIL, dptr, "%s%o AStatus=%06o\n", dptr->name, unit, uptr->CMD); @@ -426,8 +427,6 @@ tu_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) { temp = uptr->CMD & 077; temp |= CS1_DVA; #if KS -// if ((regs[TUER1] & ER1_RMR) != 0) - // temp |= CS1_TRE; if (rhc->attn || temp & CS1_TRE) temp |= CS1_SC; #endif @@ -582,14 +581,13 @@ t_stat tu_srv(UNIT * uptr) case FNC_REWIND: sim_debug(DEBUG_DETAIL, dptr, "%s%o rewind\n", dptr->name, unit); - if (uptr->CMD & CS1_GO) { + if (uptr->STATUS & CS1_GO) { sim_activate(uptr,40000); uptr->CMD &= ~(CS1_GO); } else { - uptr->STATUS &= ~(DS_PIP); + sim_debug(DEBUG_DETAIL, dptr, "%s%o rewind done\n", dptr->name, unit); uptr->STATUS |= DS_SSC|DS_ATA; - rh_setattn(rhc, 0); - (void)sim_tape_rewind(uptr); + tu_error(uptr, sim_tape_rewind(uptr)); } return SCPE_OK; @@ -789,6 +787,7 @@ t_stat tu_srv(UNIT * uptr) case FNC_ERASE: uptr->STATUS &= ~DS_PIP; uptr->STATUS |= DS_ATA; + sim_tape_sprecf(uptr, &reclen); if ((uptr->flags & MTUF_WLK) != 0) { tu_error(uptr, MTSE_WRP); } else { @@ -860,6 +859,7 @@ tu_reset(DEVICE * dptr) uint16 *regs = &rhc->regs[0]; rh_reset(dptr, &tu_rh[0]); + regs[TUER1] = 0; regs[TUTC] = TC_1600; return SCPE_OK; }