1
0
mirror of https://github.com/simh/simh.git synced 2026-01-11 23:52:58 +00:00

sigma: COC device, handle transmit long, stop transmit and receive break

This commit is contained in:
Ken Rector 2022-09-04 17:56:46 -06:00 committed by Mark Pizzolato
parent 07a03009e5
commit eedda918bf
2 changed files with 54 additions and 20 deletions

View File

@ -124,7 +124,9 @@
118. MT: revised error handling failed to set tape mark status on space file forward/reverse.
119. IO: UEND flag in the wrong bit position in status word.
120. DP: SEEK(I), RECAL(I) must be coded as fast operations.
121. COC: Transmit long space is 0x6, and stop transmit is 0xE.
122. COC: Received break generates a data-in channel transaction with a flag bit set
in the line number.
Diagnostic Notes
----------------

View File

@ -24,6 +24,8 @@
in this Software without prior written authorization from Robert M Supnik.
coc 7611 communications multiplexor
24-Aug-22 RMS Transmit long space is 0x6, not 0xD (Ken Rector)
*/
#include "sigma_io_defs.h"
@ -305,7 +307,28 @@ switch (op) { /* case on op */
return 0;
}
/* MUX: DIO dispatch routine */
/* MUX: DIO dispatch routine
Although only 9 of 16 function codes are documented, schematics
indicate that there are don't cares in decoding.
0000 sense receiver status
0001 turn receiver on
0010 turn receiver off
0011 turn receiver DSR off
0100 sense transmitter status
0101 transmit character
0110 transmit long space (based on software)
0111 turn transmitter DSR off
1000 unused (equivalent to 0000)
1001 unused
1010 unused
1011 unused
1100 unused (equivalent to 0100)
1101 transmit long space (in documentation; not correct)
1110 turn transmitter off
1111 unused
*/
uint32 mux_dio (uint32 op, uint32 rn, uint32 ad)
{
@ -321,27 +344,30 @@ if (op == OP_RD) { /* read direct */
return 0;
}
ln = MUXDAT_GETLIN (R[rn]); /* get line num */
if (fnc & 0x4) { /* transmit */
if ((fnc & 0x4) != 0) { /* transmit */
if ((coc != 0) || /* nx COC or */
(ln >= MUX_NUMLIN)) { /* nx line? */
CC |= CC4;
return 0;
}
if ((fnc & 0x7) == 0x5) { /* send char? */
if (fnc & 0x8) /* space? */
mux_xbuf[ln] = 0;
else mux_xbuf[ln] = MUXDAT_GETCHR (R[rn]); /* no, get char */
switch (fnc) { /* case on fnc */
case 0x5: case 0x6: /* xmit, xmit long space */
if (fnc == 0x5) /* send char? */
mux_xbuf[ln] = MUXDAT_GETCHR (R[rn]); /* get char */
else mux_xbuf[ln] = 0; /* just space */
sim_activate (&muxl_unit[ln], muxl_unit[ln].wait);
mux_sta[ln] = (mux_sta[ln] | MUXL_XIA) & ~MUXL_XIR;
mux_scan_next (1); /* unlock scanner */
}
else if (fnc == 0x06) { /* stop transmit */
break;
case 0xE: /* stop transmit */
mux_sta[ln] &= ~MUXL_XIA|MUXL_XIR; /* disable int */
mux_scan_next (1); /* unlock scanner */
}
else if (fnc == 0x07) { /* disconnect */
break;
case 0x7: /* disconnect */
tmxr_reset_ln (&mux_ldsc[ln]); /* reset line */
mux_reset_ln (ln); /* reset state */
default: /* fall through */
break;
}
CC = (sim_is_active (&muxl_unit[ln])? 0: CC4) |
(mux_ldsc[ln].conn? CC3: 0);
@ -350,18 +376,21 @@ else { /* receive */
if ((coc != 0) || /* nx COC or */
(ln >= MUX_NUMLIN)) /* nx line */
return 0;
if (fnc == 0x01) { /* set rcv enable */
switch (fnc) { /* case on fnc */
case 0x1: /* set rcv enable */
if (mux_ldsc[ln].conn) /* connected? */
mux_ldsc[ln].rcve = 1; /* just enable */
else mux_sta[ln] |= MUXL_REP; /* enable pending */
}
else if (fnc == 0x02) { /* clr rcv enable */
break;
case 0x2: /* clr rcv enable */
mux_ldsc[ln].rcve = 0;
mux_sta[ln] &= ~MUXL_REP;
}
else if (fnc == 0x03) { /* disconnect */
break;
case 0x3: /* disconnect */
tmxr_reset_ln (&mux_ldsc[ln]); /* reset line */
mux_reset_ln (ln); /* reset state */
default: /* fall through */
break;
}
if (mux_sta[ln] & MUXL_RBP) /* break pending? */
CC = CC3|CC4;
@ -418,16 +447,19 @@ tmxr_poll_rx (&mux_desc); /* poll for input */
for (ln = 0; ln < MUX_NUMLIN; ln++) { /* loop thru lines */
if (mux_ldsc[ln].conn) { /* connected? */
if ((c = tmxr_getc_ln (&mux_ldsc[ln]))) { /* get char */
if (c & SCPE_BREAK) /* break? */
if (c & SCPE_BREAK) { /* break? */
mux_sta[ln] |= MUXL_RBP; /* set rcv brk */
c = 0; /* space */
ln |= 0x80; /* break flag */
}
else { /* normal char */
mux_sta[ln] &= ~MUXL_RBP; /* clr rcv brk */
c = sim_tt_inpcvt (c, TT_GET_MODE (muxl_unit[ln].flags));
mux_rbuf[ln] = c; /* save char */
if ((muxc_cmd == MUXC_RCV) && /* chan active? */
(r = muxi_put_char (c, ln))) /* char to chan */
return r;
} /* end else char */
if ((muxc_cmd == MUXC_RCV) && /* chan active? */
(r = muxi_put_char (c, ln))) /* char to chan */
return r;
} /* end if char */
} /* end if conn */
else mux_sta[ln] &= ~MUXL_RBP; /* disconnected */