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

KA10: More changes to make Tops 20 happy.

This commit is contained in:
Richard Cornwell 2019-11-03 00:56:24 -04:00
parent 7015ff72bb
commit ec771f3398

View File

@ -235,6 +235,7 @@ struct _dte_queue {
uint16 dcnt; /* Data count */
uint16 data[256]; /* Data packet */
uint16 sdev; /* Secondary device code */
uint16 sz; /* Byte size */
} dte_in[32], dte_out[32];
int dte_in_ptr;
@ -476,10 +477,15 @@ sim_debug(DEBUG_CONO, &dte_dev, "CTY Ring 11 DB\n");
sim_debug(DEBUG_DATAIO, &dte_dev, "CTY %03o DATAI %06o\n", dev, (uint32)*data);
break;
case DATAO:
sim_debug(DEBUG_DATAIO, &dte_dev, "CTY %03o DATAO %06o\n", dev, (uint32)*data);
if (*data == 01365) {
dte_unit[0].STATUS |= DTE_SEC|DTE_10ER;
dte_unit[0].STATUS &= ~(DTE_10DB);
break;
}
dte_unit[0].CNT = (*data & (DTE_TO10IB|DTE_TO10BC));
dte_unit[0].STATUS |= DTE_TO11;
sim_activate(&dte_unit[0], 10);
sim_debug(DEBUG_DATAIO, &dte_dev, "CTY %03o DATAO %06o\n", dev, (uint32)*data);
break;
}
return SCPE_OK;
@ -671,7 +677,7 @@ void dte_its(UNIT *uptr) {
cty_out.in_ptr = (cty_out.in_ptr + 1) & 0xff;
cnt--;
if (! sim_is_active(&dte_unit[1]))
sim_activate(&dte_unit[1], 100);
sim_activate(&dte_unit[1], 50);
#if (NUM_DEVS_TTY > 0)
} else {
struct _buffer *otty = &tty_out[ln];
@ -745,7 +751,6 @@ error:
#endif
base = eb_ptr;
#endif
fprintf(stderr, "DTE going to secondary %012llo error\n\r", word);
/* If we can't read it, go back to secondary */
M[SEC_DTFLG + base] = FMASK;
uptr->STATUS |= DTE_SEC;
@ -758,7 +763,6 @@ fprintf(stderr, "DTE going to secondary %012llo error\n\r", word);
}
if ((word & PRI_CMT_QP) == 0) {
fprintf(stderr, "DTE going to secondary %012llo No QP\n\r", word);
goto error;
}
in = &dte_in[dte_in_ptr];
@ -776,19 +780,24 @@ fprintf(stderr, "DTE going to secondary %012llo No QP\n\r", word);
in->dcnt = (uint16)(iword & 0177777);
/* Read in data */
dp = &in->data[0];
for (cnt = in->dcnt; cnt >= 0; cnt -=2) {
for (cnt = in->dcnt; cnt >= 0; cnt --) {
/* Read in data */
if (!Mem_read_byte(0, dp, 0))
s = Mem_read_byte(0, dp, 0);
if (s == 0)
goto error;
in->sz = s;
sim_debug(DEBUG_DATA, &dte_dev, "DTE: Read Idata: %06o %03o %03o %06o\n",
*dp, *dp >> 8, *dp & 0377, ((*dp & 0377) << 8) | ((*dp >> 8) & 0377));
dp++;
if (s <= 8)
cnt--;
}
uptr->STATUS &= ~DTE_IND;
dte_in_ptr = (dte_in_ptr + 1) & 0x1f;
} else {
/* Transfer from 10 */
in->dptr = 0;
in->dcnt = 0;
/* Read in count */
if (!Mem_read_byte(0, &data1, 0))
goto error;
@ -817,6 +826,7 @@ fprintf(stderr, "DTE going to secondary %012llo No QP\n\r", word);
sim_debug(DEBUG_DATA, &dte_dev, "DTE: Read data: %06o %03o %03o\n",
*dp, *dp >> 8, *dp & 0377);
dp++;
in->dcnt += 2;
}
if (in->func & PRI_IND_FLG) {
uptr->STATUS |= DTE_IND;
@ -870,7 +880,7 @@ dte_function(UNIT *uptr)
return;
#endif
data1[0] = 0;
if (dte_queue(PRI_EMAKA, PRI_EMCLK, 0, data1) == 0)
if (dte_queue(PRI_EMAKA, PRI_EMCLK, 1, data1) == 0)
return;
break;
@ -935,6 +945,8 @@ dte_function(UNIT *uptr)
if (ln > 0 && ln >= tty_desc.lines)
break;
otty = &tty_out[ln];
if (cmd->sz > 8)
cmd->dcnt += cmd->dcnt;
while (cmd->dptr < cmd->dcnt) {
if (((otty->in_ptr + 1) & 0xff) == otty->out_ptr)
return;
@ -942,9 +954,11 @@ dte_function(UNIT *uptr)
if ((cmd->dptr & 1) == 0)
ch >>= 8;
ch &= 0177;
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;
if (ch != 0) {
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++;
}
if (cmd->dptr != cmd->dcnt)
@ -959,6 +973,8 @@ dte_function(UNIT *uptr)
cty:
sim_activate(&dte_unit[1], 100);
data1[0] = 0;
if (cmd->sz > 8)
cmd->dcnt += cmd->dcnt;
while (cmd->dptr < cmd->dcnt) {
if (((cty_out.in_ptr + 1) & 0xff) == cty_out.out_ptr)
return;
@ -966,10 +982,12 @@ cty:
if ((cmd->dptr & 1) == 0)
ch >>= 8;
ch &= 0177;
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;
if (ch != 0) {
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;
}
cmd->dptr++;
}
if (cmd->dptr != cmd->dcnt)
@ -977,8 +995,28 @@ cty:
break;
case PRI_EMLNC: /* Line-Char */
/* Send by DTE only? */
if (cmd->dev == PRI_EMDLS) {
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) {
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;
}
cmd->dptr+=2;
}
if (cmd->dptr != cmd->dcnt)
return;
}
break;
case PRI_EMRDS: /* Request device status */
#if (NUM_DEVS_LP > 0)
if (cmd->dev == PRI_EMLPT) {