1
0
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:
Richard Cornwell 2021-02-13 21:14:35 -05:00
parent 5e2d18cfdd
commit 280432b0d1
2 changed files with 161 additions and 180 deletions

View File

@ -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;
}
}

View File

@ -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;