From 411e3a3fe5afde6a3fb2cd7b884d02707f9ab9ed Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Wed, 28 Feb 2018 10:15:25 -0500 Subject: [PATCH] KA10: Fixed issues with TM10B controller. --- PDP10/ka10_defs.h | 1 + PDP10/ka10_df.c | 9 +++++++++ PDP10/ka10_mt.c | 19 ++++++++++--------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/PDP10/ka10_defs.h b/PDP10/ka10_defs.h index 994c1b8..e4fe774 100644 --- a/PDP10/ka10_defs.h +++ b/PDP10/ka10_defs.h @@ -350,6 +350,7 @@ struct df10 { void df10_setirq(struct df10 *df) ; +void df10_bump_addr(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); diff --git a/PDP10/ka10_df.c b/PDP10/ka10_df.c index 8af30a7..9c0e196 100644 --- a/PDP10/ka10_df.c +++ b/PDP10/ka10_df.c @@ -33,6 +33,15 @@ void df10_writecw(struct df10 *df) { M[df->cia|1] = ((uint64)(df->ccw & WMASK) << CSHIFT) | ((uint64)df->cda & AMASK); } +void df10_bump_addr(struct df10 *df) { +#if KA & ITS + if (cpu_unit[0].flags & UNIT_ITSPAGE) + df->cda = (uint32)((df->cda + 1) & RMASK) | (df->cda & 07000000); + else +#endif + df->cda = (uint32)((df->cda + 1) & AMASK); +} + void df10_finish_op(struct df10 *df, int flags) { df->status &= ~BUSY; df->status |= flags; diff --git a/PDP10/ka10_mt.c b/PDP10/ka10_mt.c index 95949ae..259955b 100644 --- a/PDP10/ka10_mt.c +++ b/PDP10/ka10_mt.c @@ -234,7 +234,7 @@ t_stat mt_devio(uint32 dev, uint64 *data) { uptr->u3 = (int32)(*data & 077300); CLR_BUF(uptr); mt_df10.buf = 0; - sim_debug(DEBUG_CONO, dptr, + sim_debug(DEBUG_CONO, dptr, "MT CONO %03o start %o %o %o %012llo %012llo PC=%06o\n", dev, uptr->u3, unit, pia, *data, status, PC); if ((uptr->flags & UNIT_ATT) != 0) { @@ -357,7 +357,7 @@ t_stat mt_devio(uint32 dev, uint64 *data) { if (dptr->flags & MTDF_TYPEB) { if (*data & 04) df10_writecw(&mt_df10); - if (*data & 010) + if (*data & 010) status &= ~(WT_CW_DONE); } sim_debug(DEBUG_CONO, dptr, "MT CONO %03o control %o %o %012llo %012llo\n", @@ -385,7 +385,6 @@ void mt_df10_read(DEVICE *dptr, UNIT *uptr) { if (dptr->flags & MTDF_TYPEB) { if (!df10_read(&mt_df10)) { uptr->u3 |= MT_STOP; - return; } sim_debug(DEBUG_DATA, dptr, "MT <%012llo %o\n", mt_df10.buf, uptr->u5); } else { @@ -545,7 +544,7 @@ t_stat mt_srv(UNIT * uptr) if (uptr->u3 & MT_STOP) { if ((uint32)uptr->u6 < uptr->hwmark) status |= RLC_ERR; - if (dptr->flags & MTDF_TYPEB) + if (dptr->flags & MTDF_TYPEB) df10_writecw(&mt_df10); return mt_error(uptr, MTSE_OK, dptr); } @@ -557,7 +556,7 @@ t_stat mt_srv(UNIT * uptr) sim_debug(DEBUG_DETAIL, dptr, "MT%o read error %d\n", unit, r); uptr->u3 &= ~MT_MOTION; if (dptr->flags & MTDF_TYPEB && r == MTSE_TMK) { - mt_df10_write(dptr, uptr); + df10_write(&mt_df10); df10_writecw(&mt_df10); } return mt_error(uptr, r, dptr); @@ -598,8 +597,10 @@ t_stat mt_srv(UNIT * uptr) mt_df10_write(dptr, uptr); } else { if ((cmd & 010) == 0) { - if (dptr->flags & MTDF_TYPEB) + if (dptr->flags & MTDF_TYPEB) { + df10_bump_addr(&mt_df10); df10_writecw(&mt_df10); + } uptr->u3 &= ~(MT_MOTION|MT_BUSY); return mt_error(uptr, MTSE_OK, dptr); } else { @@ -613,7 +614,7 @@ t_stat mt_srv(UNIT * uptr) if (uptr->u3 & MT_STOP) { if ((uint32)uptr->u6 < uptr->hwmark) status |= RLC_ERR; - if (dptr->flags & MTDF_TYPEB) + if (dptr->flags & MTDF_TYPEB) df10_writecw(&mt_df10); return mt_error(uptr, MTSE_OK, dptr); } @@ -901,9 +902,9 @@ t_stat show_mta (FILE *st, UNIT *uptr, int32 val, CONST void *desc) if (dptr == NULL) return SCPE_IERR; if (dptr->flags & val) { - fprintf (st, "MT10B"); + fprintf (st, "TM10B"); } else { - fprintf (st, "MT10A"); + fprintf (st, "TM10A"); } return SCPE_OK; }