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:
parent
ba13f67289
commit
297150d24c
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user