mirror of
https://github.com/rcornwell/sims.git
synced 2026-04-27 20:39:22 +00:00
KA10: Speedup of disk and tape controllers.
This commit is contained in:
@@ -715,7 +715,7 @@ t_stat dp_svc (UNIT *uptr)
|
||||
CLR_BUF(uptr);
|
||||
}
|
||||
if (r)
|
||||
sim_activate(uptr, 40);
|
||||
sim_activate(uptr, 15);
|
||||
else {
|
||||
uptr->STATUS &= ~(SRC_DONE|END_CYL|BUSY);
|
||||
uptr->UFLAGS |= DONE;
|
||||
|
||||
@@ -532,7 +532,7 @@ t_stat mt_error(UNIT * uptr, t_stat r, DEVICE * dptr)
|
||||
/* Handle processing of tape requests. */
|
||||
t_stat mt_srv(UNIT * uptr)
|
||||
{
|
||||
DEVICE *dptr = find_dev_from_unit(uptr);
|
||||
DEVICE *dptr = uptr->dptr;
|
||||
int unit = (uptr - dptr->units) & 7;
|
||||
int cmd = (uptr->CNTRL & FUNCTION) >> 9;
|
||||
t_mtrlnt reclen;
|
||||
@@ -557,6 +557,9 @@ t_stat mt_srv(UNIT * uptr)
|
||||
cc_max = (4 + ((uptr->CNTRL & CORE_DUMP) != 0));
|
||||
}
|
||||
|
||||
if (dptr == NULL)
|
||||
dptr = find_dev_from_unit(uptr);
|
||||
|
||||
switch(cmd) {
|
||||
case NOP_IDLE:
|
||||
sim_debug(DEBUG_DETAIL, dptr, "MT%o Idle\n", unit);
|
||||
|
||||
237
PDP10/kx10_rp.c
237
PDP10/kx10_rp.c
@@ -319,16 +319,28 @@ UNIT rp_unit[] = {
|
||||
|
||||
struct rh_if rp_rh[NUM_DEVS_RP] = {
|
||||
{ &rp_write, &rp_read, &rp_rst},
|
||||
#if (NUM_DEVS_RP > 1)
|
||||
{ &rp_write, &rp_read, &rp_rst},
|
||||
#if (NUM_DEVS_RP > 2)
|
||||
{ &rp_write, &rp_read, &rp_rst},
|
||||
#if (NUM_DEVS_RP > 3)
|
||||
{ &rp_write, &rp_read, &rp_rst}
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
DIB rp_dib[] = {
|
||||
{RH10_DEV, 1, &rh_devio, &rh_devirq, &rp_rh[0]},
|
||||
#if (NUM_DEVS_RP > 1)
|
||||
{RH10_DEV, 1, &rh_devio, &rh_devirq, &rp_rh[1]},
|
||||
#if (NUM_DEVS_RP > 2)
|
||||
{RH10_DEV, 1, &rh_devio, &rh_devirq, &rp_rh[2]},
|
||||
#if (NUM_DEVS_RP > 3)
|
||||
{RH10_DEV, 1, &rh_devio, &rh_devirq, &rp_rh[3]}};
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
MTAB rp_mod[] = {
|
||||
@@ -462,6 +474,7 @@ DEVICE rpd_dev = {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
DEVICE *rp_devs[] = {
|
||||
&rpa_dev,
|
||||
#if (NUM_DEVS_RP > 1)
|
||||
@@ -474,7 +487,7 @@ DEVICE *rp_devs[] = {
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
rp_rst(DEVICE *dptr)
|
||||
@@ -744,7 +757,7 @@ t_stat rp_svc (UNIT *uptr)
|
||||
int diff, da;
|
||||
int sts;
|
||||
|
||||
dptr = rp_devs[ctlr];
|
||||
dptr = uptr->dptr;
|
||||
rhc = &rp_rh[ctlr];
|
||||
unit = uptr - dptr->units;
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* not attached? */
|
||||
@@ -839,70 +852,70 @@ t_stat rp_svc (UNIT *uptr)
|
||||
goto rd_end;
|
||||
}
|
||||
|
||||
if (BUF_EMPTY(uptr)) {
|
||||
if (GET_SC(uptr->DA) >= rp_drv_tab[dtype].sect ||
|
||||
GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
rh_finish_op(rhc, 0);
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o readx done\n", dptr->name, unit);
|
||||
return SCPE_OK;
|
||||
}
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o read (%d,%d,%d)\n", dptr->name, unit, cyl,
|
||||
GET_SF(uptr->DA), GET_SC(uptr->DA));
|
||||
da = GET_DA(uptr->DA, dtype);
|
||||
(void)disk_read(uptr, &rp_buf[ctlr][0], da, RP_NUMWD);
|
||||
uptr->hwmark = RP_NUMWD;
|
||||
uptr->DATAPTR = 0;
|
||||
/* On read headers, transfer 2 words to start */
|
||||
if (GET_FNC(uptr->CMD) == FNC_READH) {
|
||||
rhc->buf = (((uint64)cyl) << 18) |
|
||||
((uint64)((GET_SF(uptr->DA) << 8) | GET_SF(uptr->DA)));
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o read word h1 %012llo %09o %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->cda, rhc->wcr);
|
||||
if (rh_write(rhc) == 0)
|
||||
goto rd_end;
|
||||
rhc->buf = ((uint64)((020 * ctlr) + (unit + 1)) << 18) | (uint64)(unit);
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o read word h2 %012llo %09o %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->cda, rhc->wcr);
|
||||
if (rh_write(rhc) == 0)
|
||||
goto rd_end;
|
||||
}
|
||||
}
|
||||
|
||||
rhc->buf = rp_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 == RP_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) >= rp_drv_tab[dtype].sect) {
|
||||
uptr->DA &= (DA_M_SF << DA_V_SF) | (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DA_V_SF;
|
||||
if (GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->DA &= (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DC_V_CY;
|
||||
uptr->CMD |= DS_PIP;
|
||||
}
|
||||
}
|
||||
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;
|
||||
if (GET_SC(uptr->DA) >= rp_drv_tab[dtype].sect ||
|
||||
GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
if (uptr->DATAPTR == RP_NUMWD)
|
||||
(void)rh_blkend(rhc);
|
||||
rh_finish_op(rhc, 0);
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o readx done\n", dptr->name, unit);
|
||||
return SCPE_OK;
|
||||
}
|
||||
break;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o read (%d,%d,%d)\n", dptr->name, unit, cyl,
|
||||
GET_SF(uptr->DA), GET_SC(uptr->DA));
|
||||
da = GET_DA(uptr->DA, dtype);
|
||||
(void)disk_read(uptr, &rp_buf[ctlr][0], da, RP_NUMWD);
|
||||
uptr->hwmark = RP_NUMWD;
|
||||
uptr->DATAPTR = 0;
|
||||
sts = 1;
|
||||
/* On read headers, transfer 2 words to start */
|
||||
if (GET_FNC(uptr->CMD) == FNC_READH) {
|
||||
rhc->buf = (((uint64)cyl) << 18) |
|
||||
((uint64)((GET_SF(uptr->DA) << 8) | GET_SF(uptr->DA)));
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o read word h1 %012llo %09o %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->cda, rhc->wcr);
|
||||
if ((sts = rh_write(rhc)) == 0)
|
||||
goto rd_end;
|
||||
rhc->buf = ((uint64)((020 * ctlr) + (unit + 1)) << 18) | (uint64)(unit);
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o read word h2 %012llo %09o %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->cda, rhc->wcr);
|
||||
if ((sts = rh_write(rhc)) == 0)
|
||||
goto rd_end;
|
||||
}
|
||||
|
||||
while (uptr->DATAPTR < RP_NUMWD && sts != 0) {
|
||||
rhc->buf = rp_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 (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) >= rp_drv_tab[dtype].sect) {
|
||||
uptr->DA &= (DA_M_SF << DA_V_SF) | (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DA_V_SF;
|
||||
if (GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->DA &= (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DC_V_CY;
|
||||
uptr->CMD |= DS_PIP;
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
||||
case FNC_WRITE: /* write */
|
||||
case FNC_WRITEH: /* write w/ headers */
|
||||
@@ -911,59 +924,58 @@ rd_end:
|
||||
goto wr_end;
|
||||
}
|
||||
|
||||
if (BUF_EMPTY(uptr)) {
|
||||
if (GET_SC(uptr->DA) >= rp_drv_tab[dtype].sect ||
|
||||
GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
rh_finish_op(rhc, 0);
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o writex done\n", dptr->name, unit);
|
||||
return SCPE_OK;
|
||||
}
|
||||
/* On Write headers, transfer 2 words to start */
|
||||
if (GET_FNC(uptr->CMD) == FNC_WRITEH) {
|
||||
if (rh_read(rhc) == 0)
|
||||
goto wr_end;
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o write word h1 %012llo %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->wcr);
|
||||
if (rh_read(rhc) == 0)
|
||||
goto wr_end;
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o write word h2 %012llo %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->wcr);
|
||||
}
|
||||
uptr->DATAPTR = 0;
|
||||
uptr->hwmark = 0;
|
||||
if (GET_SC(uptr->DA) >= rp_drv_tab[dtype].sect ||
|
||||
GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->CMD |= (ER1_IAE << 16)|DS_ERR|DS_DRY|DS_ATA;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
rh_finish_op(rhc, 0);
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o writex done\n", dptr->name, unit);
|
||||
return SCPE_OK;
|
||||
}
|
||||
sts = 1;
|
||||
/* On Write headers, transfer 2 words to start */
|
||||
if (GET_FNC(uptr->CMD) == FNC_WRITEH) {
|
||||
if ((sts = rh_read(rhc)) == 0)
|
||||
goto wr_end;
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o write word h1 %012llo %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->wcr);
|
||||
if ((sts = rh_read(rhc)) == 0)
|
||||
goto wr_end;
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o write word h2 %012llo %06o\n",
|
||||
dptr->name, unit, rhc->buf, rhc->wcr);
|
||||
}
|
||||
uptr->DATAPTR = 0;
|
||||
uptr->hwmark = 0;
|
||||
rhc->buf = 0;
|
||||
while (uptr->DATAPTR < RP_NUMWD && (sts = rh_read(rhc)) != 0) {
|
||||
rp_buf[ctlr][uptr->DATAPTR++] = rhc->buf;
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o write word %d %012llo %06o %06o\n",
|
||||
dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->cda, rhc->wcr);
|
||||
}
|
||||
sts = rh_read(rhc);
|
||||
sim_debug(DEBUG_DATA, dptr, "%s%o write word %d %012llo %06o %06o\n",
|
||||
dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->cda, rhc->wcr);
|
||||
rp_buf[ctlr][uptr->DATAPTR++] = rhc->buf;
|
||||
if (sts == 0) {
|
||||
while (uptr->DATAPTR < RP_NUMWD)
|
||||
rp_buf[ctlr][uptr->DATAPTR++] = 0;
|
||||
while (uptr->DATAPTR < RP_NUMWD) {
|
||||
rp_buf[ctlr][uptr->DATAPTR++] = 0;
|
||||
}
|
||||
if (uptr->DATAPTR == RP_NUMWD) {
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o write (%d,%d,%d)\n", dptr->name,
|
||||
unit, cyl, GET_SF(uptr->DA), GET_SC(uptr->DA));
|
||||
da = GET_DA(uptr->DA, dtype);
|
||||
(void)disk_write(uptr, &rp_buf[ctlr][0], da, RP_NUMWD);
|
||||
uptr->DATAPTR = 0;
|
||||
CLR_BUF(uptr);
|
||||
if (sts) {
|
||||
uptr->DA += 1 << DA_V_SC;
|
||||
if (GET_SC(uptr->DA) >= rp_drv_tab[dtype].sect) {
|
||||
uptr->DA &= (DA_M_SF << DA_V_SF) | (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DA_V_SF;
|
||||
if (GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->DA &= (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DC_V_CY;
|
||||
uptr->CMD |= DS_PIP;
|
||||
}
|
||||
}
|
||||
wr_done:
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o write (%d,%d,%d)\n", dptr->name,
|
||||
unit, cyl, GET_SF(uptr->DA), GET_SC(uptr->DA));
|
||||
da = GET_DA(uptr->DA, dtype);
|
||||
(void)disk_write(uptr, &rp_buf[ctlr][0], da, RP_NUMWD);
|
||||
uptr->DATAPTR = 0;
|
||||
CLR_BUF(uptr);
|
||||
uptr->DA += 1 << DA_V_SC;
|
||||
if (GET_SC(uptr->DA) >= rp_drv_tab[dtype].sect) {
|
||||
uptr->DA &= (DA_M_SF << DA_V_SF) | (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DA_V_SF;
|
||||
if (GET_SF(uptr->DA) >= rp_drv_tab[dtype].surf) {
|
||||
uptr->DA &= (DC_M_CY << DC_V_CY);
|
||||
uptr->DA += 1 << DC_V_CY;
|
||||
uptr->CMD |= DS_PIP;
|
||||
}
|
||||
if (rh_blkend(rhc))
|
||||
goto wr_end;
|
||||
}
|
||||
if (rh_blkend(rhc))
|
||||
goto wr_end;
|
||||
|
||||
if (sts) {
|
||||
sim_activate(uptr, 10);
|
||||
} else {
|
||||
@@ -972,9 +984,8 @@ wr_end:
|
||||
uptr->CMD |= DS_DRY;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
rh_finish_op(rhc, 0);
|
||||
return SCPE_OK;
|
||||
}
|
||||
break;
|
||||
return SCPE_OK;
|
||||
}
|
||||
return SCPE_OK;
|
||||
}
|
||||
@@ -1013,7 +1024,7 @@ rp_boot(int32 unit_num, DEVICE * rptr)
|
||||
UNIT *uptr = &rptr->units[unit_num];
|
||||
int ctlr = GET_CNTRL_RH(uptr->flags);
|
||||
struct rh_if *rhc = &rp_rh[ctlr];
|
||||
DEVICE *dptr = rp_devs[ctlr];
|
||||
DEVICE *dptr = uptr->dptr;
|
||||
uint32 addr;
|
||||
uint32 ptr = 0;
|
||||
int wc;
|
||||
|
||||
160
PDP10/kx10_rs.c
160
PDP10/kx10_rs.c
@@ -28,6 +28,9 @@
|
||||
#endif
|
||||
|
||||
#if (NUM_DEVS_RS > 0)
|
||||
|
||||
#include "kx10_disk.h"
|
||||
|
||||
#define BUF_EMPTY(u) (u->hwmark == 0xFFFFFFFF)
|
||||
#define CLR_BUF(u) u->hwmark = 0xFFFFFFFF
|
||||
|
||||
@@ -480,101 +483,96 @@ t_stat rs_svc (UNIT *uptr)
|
||||
|
||||
case FNC_READ: /* read */
|
||||
case FNC_WCHK: /* write check */
|
||||
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;
|
||||
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;
|
||||
if (uptr->DATAPTR == RS_NUMWD)
|
||||
(void)rh_blkend(rhc);
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o readx done\n", dptr->name, unit);
|
||||
rh_finish_op(rhc, 0);
|
||||
return SCPE_OK;
|
||||
}
|
||||
break;
|
||||
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;
|
||||
|
||||
case FNC_WRITE: /* write */
|
||||
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;
|
||||
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;
|
||||
}
|
||||
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",
|
||||
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);
|
||||
}
|
||||
rs_buf[ctlr][uptr->DATAPTR++] = rhc->buf;
|
||||
if (sts == 0) {
|
||||
while (uptr->DATAPTR < RS_NUMWD)
|
||||
rs_buf[ctlr][uptr->DATAPTR++] = 0;
|
||||
}
|
||||
if (uptr->DATAPTR == RS_NUMWD) {
|
||||
sim_debug(DEBUG_DETAIL, dptr, "%s%o write (%d,%d)\n", dptr->name, unit,
|
||||
|
||||
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)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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (rh_blkend(rhc))
|
||||
goto wr_end;
|
||||
if (sts) {
|
||||
sim_activate(uptr, 10);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user