1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-13 15:27:04 +00:00

KA10: Changes to KL10B, Tops 20 printer support started.

This commit is contained in:
Richard Cornwell 2019-11-13 20:38:16 -05:00
parent ba13f67289
commit 297150d24c
4 changed files with 121 additions and 55 deletions

View File

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

View File

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

View File

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

View File

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