diff --git a/PDP10/kx10_cpu.c b/PDP10/kx10_cpu.c index 1357ec9..b460489 100644 --- a/PDP10/kx10_cpu.c +++ b/PDP10/kx10_cpu.c @@ -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; } } diff --git a/PDP10/kx10_rp.c b/PDP10/kx10_rp.c index 187173b..a7040d9 100644 --- a/PDP10/kx10_rp.c +++ b/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;