diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index 441e1201..4fd1e609 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -241,6 +241,7 @@ TMXR dz_desc = { DZ_MUXES * DZ_LINES, 0, 0, NULL }; /* mux descriptor */ #define DBG_INT 0x0002 /* display transfer requests */ #define DBG_XMT TMXR_DBG_XMT /* display Transmitted Data */ #define DBG_RCV TMXR_DBG_RCV /* display Received Data */ +#define DBG_MDM TMXR_DBG_MDM /* display Modem Signals */ #define DBG_TRC TMXR_DBG_TRC /* display trace routine calls */ #define DBG_ASY TMXR_DBG_ASY /* display Asynchronous Activities */ @@ -249,6 +250,7 @@ DEBTAB dz_debug[] = { {"INT", DBG_INT}, {"XMT", DBG_XMT}, {"RCV", DBG_RCV}, + {"MDM", DBG_MDM}, {"TRC", DBG_TRC}, {"ASY", DBG_ASY}, {0} @@ -641,6 +643,7 @@ void dz_set_rxint (int32 dz) { dz_rxi = dz_rxi | (1 << dz); /* set mux rcv int */ SET_INT (DZRX); /* set master intr */ +sim_debug(DBG_INT, &dz_dev, "dz_set_rxint(dz=%d)\n", dz); return; } @@ -671,6 +674,7 @@ void dz_set_txint (int32 dz) { dz_txi = dz_txi | (1 << dz); /* set mux xmt int */ SET_INT (DZTX); /* set master intr */ +sim_debug(DBG_INT, &dz_dev, "dz_set_txint(dz=%d)\n", dz); return; } @@ -778,8 +782,11 @@ return SCPE_OK; t_stat dz_detach (UNIT *uptr) { +t_stat r = tmxr_detach (&dz_desc, uptr); + dz_mctl = dz_auto = 0; /* modem ctl off */ -return tmxr_detach (&dz_desc, uptr); +tmxr_clear_modem_control_passthru (&dz_desc); +return r; } /* SET LINES processor */ diff --git a/scp.c b/scp.c index 853fad67..99ca6cd5 100644 --- a/scp.c +++ b/scp.c @@ -6641,7 +6641,7 @@ if (sim_deb && (dptr->dctrl & dbits)) { #endif /* NO_vsnprintf */ va_end (arglist); -/* If it didn't fit into the buffer, then grow it and try again */ +/* If the formatted result didn't fit into the buffer, then grow the buffer and try again */ if ((len < 0) || (len >= bufsize-1)) { if (buf != stackbuf) diff --git a/sim_tmxr.c b/sim_tmxr.c index 2cdf7b95..a0a5baf4 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -369,7 +369,15 @@ #define TNS_CRPAD 005 /* CR padding */ #define TNS_DO 006 /* DO request pending rejection */ - +static BITFIELD tmxr_modem_bits[] = { + BIT(DTR), /* Data Terminal Ready */ + BIT(RTS), /* Request To Send */ + BIT(DCD), /* Data Carrier Detect */ + BIT(RNG), /* Ring Indicator */ + BIT(CTS), /* Clear To Send */ + BIT(DSR), /* Data Set Ready */ + ENDBITS +}; /* Local routines */ @@ -1055,7 +1063,7 @@ return SCPE_OK; */ t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits) { -int32 changed_modem_bits; +int32 before_modem_bits, incoming_state; tmxr_debug_trace_line (lp, "tmxr_set_get_modem_bits()"); @@ -1063,20 +1071,24 @@ if ((bits_to_set & ~(TMXR_MDM_OUTGOING)) || /* Assure only settable bits (bits_to_clear & ~(TMXR_MDM_OUTGOING)) || (bits_to_set & bits_to_clear)) /* and can't set and clear the same bits */ return SCPE_ARG; -changed_modem_bits = lp->modembits; +before_modem_bits = lp->modembits; lp->modembits |= bits_to_set; -lp->modembits &= bits_to_clear; -changed_modem_bits ^= lp->modembits; -if (incoming_bits) { - if ((lp->sock) || (lp->serport)) { - if (lp->modembits & TMXR_MDM_DTR) - *incoming_bits = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR; - else - *incoming_bits = TMXR_MDM_RNG | TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR; - } +lp->modembits &= ~(bits_to_clear & TMXR_MDM_INCOMING); +if ((lp->sock) || (lp->serport)) { + if (lp->modembits & TMXR_MDM_DTR) + incoming_state = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR; else - *incoming_bits = (lp->mp && lp->mp->master) ? (TMXR_MDM_CTS | TMXR_MDM_DSR) : 0; + incoming_state = TMXR_MDM_RNG | TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR; } +else + incoming_state = (lp->mp && lp->mp->master) ? (TMXR_MDM_CTS | TMXR_MDM_DSR) : 0; +lp->modembits |= incoming_state; +if (sim_deb && lp->mp && lp->mp->dptr) { + sim_debug_bits (TMXR_DBG_MDM, lp->mp->dptr, tmxr_modem_bits, before_modem_bits, lp->modembits, FALSE); + sim_debug (TMXR_DBG_MDM, lp->mp->dptr, " - Line %d\n", (int)(lp-lp->mp->ldsc)); + } +if (incoming_bits) + *incoming_bits = incoming_state; if (lp->mp && lp->mp->modem_control) { /* This API ONLY works on modem_control enabled multiplexers */ if (bits_to_set | bits_to_clear) { /* Anything to do? */ if (lp->serport) @@ -2620,15 +2632,19 @@ else { fprintf(st, ", "); } tmxr_show_summ(st, NULL, 0, mp); - fprintf(st, ", sessions=%d\n", mp->sessions); + fprintf(st, ", sessions=%d", mp->sessions); + if (mp->modem_control) + fprintf(st, ", ModemControl=enabled"); + if (mp->notelnet) + fprintf(st, ", Telnet=disabled"); + fprintf(st, "\n"); for (j = 0; j < mp->lines; j++) { lp = mp->ldsc + j; if (mp->lines > 1) { fprintf (st, "Line: %d", j); if (lp->uptr && (lp->uptr != lp->mp->uptr)) - fprintf (st, " - Unit: %s\n", sim_uname (lp->uptr)); - else - fprintf (st, "\n"); + fprintf (st, " - Unit: %s", sim_uname (lp->uptr)); + fprintf (st, "\n"); } if ((!lp->sock) && (!lp->connecting) && (!lp->serport) && (!lp->master)) continue; @@ -2977,6 +2993,15 @@ if (lp->cnms) { else fprintf (st, " Line disconnected\n"); +if (lp->mp->modem_control) { + fprintf (st, " Modem Bits: %s%s%s%s%s%s\n", (lp->modembits & TMXR_MDM_DTR) ? "DTR " : "", + (lp->modembits & TMXR_MDM_RTS) ? "RTS " : "", + (lp->modembits & TMXR_MDM_DCD) ? "DCD " : "", + (lp->modembits & TMXR_MDM_RNG) ? "RNG " : "", + (lp->modembits & TMXR_MDM_CTS) ? "CTS " : "", + (lp->modembits & TMXR_MDM_DSR) ? "DSR " : ""); + } + if ((lp->serport == 0) && (lp->sock)) fprintf (st, " %s\n", (lp->notelnet) ? "Telnet disabled (RAW data)" : "Telnet protocol"); if (lp->txlog) diff --git a/sim_tmxr.h b/sim_tmxr.h index ea63bf15..ace37779 100644 --- a/sim_tmxr.h +++ b/sim_tmxr.h @@ -66,10 +66,11 @@ typedef int SERHANDLE; #define TMXR_DTR_DROP_TIME 500 /* milliseconds to drop DTR for 'pseudo' modem control */ #define TMXR_CONNECT_POLL_INTERVAL 1000 /* milliseconds between connection polls */ -#define TMXR_DBG_XMT 0x10000 /* Debug Transmit Data */ -#define TMXR_DBG_RCV 0x20000 /* Debug Received Data */ -#define TMXR_DBG_ASY 0x40000 /* Debug Asynchronous Activities */ -#define TMXR_DBG_TRC 0x80000 /* Debug trace routine calls */ +#define TMXR_DBG_XMT 0x010000 /* Debug Transmit Data */ +#define TMXR_DBG_RCV 0x020000 /* Debug Received Data */ +#define TMXR_DBG_MDM 0x040000 /* Debug Modem Signals */ +#define TMXR_DBG_ASY 0x080000 /* Debug Asynchronous Activities */ +#define TMXR_DBG_TRC 0x100000 /* Debug trace routine calls */ /* Modem Control Bits */