diff --git a/sigma/sigma_bugs.txt b/sigma/sigma_bugs.txt index 7670884b..84236633 100644 --- a/sigma/sigma_bugs.txt +++ b/sigma/sigma_bugs.txt @@ -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 ---------------- diff --git a/sigma/sigma_coc.c b/sigma/sigma_coc.c index 97f4bf4b..ed8865bd 100644 --- a/sigma/sigma_coc.c +++ b/sigma/sigma_coc.c @@ -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 */