From ce56a29cedd4e7efc470a091b8934bc89969f437 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Mon, 4 Nov 2019 23:42:35 -0500 Subject: [PATCH] KA10: Fixed TU to read correctly. --- PDP10/kx10_defs.h | 9 +++++---- PDP10/kx10_rh.c | 16 ++++++++++++---- PDP10/kx10_tu.c | 11 ++--------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/PDP10/kx10_defs.h b/PDP10/kx10_defs.h index c00c7f6..f76979f 100644 --- a/PDP10/kx10_defs.h +++ b/PDP10/kx10_defs.h @@ -526,9 +526,9 @@ struct rh_dev { typedef struct pdp_dib DIB; -void df10_setirq(struct df10 *df) ; -void df10_writecw(struct df10 *df) ; -void df10_finish_op(struct df10 *df, int flags) ; +void df10_setirq(struct df10 *df); +void df10_writecw(struct df10 *df); +void df10_finish_op(struct df10 *df, int flags); void df10_setup(struct df10 *df, uint32 addr); int df10_fetch(struct df10 *df); int df10_read(struct df10 *df); @@ -545,8 +545,9 @@ t_stat rh_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat rh_devio(uint32 dev, t_uint64 *data); t_addr rh_devirq(uint32 dev, t_addr addr); void rh_setattn(struct rh_if *rh, int unit); +void rh_error(struct rh_if *rh); int rh_blkend(struct rh_if *rh); -void rh_setirq(struct rh_if *rh) ; +void rh_setirq(struct rh_if *rh); void rh_finish_op(struct rh_if *rh, int flags); int rh_read(struct rh_if *rh); int rh_write(struct rh_if *rh); diff --git a/PDP10/kx10_rh.c b/PDP10/kx10_rh.c index da0ec3e..c2e5d84 100644 --- a/PDP10/kx10_rh.c +++ b/PDP10/kx10_rh.c @@ -500,6 +500,12 @@ void rh_setattn(struct rh_if *rhc, int unit) set_interrupt(rhc->devnum, rhc->status); } +void rh_error(struct rh_if *rhc) +{ + if (rhc->imode == 2) + rhc->status |= RH20_DR_EXC; +} + /* Decrement block count for RH20, nop for RH10 */ int rh_blkend(struct rh_if *rhc) { @@ -529,12 +535,15 @@ void rh_writecw(struct rh_if *rhc, int nxm) { uint32 chan = (rhc->devnum - 0540); int wc = ((rhc->wcr ^ RH20_WMASK) + 1) & RH20_WMASK; rhc->status |= RH20_CHAN_RDY; + rhc->status &= ~(RH20_PCR_FULL); if (wc != 0 || (rhc->status & RH20_XEND) == 0 || - (rhc->ptcr & BIT10) != 0) { + (rhc->ptcr & BIT10) != 0 || nxm) { uint64 wrd1 = SMASK|(uint64)(rhc->ccw); + if ((rhc->ptcr & BIT10) == 0 && (rhc->status & RH20_DR_EXC) != 0) + return; if (nxm) { - wrd1 |= RH20_NXM_ERR; - rhc->status |= RH20_CHAN_ERR; + wrd1 |= RH20_NXM_ERR; + rhc->status |= RH20_CHAN_ERR; } if (wc != 0) { wrd1 |= RH20_NOT_WC0; @@ -553,7 +562,6 @@ void rh_writecw(struct rh_if *rhc, int nxm) { ((uint64)(rhc->cda) & AMASK); //fprintf(stderr, "RH20 final %012llo %012llo %06o\n\r", M[eb_ptr|chan|1], M[eb_ptr|chan|2], wc); } - rhc->status &= ~(RH20_PCR_FULL); return; } #endif diff --git a/PDP10/kx10_tu.c b/PDP10/kx10_tu.c index 614c610..ac238e2 100644 --- a/PDP10/kx10_tu.c +++ b/PDP10/kx10_tu.c @@ -338,10 +338,6 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) { case 007: /* look ahead */ case 011: /* tape control register */ tu_tcr[ctlr] = data & 0177777 ; - if ((tu_tcr[ctlr] & TC_DENS) == TC_1600) - uptr->STATUS |= DS_PES; - else - uptr->STATUS &= ~DS_PES; break; default: uptr->STATUS |= ER1_ILR; @@ -475,6 +471,8 @@ void tu_error(UNIT * uptr, t_stat r) } if (uptr->CMD & CS_ATA) rh_setattn(rhc, 0); + if (uptr->CMD & (CS_ATA | CS_TM)) + rh_error(rhc); uptr->CMD &= ~(CS_MOTION|CS_PIP|CS1_GO); sim_debug(DEBUG_EXP, dptr, "Setting status %d\n", r); } @@ -749,11 +747,6 @@ t_stat tu_srv(UNIT * uptr) /* Fall Through */ case MTSE_TMK: /* tape mark */ - /* Position just after mark */ - if (GET_FNC(uptr->CMD) == FNC_SPACEB && r == MTSE_TMK) - sim_tape_sprecf(uptr, &reclen); - /* Fall Through */ - case MTSE_EOM: /* end of medium */ if (tu_frame[ctlr] != 0) uptr->STATUS |= ER1_FCE;