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:
@@ -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;
|
||||
|
||||
160
PDP10/kx10_rs.c
160
PDP10/kx10_rs.c
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user