mirror of
https://github.com/rcornwell/sims.git
synced 2026-01-13 15:27:04 +00:00
KA10: Fix KL10 ITS to work.
This commit is contained in:
parent
5e2d18cfdd
commit
280432b0d1
@ -131,7 +131,6 @@ int uuo_cycle; /* Uuo cycle in progress */
|
||||
int SC; /* Shift count */
|
||||
int SCAD; /* Shift count extension */
|
||||
int FE; /* Exponent */
|
||||
uint32 max_dev; /* Max dev number */
|
||||
#if KA | PDP6
|
||||
t_addr Pl, Ph, Rl, Rh, Pflag; /* Protection registers */
|
||||
int push_ovf; /* Push stack overflow */
|
||||
@ -280,7 +279,6 @@ int watch_stop; /* Stop at memory watch point */
|
||||
int maoff = 0; /* Offset for traps */
|
||||
|
||||
uint16 dev_irq[128]; /* Pending irq by device */
|
||||
uint8 dev_map[128]; /* Map device to irq slot */
|
||||
t_stat (*dev_tab[128])(uint32 dev, uint64 *data);
|
||||
t_addr (*dev_irqv[128])(uint32 dev, t_addr addr);
|
||||
t_stat rtc_srv(UNIT * uptr);
|
||||
@ -980,6 +978,11 @@ int opflags[] = {
|
||||
#else
|
||||
#define QSLAVE 0
|
||||
#endif
|
||||
#if KS
|
||||
#define MAX_DEV 16
|
||||
#else
|
||||
#define MAX_DEV 128
|
||||
#endif
|
||||
|
||||
#if KL
|
||||
struct _byte {
|
||||
@ -1078,7 +1081,7 @@ void set_interrupt(int dev, int lvl) {
|
||||
#if KS
|
||||
dev_irq[dev>>2] |= 0200 >> lvl;
|
||||
#else
|
||||
dev_irq[dev_map[dev>>2]] = 0200 >> lvl;
|
||||
dev_irq[dev>>2] = 0200 >> lvl;
|
||||
#endif
|
||||
pi_pending = 1;
|
||||
sim_debug(DEBUG_IRQ, &cpu_dev, "set irq %o %o %03o %03o %03o\n",
|
||||
@ -1090,9 +1093,9 @@ void set_interrupt(int dev, int lvl) {
|
||||
void set_interrupt_mpx(int dev, int lvl, int mpx) {
|
||||
lvl &= 07;
|
||||
if (lvl) {
|
||||
dev_irq[dev_map[dev>>2]] = 0200 >> lvl;
|
||||
dev_irq[dev>>2] = 0200 >> lvl;
|
||||
if (lvl == 1 && mpx != 0)
|
||||
dev_irq[dev_map[dev>>2]] |= mpx << 8;
|
||||
dev_irq[dev>>2] |= mpx << 8;
|
||||
pi_pending = 1;
|
||||
sim_debug(DEBUG_IRQ, &cpu_dev, "set mpx irq %o %o %o %03o %03o %03o\n",
|
||||
dev & 0774, lvl, mpx, PIE, PIR, PIH);
|
||||
@ -1104,7 +1107,7 @@ void set_interrupt_mpx(int dev, int lvl, int mpx) {
|
||||
* Clear the interrupt flag for a device
|
||||
*/
|
||||
void clr_interrupt(int dev) {
|
||||
dev_irq[dev_map[dev>>2]] = 0;
|
||||
dev_irq[dev>>2] = 0;
|
||||
if (dev > 4)
|
||||
sim_debug(DEBUG_IRQ, &cpu_dev, "clear irq %o\n", dev & 0774);
|
||||
}
|
||||
@ -1139,7 +1142,7 @@ int check_irq_level() {
|
||||
}
|
||||
|
||||
/* Scan all devices */
|
||||
for(i = lvl = 0; i < (int)max_dev; i++)
|
||||
for(i = lvl = 0; i < MAX_DEV; i++)
|
||||
lvl |= dev_irq[i];
|
||||
if (lvl == 0)
|
||||
pi_pending = 0;
|
||||
@ -1149,7 +1152,7 @@ int check_irq_level() {
|
||||
if (mpx_enable && cpu_unit[0].flags & UNIT_MPX &&
|
||||
(pi_req & 0100) && (PIH & 0100) == 0) {
|
||||
pi_enc = 010;
|
||||
for(i = lvl = 0; i < (int)max_dev; i++) {
|
||||
for(i = lvl = 0; i < MAX_DEV; i++) {
|
||||
if (dev_irq[i] & 0100) {
|
||||
int l = dev_irq[i] >> 8;
|
||||
if (l != 0 && l < pi_enc)
|
||||
@ -2938,7 +2941,7 @@ int page_lookup(t_addr addr, int flag, t_addr *loc, int wr, int cur_context, int
|
||||
/*
|
||||
* Register access on KL 10
|
||||
*/
|
||||
#if 0
|
||||
#if 1
|
||||
uint64 get_reg(int reg) {
|
||||
return FM[fm_sel|(reg & 017)];
|
||||
}
|
||||
@ -2946,9 +2949,10 @@ uint64 get_reg(int reg) {
|
||||
void set_reg(int reg, uint64 value) {
|
||||
FM[fm_sel|(reg & 017)] = value;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
#define get_reg(reg) FM[fm_sel|((reg) & 017)]
|
||||
#define set_reg(reg, value) FM[fm_sel|((reg) & 017)] = (value)
|
||||
#endif
|
||||
|
||||
int Mem_read(int flag, int cur_context, int fetch) {
|
||||
t_addr addr;
|
||||
@ -4625,20 +4629,20 @@ no_fetch:
|
||||
}
|
||||
|
||||
#endif
|
||||
if ((!pi_cycle) & pi_pending
|
||||
#if KI | KL | KS
|
||||
& (!trap_flag)
|
||||
#endif
|
||||
) {
|
||||
pi_rq = check_irq_level();
|
||||
}
|
||||
/* Handle indirection repeat until no longer indirect */
|
||||
do {
|
||||
ind = TST_IND(MB) != 0;
|
||||
AR = MB;
|
||||
AB = MB & RMASK;
|
||||
ix = GET_XR(MB);
|
||||
if (ix) {
|
||||
if ((!pi_cycle) & pi_pending
|
||||
#if KI | KL | KS
|
||||
& (!trap_flag)
|
||||
#endif
|
||||
) {
|
||||
pi_rq = check_irq_level();
|
||||
}
|
||||
ind = TST_IND(MB) != 0;
|
||||
AR = MB;
|
||||
AB = MB & RMASK;
|
||||
ix = GET_XR(MB);
|
||||
if (ix) {
|
||||
#if KL | KS
|
||||
if (((xct_flag & 8) != 0 && !ptr_flg) ||
|
||||
((xct_flag & 2) != 0 && ptr_flg))
|
||||
@ -4745,15 +4749,16 @@ in_loop:
|
||||
ind = 0;
|
||||
}
|
||||
#endif
|
||||
/* Handle events during a indirect loop */
|
||||
AIO_CHECK_EVENT; /* queue async events */
|
||||
if (sim_interval <= 0) {
|
||||
if ((reason = sim_process_event()) != SCPE_OK) {
|
||||
return reason;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle events during a indirect loop */
|
||||
AIO_CHECK_EVENT; /* queue async events */
|
||||
if (--sim_interval <= 0) {
|
||||
if ((reason = sim_process_event()) != SCPE_OK) {
|
||||
return reason;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
if ((!pi_cycle) & pi_pending
|
||||
#if KI | KL | KS
|
||||
& (!trap_flag)
|
||||
@ -4761,6 +4766,7 @@ in_loop:
|
||||
) {
|
||||
pi_rq = check_irq_level();
|
||||
}
|
||||
#endif
|
||||
} while (ind & !pi_rq);
|
||||
|
||||
/* If there is a interrupt handle it. */
|
||||
@ -4801,11 +4807,11 @@ st_pi:
|
||||
* Scan through the devices and allow KI devices to have first
|
||||
* hit at a given level.
|
||||
*/
|
||||
for (f = 0; f < 128; f++) {
|
||||
if (dev_irqv[f] != 0 && dev_irq[dev_map[f]] & pi_mask) {
|
||||
for (f = 0; f < MAX_DEV; f++) {
|
||||
if (dev_irqv[f] != 0 && dev_irq[f] & pi_mask) {
|
||||
AB = dev_irqv[f](f << 2, AB);
|
||||
sim_debug(DEBUG_IRQ, &cpu_dev, "vect irq %o %03o %06o\n",
|
||||
pi_enc, dev_irq[dev_map[f]], AB);
|
||||
pi_enc, dev_irq[f], AB);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -5999,7 +6005,7 @@ dpnorm:
|
||||
#if KL | KS
|
||||
MQ = get_reg(AC + 1);
|
||||
#endif
|
||||
#if KL | KS
|
||||
#if KS
|
||||
IA = AB;
|
||||
AB = (AB + 1) & RMASK;
|
||||
modify = 1;
|
||||
@ -6054,7 +6060,7 @@ dpnorm:
|
||||
FLAGS |= TRP1;
|
||||
#endif
|
||||
}
|
||||
#if KL | KS
|
||||
#if KS
|
||||
IA = AB;
|
||||
modify = 1;
|
||||
AB = (AB + 1) & RMASK;
|
||||
@ -6628,12 +6634,10 @@ ldb_ptr:
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
#if KL
|
||||
#if KL | KS
|
||||
ptr_flg = 0;
|
||||
ld_exe:
|
||||
#endif
|
||||
BYF5 = 1;
|
||||
#if KA | KL | KI
|
||||
#else
|
||||
if ((IR & 06) == 6)
|
||||
modify = 1;
|
||||
#endif
|
||||
@ -11797,13 +11801,11 @@ sect = cur_sect = pc_sect = 0;
|
||||
#if BBN
|
||||
exec_map = 0;
|
||||
#endif
|
||||
for(i=0; i < 128; dev_irq[i++] = 0);
|
||||
#if KS
|
||||
int_cur = int_val = 0;
|
||||
max_dev = 16;
|
||||
#endif
|
||||
|
||||
for(i=0; i < 128; dev_irq[i++] = 0);
|
||||
for(i=0; i < 128; dev_map[i++] = 0);
|
||||
sim_brk_types = SWMASK('E') | SWMASK('W') | SWMASK('R');
|
||||
sim_brk_dflt = SWMASK ('E');
|
||||
sim_clock_precalibrate_commands = pdp10_clock_precalibrate_commands;
|
||||
@ -11968,31 +11970,23 @@ t_bool build_dev_tab (void)
|
||||
for (i = 0; i < 128; i++) {
|
||||
dev_tab[i] = &null_dev;
|
||||
dev_irqv[i] = NULL;
|
||||
dev_map[i] = 0;
|
||||
}
|
||||
|
||||
/* Set up basic devices. */
|
||||
dev_tab[0] = &dev_apr;
|
||||
dev_tab[1] = &dev_pi;
|
||||
max_dev = 2;
|
||||
#if KI | KL
|
||||
dev_tab[2] = &dev_pag;
|
||||
max_dev++;
|
||||
#if KL
|
||||
dev_tab[3] = &dev_cca;
|
||||
dev_tab[4] = &dev_tim;
|
||||
dev_irqv[4] = &tim_irq;
|
||||
dev_tab[5] = &dev_mtr;
|
||||
max_dev+=3;
|
||||
#endif
|
||||
#endif
|
||||
for (i = 0; i < max_dev; i++) {
|
||||
dev_map[i] = i;
|
||||
}
|
||||
#if BBN
|
||||
if (QBBN) {
|
||||
dev_tab[024>>2] = &dev_pag;
|
||||
dev_map[024>>2] = max_dev++;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -12029,7 +12023,6 @@ t_bool build_dev_tab (void)
|
||||
#endif
|
||||
}
|
||||
dev_tab[(d >> 2)] = dibp->io;
|
||||
dev_map[(d >> 2)] = max_dev++;
|
||||
dev_irqv[(d >> 2)] = dibp->irq;
|
||||
rh[rh_idx].dev_num = d;
|
||||
rh[rh_idx].dev = dptr;
|
||||
@ -12056,7 +12049,6 @@ t_bool build_dev_tab (void)
|
||||
return TRUE;
|
||||
}
|
||||
dev_tab[(d >> 2) + j] = dibp->io; /* fill */
|
||||
dev_map[(d >> 2) + j] = max_dev++;
|
||||
dev_irqv[(d >> 2) + j] = dibp->irq;
|
||||
}
|
||||
}
|
||||
|
||||
247
PDP10/kx10_rp.c
247
PDP10/kx10_rp.c
@ -319,28 +319,16 @@ 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[] = {
|
||||
@ -474,7 +462,6 @@ DEVICE rpd_dev = {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
DEVICE *rp_devs[] = {
|
||||
&rpa_dev,
|
||||
#if (NUM_DEVS_RP > 1)
|
||||
@ -487,7 +474,7 @@ DEVICE *rp_devs[] = {
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
rp_rst(DEVICE *dptr)
|
||||
@ -757,7 +744,7 @@ t_stat rp_svc (UNIT *uptr)
|
||||
int diff, da;
|
||||
int sts;
|
||||
|
||||
dptr = uptr->dptr;
|
||||
dptr = rp_devs[ctlr];
|
||||
rhc = &rp_rh[ctlr];
|
||||
unit = uptr - dptr->units;
|
||||
if ((uptr->flags & UNIT_ATT) == 0) { /* not attached? */
|
||||
@ -852,70 +839,70 @@ t_stat rp_svc (UNIT *uptr)
|
||||
goto rd_end;
|
||||
}
|
||||
|
||||
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;
|
||||
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 (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;
|
||||
}
|
||||
if (rh_blkend(rhc))
|
||||
goto rd_end;
|
||||
sim_activate(uptr, 100);
|
||||
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;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
if (uptr->DATAPTR == RP_NUMWD)
|
||||
(void)rh_blkend(rhc);
|
||||
rh_finish_op(rhc, 0);
|
||||
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 */
|
||||
case FNC_WRITEH: /* write w/ headers */
|
||||
@ -924,68 +911,70 @@ rd_end:
|
||||
goto wr_end;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
rp_buf[ctlr][uptr->DATAPTR++] = rhc->buf;
|
||||
while (uptr->DATAPTR < RP_NUMWD) {
|
||||
rp_buf[ctlr][uptr->DATAPTR++] = 0;
|
||||
}
|
||||
|
||||
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 (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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rh_blkend(rhc))
|
||||
goto wr_end;
|
||||
}
|
||||
if (rh_blkend(rhc))
|
||||
goto wr_end;
|
||||
|
||||
if (sts) {
|
||||
sim_activate(uptr, 100);
|
||||
sim_activate(uptr, 10);
|
||||
} else {
|
||||
wr_end:
|
||||
sim_debug(DEBUG_DETAIL, dptr, "RP%o write done\n", unit);
|
||||
uptr->CMD |= DS_DRY;
|
||||
uptr->CMD &= ~CS1_GO;
|
||||
rh_finish_op(rhc, 0);
|
||||
return SCPE_OK;
|
||||
}
|
||||
return SCPE_OK;
|
||||
break;
|
||||
}
|
||||
return SCPE_OK;
|
||||
}
|
||||
@ -1024,7 +1013,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 = uptr->dptr;
|
||||
DEVICE *dptr = rp_devs[ctlr];
|
||||
uint32 addr;
|
||||
uint32 ptr = 0;
|
||||
int wc;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user