1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-02-24 08:02:50 +00:00

KA10: Clean up errors in RS and TU devices on KA/KI/KL.

This commit is contained in:
Richard Cornwell
2021-02-20 15:56:16 -05:00
parent 0a9a94d187
commit 2b76424ac8
3 changed files with 130 additions and 131 deletions

View File

@@ -673,7 +673,8 @@ void dte_second(UNIT *uptr) {
if (ch != 0) {
cty_out.buff[cty_out.in_ptr] = ch & 0x7f;
inci(&cty_out);
sim_activate(&dte_unit[1], 200);
if (!sim_is_active(&dte_unit[1]))
sim_activate(&dte_unit[1], 200);
}
M[SEC_DTCHR + base] = ch;
M[SEC_DTMTD + base] = FMASK;

View File

@@ -28,9 +28,6 @@
#endif
#if (NUM_DEVS_RS > 0)
#include "kx10_disk.h"
#define BUF_EMPTY(u) (u->hwmark == 0xFFFFFFFF)
#define CLR_BUF(u) u->hwmark = 0xFFFFFFFF
@@ -483,96 +480,101 @@ t_stat rs_svc (UNIT *uptr)
case FNC_READ: /* read */
case FNC_WCHK: /* write check */
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect ||
GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf) {
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
if (BUF_EMPTY(uptr)) {
int wc;
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect ||
GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf) {
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
uptr->CMD &= ~CS1_GO;
sim_debug(DEBUG_DETAIL, dptr, "%s%o readx done\n", dptr->name, unit);
rh_finish_op(rhc, 0);
return SCPE_OK;
}
sim_debug(DEBUG_DETAIL, dptr, "%s%o read (%d,%d)\n", dptr->name, unit,
GET_SC(uptr->DA), GET_SF(uptr->DA));
da = GET_DA(uptr->DA, dtype) * RS_NUMWD;
(void)sim_fseek(uptr->fileref, da * sizeof(uint64), SEEK_SET);
wc = sim_fread (&rs_buf[ctlr][0], sizeof(uint64), RS_NUMWD,
uptr->fileref);
while (wc < RS_NUMWD)
rs_buf[ctlr][wc++] = 0;
uptr->hwmark = RS_NUMWD;
uptr->DATAPTR = 0;
}
rhc->buf = rs_buf[ctlr][uptr->DATAPTR++];
sim_debug(DEBUG_DATA, dptr, "%s%o read word %d %012llo %09o %06o\n",
dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->cda, rhc->wcr);
if (rh_write(rhc)) {
if (uptr->DATAPTR == RS_NUMWD) {
/* Increment to next sector. Set Last Sector */
uptr->DATAPTR = 0;
CLR_BUF(uptr);
uptr->DA += 1 << DA_V_SC;
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect) {
uptr->DA &= (DA_M_SF << DA_V_SF);
uptr->DA += 1 << DA_V_SF;
if (GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf)
uptr->CMD |= DS_LST;
}
if (rh_blkend(rhc))
goto rd_end;
}
sim_activate(uptr, 10);
} else {
rd_end:
sim_debug(DEBUG_DETAIL, dptr, "%s%o read done\n", dptr->name, unit);
uptr->CMD |= DS_DRY;
uptr->CMD &= ~CS1_GO;
sim_debug(DEBUG_DETAIL, dptr, "%s%o readx done\n", dptr->name, unit);
if (uptr->DATAPTR == RS_NUMWD)
(void)rh_blkend(rhc);
rh_finish_op(rhc, 0);
return SCPE_OK;
}
sim_debug(DEBUG_DETAIL, dptr, "%s%o read (%d,%d)\n", dptr->name, unit,
GET_SC(uptr->DA), GET_SF(uptr->DA));
da = GET_DA(uptr->DA, dtype) * RS_NUMWD;
(void)disk_read(uptr, &rs_buf[ctlr][0], da, RS_NUMWD);
uptr->hwmark = RS_NUMWD;
uptr->DATAPTR = 0;
sts = 1;
while(uptr->DATAPTR < RS_NUMWD && sts != 0) {
rhc->buf = rs_buf[ctlr][uptr->DATAPTR++];
sim_debug(DEBUG_DATA, dptr, "%s%o read word %d %012llo %09o %06o\n",
dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->cda, rhc->wcr);
sts = rh_write(rhc);
}
/* If we hit end of sector before ran out of data, advance */
if (sts) {
/* Increment to next sector. Set Last Sector */
uptr->DATAPTR = 0;
CLR_BUF(uptr);
uptr->DA += 1 << DA_V_SC;
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect) {
uptr->DA &= (DA_M_SF << DA_V_SF);
uptr->DA += 1 << DA_V_SF;
if (GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf)
uptr->CMD |= DS_LST;
}
if (rh_blkend(rhc))
goto rd_end;
sim_activate(uptr, 10);
return SCPE_OK;
}
rd_end:
sim_debug(DEBUG_DETAIL, dptr, "%s%o read done\n", dptr->name, unit);
uptr->CMD |= DS_DRY;
uptr->CMD &= ~CS1_GO;
if (sts == 0)
(void)rh_blkend(rhc);
rh_finish_op(rhc, 0);
return SCPE_OK;
break;
case FNC_WRITE: /* write */
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect ||
GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf) {
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
uptr->CMD &= ~CS1_GO;
sim_debug(DEBUG_DETAIL, dptr, "%s%o writex done\n", dptr->name, unit);
rh_finish_op(rhc, 0);
return SCPE_OK;
}
uptr->DATAPTR = 0;
uptr->hwmark = 0;
rhc->buf = 0;
while (uptr->DATAPTR < RS_NUMWD && (sts = rh_read(rhc)) != 0) {
rs_buf[ctlr][uptr->DATAPTR++] = rhc->buf;
sim_debug(DEBUG_DATA, dptr, "%s%o write word %d %012llo %09o %06o\n",
dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->cda, rhc->wcr);
if (BUF_EMPTY(uptr)) {
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect ||
GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf) {
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
uptr->CMD &= ~CS1_GO;
sim_debug(DEBUG_DETAIL, dptr, "%s%o writex done\n", dptr->name, unit);
rh_finish_op(rhc, 0);
return SCPE_OK;
}
uptr->DATAPTR = 0;
uptr->hwmark = 0;
}
sts = rh_read(rhc);
rs_buf[ctlr][uptr->DATAPTR++] = rhc->buf;
sim_debug(DEBUG_DATA, dptr, "%s%o write word %d %012llo %09o %06o\n",
dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->cda, rhc->wcr);
if (sts == 0) {
while (uptr->DATAPTR < RS_NUMWD)
rs_buf[ctlr][uptr->DATAPTR++] = 0;
}
sim_debug(DEBUG_DETAIL, dptr, "%s%o write (%d,%d)\n", dptr->name, unit,
if (uptr->DATAPTR == RS_NUMWD) {
sim_debug(DEBUG_DETAIL, dptr, "%s%o write (%d,%d)\n", dptr->name, unit,
GET_SC(uptr->DA), GET_SF(uptr->DA));
da = GET_DA(uptr->DA, dtype) * RS_NUMWD;
(void)disk_write(uptr, &rs_buf[ctlr][0], da, RS_NUMWD);
uptr->DATAPTR = 0;
CLR_BUF(uptr);
if (sts) {
uptr->DA += 1 << DA_V_SC;
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect) {
uptr->DA &= (DA_M_SF << DA_V_SF);
uptr->DA += 1 << DA_V_SF;
if (GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf)
uptr->CMD |= DS_LST;
}
da = GET_DA(uptr->DA, dtype) * RS_NUMWD;
(void)sim_fseek(uptr->fileref, da * sizeof(uint64), SEEK_SET);
(void)sim_fwrite (&rs_buf[ctlr][0], sizeof(uint64), RS_NUMWD,
uptr->fileref);
uptr->DATAPTR = 0;
CLR_BUF(uptr);
if (sts) {
uptr->DA += 1 << DA_V_SC;
if (GET_SC(uptr->DA) >= rs_drv_tab[dtype].sect) {
uptr->DA &= (DA_M_SF << DA_V_SF);
uptr->DA += 1 << DA_V_SF;
if (GET_SF(uptr->DA) >= rs_drv_tab[dtype].surf)
uptr->CMD |= DS_LST;
}
}
if (rh_blkend(rhc))
goto wr_end;
}
if (rh_blkend(rhc))
goto wr_end;
if (sts) {
sim_activate(uptr, 10);
} else {

View File

@@ -65,7 +65,6 @@
#define FNC_READREV 037 /* read reverse */
#define CS1_DVA 0004000 /* drive avail NI */
#define GET_FNC(x) (((x) >> CS1_V_FNC) & CS1_M_FNC)
#define CS_MOTION 002000 /* Tape moving */
#define STATUS u5
/* u5 low */
@@ -279,7 +278,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) {
case FNC_SPACEF: /* Space forward */
case FNC_SPACEB: /* Space backward */
if ((tu_tcr[ctlr] & TC_FCS) == 0) {
uptr->STATUS |= ER1_NEF;
uptr->STATUS |= ER1_NEF << 16;
break;
}
/* Fall through */
@@ -291,7 +290,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) {
case FNC_UNLOAD: /* unload */
case FNC_WCHKREV: /* write w/ headers */
uptr->CMD |= CS1_GO;
uptr->STATUS |= DS_PIP;
uptr->STATUS = DS_PIP;
rhc->attn = 0;
for (i = 0; i < NUM_UNITS_TU; i++) {
if (dptr->units[i].STATUS & DS_ATA)
@@ -313,7 +312,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) {
}
break;
default:
uptr->STATUS |= (ER1_ILF << 16) | DS_ATA;
uptr->STATUS |= (ER1_ILF << 16)|DS_ATA;
rhc->attn = 1;
}
sim_debug(DEBUG_DETAIL, dptr, "%s%o AStatus=%06o\n", dptr->name, unit,
@@ -324,7 +323,7 @@ tu_write(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 data) {
break;
case 002: /* error register 1 */
uptr->STATUS &= 0177777;
uptr->STATUS |= (uint32)data << 16;
uptr->STATUS |= (data & 0177777) << 16;
break;
case 003: /* maintenance */
break;
@@ -365,28 +364,34 @@ tu_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) {
switch(reg) {
case 000: /* control */
temp = uptr->CMD & 076;
temp = uptr->CMD & 077;
temp |= CS1_DVA;
if (uptr->CMD & CS1_GO)
temp |= CS1_GO;
break;
case 001: /* status */
temp = uptr->STATUS & 01777777;
temp |= DS_DPR;
if (((uptr->STATUS >> 16) & 0177777) != 0)
temp = DS_DPR | (uptr->STATUS & 0177777);
// if (uptr->STATUS & DS_ATA)
// temp |= DS_ATA;
// if (uptr->CMD & CS_CHANGE)
// temp |= DS_SSC;
if ((uptr->STATUS & (0177777 << 16)) != 0)
temp |= DS_ERR;
if ((uptr->flags & UNIT_ATT) != 0) {
temp |= DS_MOL;
// if (uptr->CMD & CS_TM)
// temp |= DS_TM;
if (uptr->flags & MTUF_WLK)
temp |= DS_WRL;
if ((uptr->CMD & (CS_MOTION|CS1_GO)) == 0 && (uptr->STATUS & DS_PIP) == 0)
if ((uptr->CMD & (CS1_GO)) == 0 &&
(uptr->STATUS & (DS_PIP)) == 0)
temp |= DS_DRY;
if (sim_tape_bot(uptr))
temp |= DS_BOT;
if (sim_tape_eot(uptr))
temp |= DS_EOT;
if ((uptr->CMD & CS_MOTION) == 0)
if ((uptr->CMD & CS1_GO) == 0)
temp |= DS_SDWN;
// if (uptr->CMD & CS_PIP)
// temp |= DS_PIP;
}
break;
case 002: /* error register 1 */
@@ -403,7 +408,7 @@ tu_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) {
break;
case 006: /* drive type */
if ((uptr->flags & UNIT_DIS) == 0)
temp = 0142054;
temp = 042054;
break;
case 011: /* tape control register */
temp = tu_tcr[ctlr];
@@ -415,7 +420,7 @@ tu_read(DEVICE *dptr, struct rh_if *rhc, int reg, uint32 *data) {
case 007: /* look ahead */
break;
default:
uptr->STATUS |= (ER1_ILR << 16) | DS_ATA;
uptr->STATUS |= (ER1_ILR << 16)|DS_ATA;
rhc->attn = 1;
rhc->rae = 1;
}
@@ -440,7 +445,7 @@ void tu_error(UNIT * uptr, t_stat r)
break;
case MTSE_WRP: /* write protected */
uptr->STATUS |= (ER1_NEF << 16) | DS_ATA;
uptr->STATUS |= (ER1_NEF << 16)|DS_ATA;
break;
case MTSE_UNATT: /* unattached */
@@ -450,15 +455,15 @@ void tu_error(UNIT * uptr, t_stat r)
case MTSE_IOERR: /* IO error */
case MTSE_FMT: /* invalid format */
uptr->STATUS |= (ER1_PEF << 16) | DS_ATA;
uptr->STATUS |= (ER1_PEF << 16)|DS_ATA;
break;
case MTSE_RECE: /* error in record */
uptr->STATUS |= (ER1_DPAR << 16) | DS_ATA;
uptr->STATUS |= (ER1_DPAR << 16)|DS_ATA;
break;
case MTSE_INVRL: /* invalid rec lnt */
uptr->STATUS |= (ER1_FCE << 16) | DS_ATA;
uptr->STATUS |= (ER1_FCE << 16)|DS_ATA;
break;
}
@@ -466,7 +471,7 @@ void tu_error(UNIT * uptr, t_stat r)
rh_setattn(rhc, 0);
if (GET_FNC(uptr->CMD) >= FNC_XFER && uptr->STATUS & (DS_ATA | DS_TM))
rh_error(rhc);
uptr->CMD &= ~(CS_MOTION|CS1_GO);
uptr->CMD &= ~(CS1_GO);
uptr->STATUS &= ~(DS_PIP);
sim_debug(DEBUG_EXP, dptr, "Setting status %d\n", r);
}
@@ -506,10 +511,8 @@ t_stat tu_srv(UNIT * uptr)
sim_debug(DEBUG_DETAIL, dptr, "%s%o rewind\n", dptr->name, unit);
if (uptr->CMD & CS1_GO) {
sim_activate(uptr,40000);
uptr->CMD |= CS_MOTION;
uptr->CMD &= ~(CS1_GO);
} else {
uptr->CMD &= ~(CS_MOTION);
uptr->STATUS &= ~(DS_PIP);
uptr->STATUS |= DS_SSC|DS_ATA;
rh_setattn(rhc, 0);
@@ -531,12 +534,11 @@ t_stat tu_srv(UNIT * uptr)
TU_NUMFR)) != MTSE_OK) {
sim_debug(DEBUG_DETAIL, dptr, "%s%o read error %d\n", dptr->name, unit, r);
if (r == MTSE_BOT)
uptr->STATUS |= (ER1_NEF << 16);
uptr->STATUS |= ER1_NEF << 16;
tu_error(uptr, r);
rh_finish_op(rhc, 0);
} else {
sim_debug(DEBUG_DETAIL, dptr, "%s%o read %d\n", dptr->name, unit, reclen);
uptr->CMD |= CS_MOTION;
uptr->hwmark = reclen;
uptr->DATAPTR = uptr->hwmark-1;
uptr->CPOS = cc_max;
@@ -580,12 +582,11 @@ t_stat tu_srv(UNIT * uptr)
case FNC_READ:
if (BUF_EMPTY(uptr)) {
uptr->STATUS &= ~DS_PIP;
uptr->CMD |= CS_MOTION;
if ((r = sim_tape_rdrecf(uptr, &tu_buf[ctlr][0], &reclen,
TU_NUMFR)) != MTSE_OK) {
sim_debug(DEBUG_DETAIL, dptr, "%s%o read error %d\n", dptr->name, unit, r);
if (r == MTSE_TMK)
uptr->STATUS |= (ER1_FCE << 16);
uptr->STATUS |= ER1_FCE << 16;
tu_error(uptr, r);
rh_finish_op(rhc, 0);
} else {
@@ -651,7 +652,6 @@ t_stat tu_srv(UNIT * uptr)
rh_finish_op(rhc, 0);
return SCPE_OK;
}
uptr->CMD |= CS_MOTION;
sim_debug(DEBUG_EXP, dptr, "%s%o Init write\n", dptr->name, unit);
uptr->hwmark = 0;
uptr->CPOS = 0;
@@ -661,28 +661,26 @@ t_stat tu_srv(UNIT * uptr)
if (tu_frame[ctlr] != 0 && uptr->CPOS == 0 && rh_read(rhc) == 0)
uptr->CPOS |= 010;
if ((uptr->CMD & CS_MOTION) != 0) {
if (uptr->CPOS == 0)
sim_debug(DEBUG_DATA, dptr, "%s%o write %012llo\n",
dptr->name, unit, rhc->buf);
/* Write next char out */
cc = (8 * (3 - (uptr->CPOS & 07))) + 4;
if (cc < 0)
ch = rhc->buf & 0x0f;
else
ch = (rhc->buf >> cc) & 0xff;
tu_buf[ctlr][uptr->DATAPTR] = ch;
uptr->DATAPTR++;
uptr->hwmark = uptr->DATAPTR;
uptr->CPOS = (uptr->CPOS & 010) | ((uptr->CPOS & 07) + 1);
if ((uptr->CPOS & 7) == cc_max) {
uptr->CPOS &= 010;
}
tu_frame[ctlr] = 0177777 & (tu_frame[ctlr] + 1);
if (tu_frame[ctlr] == 0) {
uptr->CPOS = 010;
tu_tcr[ctlr] &= ~(TC_FCS);
}
if (uptr->CPOS == 0)
sim_debug(DEBUG_DATA, dptr, "%s%o write %012llo\n",
dptr->name, unit, rhc->buf);
/* Write next char out */
cc = (8 * (3 - (uptr->CPOS & 07))) + 4;
if (cc < 0)
ch = rhc->buf & 0x0f;
else
ch = (rhc->buf >> cc) & 0xff;
tu_buf[ctlr][uptr->DATAPTR] = ch;
uptr->DATAPTR++;
uptr->hwmark = uptr->DATAPTR;
uptr->CPOS = (uptr->CPOS & 010) | ((uptr->CPOS & 07) + 1);
if ((uptr->CPOS & 7) == cc_max) {
uptr->CPOS &= 010;
}
tu_frame[ctlr] = 0177777 & (tu_frame[ctlr] + 1);
if (tu_frame[ctlr] == 0) {
uptr->CPOS = 010;
tu_tcr[ctlr] &= ~(TC_FCS);
}
if (uptr->CPOS == 010) {
/* Write out the block */
@@ -730,7 +728,6 @@ t_stat tu_srv(UNIT * uptr)
tu_error(uptr, MTSE_OK);
return SCPE_OK;
}
uptr->CMD |= CS_MOTION;
/* Always skip at least one record */
if (GET_FNC(uptr->CMD) == FNC_SPACEF)
r = sim_tape_sprecf(uptr, &reclen);
@@ -872,7 +869,6 @@ tu_detach(UNIT * uptr)
int ctlr = GET_CNTRL_RH(uptr->flags);
struct rh_if *rhc = &tu_rh[ctlr];
/* Find df10 */
uptr->STATUS = DS_ATA|DS_SSC;
rh_setattn(rhc, 0);
return sim_tape_detach(uptr);