diff --git a/PDP10/kl10_fe.c b/PDP10/kl10_fe.c index a47d52c..006374b 100644 --- a/PDP10/kl10_fe.c +++ b/PDP10/kl10_fe.c @@ -320,6 +320,7 @@ t_stat lpt_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *lpt_description (DEVICE *dptr); char lpt_buffer[134 * 3]; +uint16 lpt_vfu[256]; struct _buffer lpt_queue; @@ -992,16 +993,26 @@ cty: sim_activate(&dte_unit[1], 100); while (cmd->dptr < cmd->dcnt) { int ln; - if (((cty_out.in_ptr + 1) & 0xff) == cty_out.out_ptr) - return; ch = (int32)(cmd->data[cmd->dptr >> 1]); ln = (ch >> 8); ch &= 0177; if (ch != 0 && ln == 0) { + if (((cty_out.in_ptr + 1) & 0xff) == cty_out.out_ptr) + return; sim_debug(DEBUG_DETAIL, &dte_dev, "CTY queue %o\n", ch); ch = sim_tt_outcvt( ch, TT_GET_MODE(uptr->flags)); cty_out.buff[cty_out.in_ptr] = (char)(ch & 0xff); cty_out.in_ptr = (cty_out.in_ptr + 1) & 0xff; + } else + if (ch != 0 && ln >= 2 && ln <= tty_desc.lines) { + struct _buffer *otty; + ln -= 2; + otty = &tty_out[ln]; + if (((otty->in_ptr + 1) & 0xff) == otty->out_ptr) + return; + sim_debug(DEBUG_DETAIL, &dte_dev, "TTY queue %o %d\n", ch, ln); + otty->buff[otty->in_ptr] = ch; + otty->in_ptr = (otty->in_ptr + 1) & 0xff; } cmd->dptr+=2; } @@ -1014,18 +1025,24 @@ cty: #if (NUM_DEVS_LP > 0) if (cmd->dev == PRI_EMLPT) { data1[0] = 0; - if (dte_queue(PRI_EMHDS, PRI_EMLPT, 1, data1) == 0) +// if (cmd->data[0] != 0) + // data1[0] = 2; + data1[1] = (lpt_unit.LINE == 0) ? 0x1: 0; + data1[2] = 0100220; + if (dte_queue(PRI_EMHDS+PRI_IND_FLG, PRI_EMLPT, 5, data1) == 0) return; } #endif if (cmd->dev == PRI_EMCTY) { data1[0] = 0; - if (dte_queue(PRI_EMHDS, PRI_EMCTY, 1, data1) == 0) + data1[1] = 0; + if (dte_queue(PRI_EMHDS+PRI_IND_FLG, PRI_EMCTY, 2, data1) == 0) return; } if (cmd->dev == PRI_EMDH1) { data1[0] = 0; - if (dte_queue(PRI_EMHDS, PRI_EMDH1, 1, data1) == 0) + data1[1] = 0; + if (dte_queue(PRI_EMHDS+PRI_IND_FLG, PRI_EMDH1, 2, data1) == 0) return; } break; @@ -1033,6 +1050,15 @@ cty: case PRI_EMHDS: /* Here is device status */ break; + case PRI_EMLDV: /* Load LP VFU */ + if (cmd->dev == PRI_EMLPT) { + int ln = 0; + while (cmd->dptr < cmd->dcnt) { + lpt_vfu[ln++] = cmd->data[cmd->dptr++]; + } + } + break; + #if (NUM_DEVS_TTY > 0) case PRI_EMFLO: /* Flush output */ if ((cmd->dev & 0377) == PRI_EMDLS) { @@ -1089,7 +1115,6 @@ cty: break; #endif case PRI_EMLDR: /* Load LP RAM */ - case PRI_EMLDV: /* Load LP VFU */ default: break; } @@ -1135,8 +1160,8 @@ void dte_transfer(UNIT *uptr) { } uptr->STATUS &= ~DTE_SIND; } else { - sim_debug(DEBUG_DATA, &dte_dev, "DTE: %d %d send CMD: %o %o %o\n", - dte_out_ptr, dte_out_res, out->cnt, out->func, out->dev); + sim_debug(DEBUG_DATA, &dte_dev, "DTE: %d %d send CMD: [%o] %o %o %o\n", + dte_out_ptr, dte_out_res, scnt, out->cnt, out->func, out->dev); /* Get size of packet */ cnt = out->cnt; if ((out->func & PRI_IND_FLG) == 0) @@ -1368,9 +1393,10 @@ dte_queue(int func, int dev, int dcnt, uint16 *data) out->func = func; out->dev = dev; out->dcnt = (dcnt-1)*2; +// out->dcnt = dcnt*2; out->spare = 0; - sim_debug(DEBUG_DATA, &dte_dev, "DTE: %d %d queue resp: %o %o %s %o\n", - dte_out_ptr, dte_out_res, out->cnt, out->func, + sim_debug(DEBUG_DATA, &dte_dev, "DTE: %d %d queue resp: %o (%o) f=%o %s d=%o\n", + dte_out_ptr, dte_out_res, out->cnt, out->dcnt, out->func, (out->func > PRI_EMLDV)? "***":pri_name[out->func], out->dev); for (dp = &out->data[0]; dcnt > 0; dcnt--) { *dp++ = *data++; @@ -1407,6 +1433,7 @@ error: } /* Bump count of messages sent */ word = (word & ~(PRI_CMT_10IC|PRI_CMT_IP)) | ((word + 0400) & PRI_CMT_10IC); + word &= ~PRI_CMT_FWD; if ((uptr->STATUS & DTE_SIND) != 0) word |= PRI_CMT_IP; if (Mem_deposit_word(0, dte_dt10_off + PRI_CMTW_STS, &word)) @@ -1415,10 +1442,11 @@ error: if ((dte_out[dte_out_ptr].func & PRI_IND_FLG) == 0) dcnt += dte_out[dte_out_ptr].dcnt; /* Tell 10 something is ready */ - word = (uint64)dcnt; if ((uptr->STATUS & DTE_SIND) != 0) { - word = (uint64)(dte_out[dte_out_ptr].dcnt); + dcnt = dte_out[dte_out_ptr].dcnt; } + sim_debug(DEBUG_DATA, &dte_dev, "DTE: start: %012llo %o\n", word, dcnt); + word = (uint64)dcnt; if (Mem_deposit_word(0, dte_dt10_off + PRI_CMTW_CNT, &word)) goto error; uptr->STATUS |= DTE_10DB; @@ -1711,7 +1739,7 @@ lpt_output(UNIT *uptr, char c) { t_stat lpt_svc (UNIT *uptr) { char c; - uint16 data1 = 0; + uint16 data1[5]; if ((uptr->flags & UNIT_ATT) == 0) return SCPE_OK; @@ -1781,7 +1809,15 @@ t_stat lpt_svc (UNIT *uptr) lpt_output(uptr, c); } } - if (dte_queue(PRI_EMACK, PRI_EMLPT, 1, &data1) == 0) +// data1[0] = 0; + if (uptr->LINE == 0) { + data1[0] = 0; + data1[1] = (lpt_unit.LINE == 0) ? 0x1: 0; + data1[2] = 0100220; + if (dte_queue(PRI_EMHDS+PRI_IND_FLG, PRI_EMLPT, 5, data1) == 0) + sim_activate(uptr, 1000); + } + if (dte_queue(PRI_EMACK, PRI_EMLPT, 1, data1) == 0) sim_activate(uptr, 1000); return SCPE_OK; } diff --git a/PDP10/kx10_cpu.c b/PDP10/kx10_cpu.c index 362a1a3..e959817 100644 --- a/PDP10/kx10_cpu.c +++ b/PDP10/kx10_cpu.c @@ -1276,9 +1276,7 @@ t_stat dev_pag(uint32 dev, uint64 *data) { case DATAO: if (dev & 040) { /* CLRPT */ - int upmp = 0; int page = (RMASK & AB) >> 9; - int uf = (FLAGS & USER) != 0; int i; page &= ~7; @@ -1291,7 +1289,6 @@ t_stat dev_pag(uint32 dev, uint64 *data) { if (!t20_page && (page & 0740) == 0340) { /* Pages 340-377 via UBT */ page += 01000 - 0340; - upmp = 1; for(i = 0; i < 8; i++) u_tlb[page+i] = 0; } @@ -2070,7 +2067,7 @@ load_tlb(int uf, int page, int upmp, int wr, int trap, int flag) int base = 0540; #endif -//fprintf(stderr, "Lookup Page %o %03o %0o upmp=%o u=%o w=%o %06o\r\n", sect, page, t20_page, upmp, uf, AB); +//fprintf(stderr, "Lookup Page %o %03o upmp=%o u=%o w=%o %06o\r\n", sect, page, upmp, uf, wr, AB); /* Get segment pointer */ /* And save it */ #if KLB @@ -2111,6 +2108,7 @@ sect_loop: index = (data >> 18) & PG_IDX; sim_interval--; data = M[(data & RMASK) + spt]; +//fprintf(stderr, "IMap1 %012llo %o %o %o\n\r", data, pg << 9, index, page); if (((data >> 18) & PG_STG) != 0) { fault_data = 0; page_fault = 1; @@ -2121,7 +2119,7 @@ sect_loop: sim_interval--; cst_val = M[cst + pg]; if ((cst_val & PG_AGE) == 0) { -//fprintf(stderr, "ZMap %012llo %012llo age\n\r", data, cst_val); +//fprintf(stderr, "ZMap1 %012llo %012llo age\n\r", data, cst_val); if (trap) { fault_data = 0; page_fault = 1; @@ -2132,6 +2130,7 @@ sect_loop: } sim_interval--; data = M[(pg << 9) | index]; +//fprintf(stderr, "JMap1 %012llo %o %o %o\n\r", data, pg << 9, index, page); goto sect_loop; } if (((data >> 18) & PG_STG) != 0) { @@ -2187,7 +2186,7 @@ pg_loop: index = (data >> 18) & PG_IDX; sim_interval--; data = M[(data & RMASK) + spt]; -//fprintf(stderr, "IMap %012llo %o %o %o\n\r", data, pg << 9, index, page); +//fprintf(stderr, "IMap2 %012llo %o %o %o\n\r", data, pg << 9, index, page); if (((data >> 18) & PG_STG) != 0) { fault_data = 0; page_fault = 1; @@ -2197,7 +2196,7 @@ pg_loop: if (cst) { sim_interval--; cst_val = M[cst + pg]; -//fprintf(stderr, "ZMap %08o %012llo %012llo age\n\r", cst + pg, data, cst_val); +//fprintf(stderr, "ZMap2 %08o %012llo %012llo age\n\r", cst + pg, data, cst_val); if ((cst_val & PG_AGE) == 0) { if (trap) { fault_data = 0; @@ -2215,7 +2214,13 @@ pg_loop: /* Now have final page */ if ((data >> 18) & PG_STG) { - fault_data = 0; + fault_data = BIT2; /* BIT2 */ + if (acc_bits & PG_CAC) + fault_data |= BIT7; /* BIT7 */ + if (acc_bits & PG_PUB) + fault_data |= BIT6; /* BIT6 */ + if (acc_bits & PG_WRT) + fault_data |= BIT4; /* BIT4 */ page_fault = 1; return 0; } @@ -2236,7 +2241,7 @@ pg_loop: if (acc_bits & PG_WRT) { if (wr) cst_val |= 1; - } else if (wr) { /* Trying to write and not writable */ + } else if (wr) { /* Trying to write and not writable */ //fprintf(stderr, "WMap %012llo %012llo age\n\r", data, cst_val); if (trap) { fault_data = 0 /* Write fault */; @@ -2455,7 +2460,11 @@ int page_lookup(t_addr addr, int flag, t_addr *loc, int wr, int cur_context, int (!fetch || !OP_PORTAL(M[*loc]))) { /* Handle public violation */ fault_data = ((uint64)addr) | 021LL << 30 | BIT8 |((uf)?SMASK:0); -//fprintf(stderr, "Public fault %012llo %06o %06o\n\r", fault_data, FLAGS << 5, PC); +#if KLB + if (QKLB && t20_page) + fault_data |= (((uint64)sect) << 18); +#endif +//fprintf(stderr, "Public fault %012llo %06o %06o %012llo\n\r", fault_data, FLAGS << 5, PC, data); page_fault = 1; return 0; } @@ -7305,6 +7314,10 @@ jrstf: | (prev_sect & 037) #endif ) & FMASK; + if ((FLAGS & USER) == 0) { + MB &= ~SMASK; + MB |= (FLAGS & PRV_PUB) ? SMASK : 0; + } if (uuo_cycle | pi_cycle) { FLAGS &= ~(USER|PUBLIC); /* Clear USER */ } @@ -7335,38 +7348,38 @@ jrstf: case 014: /* SFM */ #if KLB -// if (QKLB) { - MB = ((((uint64)FLAGS) << 23) | (uint64)(prev_sect & 037)) & FMASK; -//fprintf(stderr, "SFM %012llo\n\r", MB); - (void)Mem_write(0, 0); - goto last; - // } + MB = ((((uint64)FLAGS) << 23) | (uint64)(prev_sect & 037)) & FMASK; + if ((FLAGS & USER) == 0) { + MB &= ~SMASK; + MB |= (FLAGS & PRV_PUB) ? SMASK : 0; + } + (void)Mem_write(0, 0); + goto last; #endif - // goto muuo; case 003: /* Invalid */ case 011: /* Invalid */ case 013: /* Invalid */ case 016: /* Invalid */ - goto muuo; + goto muuo; case 004: /* HALT */ - if ((FLAGS & (USER|USERIO)) == USER || - (FLAGS & (USER|PUBLIC)) == PUBLIC) { - goto muuo; - } else { - reason = STOP_HALT; - } - break; + if ((FLAGS & (USER|USERIO)) == USER || + (FLAGS & (USER|PUBLIC)) == PUBLIC) { + goto muuo; + } else { + reason = STOP_HALT; + } + break; case 010: /* JEN */ - /* Restore interrupt level. */ - if ((FLAGS & (USER|USERIO)) == USER || - (FLAGS & (USER|PUBLIC)) == PUBLIC) { - goto muuo; - } else { - pi_restore = 1; - } - break; + /* Restore interrupt level. */ + if ((FLAGS & (USER|USERIO)) == USER || + (FLAGS & (USER|PUBLIC)) == PUBLIC) { + goto muuo; + } else { + pi_restore = 1; + } + break; } #if KL_ITS if (QITS && (FLAGS & USER)) { @@ -7530,7 +7543,17 @@ jrstf: } /* Check if Paging Enabled */ - if (!page_enable || AB < 020) { + if (!page_enable) { + AR = AB; /* direct map */ + if (flag1) /* U */ + AR |= SMASK; /* BIT0 */ + AR |= BIT2|BIT3|BIT4|BIT8; + set_reg(AC, AR); + break; + } + + /* Check if access to register */ + if (AB < 020 && ((QKLB && (glb_sect == 0 || sect == 0 || (glb_sect && sect == 1))) || !QKLB)) { AR = AB; /* direct map */ if (flag1) /* U */ AR |= SMASK; /* BIT0 */ @@ -8790,9 +8813,6 @@ last: #endif return SCPE_STEP; } -//#if KL -// FLAGS &= ~ADRFLT; -//#endif } /* Should never get here */ #if ITS diff --git a/PDP10/kx10_rh.c b/PDP10/kx10_rh.c index 53f6cf5..06c52be 100644 --- a/PDP10/kx10_rh.c +++ b/PDP10/kx10_rh.c @@ -218,7 +218,6 @@ t_stat rh_devio(uint32 dev, uint64 *data) { rhc->dev_reset(dptr); rhc->attn = 0; rhc->imode = 2; - rhc->status = 0; } rhc->status &= ~(07LL|IADR_ATTN|RH20_MASS_EN); rhc->status |= *data & (07LL|IADR_ATTN|RH20_MASS_EN); @@ -651,6 +650,15 @@ void rh_setup(struct rh_if *rhc, uint32 addr) /* Fetch the next IO control word */ int rh_fetch(struct rh_if *rhc) { uint64 data; + int reg; + DEVICE *dptr; + + for (reg = 0; rh[reg].dev_num != 0; reg++) { + if (rh[reg].rh == rhc) { + dptr = rh[reg].dev; + break; + } + } #if KL if (rhc->imode == 2 && (rhc->cop & 2) != 0) { // rh_finish_op(rhc, 0); @@ -662,9 +670,9 @@ int rh_fetch(struct rh_if *rhc) { return 0; } data = M[rhc->ccw]; + sim_debug(DEBUG_EXP, dptr, "%s fetch %06o %012llo\n\r", dptr->name, rhc->ccw, data); #if KL if (rhc->imode == 2) { -//fprintf(stderr, "RH20 fetch %06o %012llo\n\r", rhc->ccw, data); while((data & RH20_XFER) == 0) { rhc->ccw = (uint32)(data & AMASK); if ((data & (BIT1|BIT2)) == 0) { @@ -676,6 +684,7 @@ int rh_fetch(struct rh_if *rhc) { return 0; } data = M[rhc->ccw]; + sim_debug(DEBUG_EXP, dptr, "%s fetch2 %06o %012llo\n\r", dptr->name, rhc->ccw, data); //fprintf(stderr, "RH20 fetch2 %06o %012llo\n\r", rhc->ccw, data); } rhc->wcr = (((data >> CSHIFT) & RH20_WMASK) ^ WMASK) + 1; @@ -696,6 +705,7 @@ int rh_fetch(struct rh_if *rhc) { return 0; } data = M[rhc->ccw]; + sim_debug(DEBUG_EXP, dptr, "%s fetch2 %06o %012llo\n\r", dptr->name, rhc->ccw, data); } rhc->wcr = (uint32)((data >> CSHIFT) & WMASK); rhc->cda = (uint32)(data & AMASK); diff --git a/PDP10/kx10_rp.c b/PDP10/kx10_rp.c index 5d25626..4dd7927 100644 --- a/PDP10/kx10_rp.c +++ b/PDP10/kx10_rp.c @@ -935,8 +935,8 @@ rd_end: uptr->hwmark = 0; } sts = rh_read(rhc); - sim_debug(DEBUG_DATA, dptr, "%s%o write word %d %012llo %06o\n", - dptr->name, unit, uptr->DATAPTR, rhc->buf, rhc->wcr); + 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)