From f5ca960b823356280b5019ee3cbd7738288b19bf Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 13 Mar 2018 02:14:06 -0700 Subject: [PATCH] TMXR: Disable ATTACH speed for devices which program port speed --- PDP11/pdp11_dz.c | 1 + PDP11/pdp11_vh.c | 1 + doc/simh.doc | Bin 277504 -> 277504 bytes sim_tmxr.c | 224 ++++++++++++++++++++++++++++++++++++----------- sim_tmxr.h | 6 ++ 5 files changed, 179 insertions(+), 53 deletions(-) diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index dfe90f16..0a4fae3f 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -782,6 +782,7 @@ sim_debug(DBG_TRC, dptr, "dz_reset()\n"); if (dz_ldsc == NULL) dz_desc.ldsc = dz_ldsc = (TMLN *)calloc (dz_desc.lines, sizeof(*dz_ldsc)); +tmxr_set_port_speed_control (&dz_desc); for (i = 0; i < dz_desc.lines/DZ_LINES; i++) /* init muxes */ dz_clear (i, TRUE); dz_rxi = dz_txi = 0; /* clr master int */ diff --git a/PDP11/pdp11_vh.c b/PDP11/pdp11_vh.c index fa414310..8f03a70c 100644 --- a/PDP11/pdp11_vh.c +++ b/PDP11/pdp11_vh.c @@ -1523,6 +1523,7 @@ static t_stat vh_reset ( DEVICE *dptr ) { int32 i; + tmxr_set_port_speed_control (&vh_desc); if (vh_desc.lines > VH_MUXES*VH_LINES) vh_desc.lines = VH_MUXES*VH_LINES; for (i = 0; i < vh_desc.lines; i++) diff --git a/doc/simh.doc b/doc/simh.doc index eb35133762c0144ea04a132b537645b588395a5a..ca655372541360a80af6a674d8dfad3da92aab82 100644 GIT binary patch delta 36336 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 delta 36713 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 BW3B)I diff --git a/sim_tmxr.c b/sim_tmxr.c index 4897824e..ef59d75a 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -77,6 +77,10 @@ tmxr_send_buffered_data - transmit buffered data tmxr_set_modem_control_passthru - enable modem control on a multiplexer tmxr_clear_modem_control_passthru - disable modem control on a multiplexer + tmxr_set_port_speed_control - Declare that tmxr_set_config_line is used + tmxr_clear_port_speed_control - Declare that tmxr_set_config_line is not used + tmxr_set_line_port_speed_control - Declare that tmxr_set_config_line is used for line + tmxr_clear_line_port_speed_control - Declare that tmxr_set_config_line is not used for line tmxr_set_get_modem_bits - set and/or get a line modem bits tmxr_set_line_loopback - enable or disable loopback mode on a line tmxr_get_line_loopback - returns the current loopback status of a line @@ -1414,6 +1418,78 @@ t_stat tmxr_clear_modem_control_passthru (TMXR *mp) return tmxr_clear_modem_control_passthru_state (mp, FALSE); } +/* Declare that tmxr_set_config_line is used. + + This would best be called in a device reset routine and left set. + + If the device implementor wants to make this behavior a user option + we've got to reject the attempt to set or clear this mode if any + ports on the MUX are attached. +*/ +t_stat tmxr_set_port_speed_control (TMXR *mp) +{ +int i; + +if (mp->uptr && !(mp->uptr->flags & UNIT_ATT)) + return sim_messagef (SCPE_ALATT, "Can't change speed mode while attached.\n:"); +mp->port_speed_control = TRUE; +for (i=0; ilines; ++i) + mp->ldsc[i].port_speed_control = mp->port_speed_control; +return SCPE_OK; +} + +/* Declare that tmxr_set_config_line is not used. + + This should be only be called after a previous call to + tmxr_set_port_speed_control since the default is cleared. It can not + be called if any ports on the device are attached. +*/ +t_stat tmxr_clear_port_speed_control (TMXR *mp) +{ +int i; + +if (mp->uptr && !(mp->uptr->flags & UNIT_ATT)) + return sim_messagef (SCPE_ALATT, "Can't change speed mode while attached.\n:"); +mp->port_speed_control = FALSE; +for (i=0; ilines; ++i) + mp->ldsc[i].port_speed_control = mp->port_speed_control; +return SCPE_OK; +} + +/* Declare that tmxr_set_config_line is used for line. + + This would best be called in a device reset routine and left set. + + If the device implementor wants to make this behavior a user option + we've got to reject the attempt to set or clear this mode if any + ports on the MUX are attached. +*/ +t_stat tmxr_set_line_port_speed_control (TMXR *mp, int line) +{ +if (mp->uptr && !(mp->uptr->flags & UNIT_ATT)) + return sim_messagef (SCPE_ALATT, "Can't change speed mode while attached.\n:"); +if (line >= mp->lines) + return sim_messagef (SCPE_ARG, "Invalid line for multiplexer: %d\n", line); +mp->ldsc[line].port_speed_control = TRUE; +return SCPE_OK; +} + +/* Declare that tmxr_set_config_line is not used for line. + + This should be only be called after a previous call to + tmxr_set_port_speed_control since the default is cleared. It can not + be called if any ports on the device are attached. +*/ +t_stat tmxr_clear_line_port_speed_control (TMXR *mp, int line) +{ +if (mp->uptr && !(mp->uptr->flags & UNIT_ATT)) + return sim_messagef (SCPE_ALATT, "Can't change speed mode while attached.\n:"); +if (line >= mp->lines) + return sim_messagef (SCPE_ARG, "Invalid line for multiplexer: %d\n", line); +mp->ldsc[line].port_speed_control = FALSE; +return SCPE_OK; +} + /* Manipulate the modem control bits of a specific line Inputs: @@ -1633,7 +1709,7 @@ tmxr_debug_trace_line (lp, "tmxr_set_config_line()"); if (lp->serport) { r = sim_config_serial (lp->serport, config); if (r == SCPE_OK) - tmxr_set_line_speed (lp, config); + r = tmxr_set_line_speed (lp, config); } else { lp->serconfig = (char *)realloc (lp->serconfig, 1 + strlen (config)); @@ -2381,6 +2457,8 @@ if (*cptr == '*') { return r; lp->rxbpsfactor = TMXR_RX_BPS_UNIT_SCALE * rxbpsfactor; } +if ((lp->serport) && (lp->rxbpsfactor != 0.0)) + lp->rxbpsfactor = TMXR_RX_BPS_UNIT_SCALE; lp->rxdelta = _tmln_speed_delta (speed); lp->rxnexttime = 0.0; uptr = lp->uptr; @@ -2414,7 +2492,7 @@ t_stat tmxr_open_master (TMXR *mp, CONST char *cptr) int32 i, line, nextline = -1; char tbuf[CBUFSIZE], listen[CBUFSIZE], destination[CBUFSIZE], logfiletmpl[CBUFSIZE], buffered[CBUFSIZE], hostport[CBUFSIZE], - port[CBUFSIZE], option[CBUFSIZE], speed[CBUFSIZE]; + port[CBUFSIZE], option[CBUFSIZE], speed[CBUFSIZE], dev_name[CBUFSIZE]; SOCKET sock; SERHANDLE serport; CONST char *tptr = cptr; @@ -2422,6 +2500,7 @@ t_bool nolog, notelnet, listennotelnet, modem_control, loopback, datagram, packe TMLN *lp; t_stat r = SCPE_OK; +snprintf (dev_name, sizeof(dev_name), "%s%s", mp->uptr ? sim_dname (find_dev_from_unit (mp->uptr)) : "", mp->uptr ? " " : ""); if (*tptr == '\0') return SCPE_ARG; for (i = 0; i < mp->lines; i++) { /* initialize lines */ @@ -2547,6 +2626,8 @@ while (*tptr) { if ((NULL == cptr) || ('\0' == *cptr) || (_tmln_speed_delta (cptr) < 0)) return sim_messagef (SCPE_ARG, "Invalid Speed Specifier: %s\n", (cptr ? cptr : "")); + if (mp->port_speed_control && (_tmln_speed_delta (cptr) > 0) && (!(sim_switches & SIM_SW_REST))) + return sim_messagef (SCPE_ARG, "%s simulator programmatically sets %sport speed\n", sim_name, dev_name); strlcpy (speed, cptr, sizeof(speed)); continue; } @@ -3692,10 +3773,10 @@ int32 i; if (mp->dptr == NULL) /* has device been set? */ mp->dptr = find_dev_from_unit (uptr); /* no, so set device now */ +mp->uptr = uptr; /* save unit for polling */ r = tmxr_open_master (mp, cptr); /* open master socket */ if (r != SCPE_OK) /* error? */ return r; -mp->uptr = uptr; /* save unit for polling */ uptr->filename = tmxr_mux_attach_string (uptr->filename, mp);/* save */ uptr->flags = uptr->flags | UNIT_ATT; /* no more errors */ uptr->tmxr = (void *)mp; @@ -4071,9 +4152,14 @@ t_stat tmxr_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const ch { TMXR *mux = (TMXR *)dptr->help_ctx; t_bool single_line = FALSE; /* default to Multi-Line help */ +t_bool port_speed_control = FALSE; +t_bool modem_control = FALSE; -if (mux) - single_line = (mux->lines == 1); +if (mux) { + single_line = (mux->lines == 1); + port_speed_control = mux->port_speed_control; + modem_control = mux->modem_control; + } if (!flag) fprintf (st, "%s Multiplexer Attach Help\n\n", dptr->name); @@ -4081,7 +4167,7 @@ if (single_line) { /* Single Line Multiplexer */ fprintf (st, "The %s multiplexer may be connected to terminal emulators supporting the\n", dptr->name); fprintf (st, "Telnet protocol via sockets, or to hardware terminals via host serial\n"); fprintf (st, "ports.\n\n"); - if (mux->modem_control) { + if (modem_control) { fprintf (st, "The %s device is a full modem control device and therefore is capable of\n", dptr->name); fprintf (st, "passing port configuration information and modem signals.\n"); } @@ -4103,7 +4189,7 @@ else { fprintf (st, "Telnet protocol via sockets, or to hardware terminals via host serial\n"); fprintf (st, "ports. Concurrent Telnet and serial connections may be mixed on a given\n"); fprintf (st, "multiplexer.\n\n"); - if (mux && mux->modem_control) { + if (modem_control) { fprintf (st, "The %s device is a full modem control device and therefore is capable of\n", dptr->name); fprintf (st, "passing port configuration information and modem signals on all lines.\n"); } @@ -4154,56 +4240,88 @@ else { fprintf (st, "Valid line numbers are from 0 thru %d\n\n", mux->lines-1); } if (single_line) { /* Single Line Multiplexer */ - fprintf (st, "The input data rate for the %s device can be controlled by\n", dptr->name); - fprintf (st, "specifying SPEED=nnn{*fac} on the the ATTACH command.\n"); + if (port_speed_control) { + fprintf (st, "The data rate for the %s device is set programmatically within\n", dptr->name); + fprintf (st, "the running simulator. When connected via a telnet session, a\n"); + fprintf (st, "speed increase factor can be specified with a SPEED=*factor on\n"); + fprintf (st, "the ATTACH command.\n"); + } + else { + fprintf (st, "The data rate for the %s device can be controlled by\n", dptr->name); + fprintf (st, "specifying SPEED=nnn{*factor} on the the ATTACH command.\n"); + } } else { - fprintf (st, "The input data rate for all lines or a particular line of a the %s\n", dptr->name); - fprintf (st, "device can be controlled by specifying SPEED=nnn{*fac} on the ATTACH command.\n"); + if (port_speed_control) { + fprintf (st, "The data rates for the lines of the %s device are set\n", dptr->name); + fprintf (st, "programmatically within the running simulator. When connected\n"); + fprintf (st, "via telnet sessions, a speed increase factor can be specified with\n"); + fprintf (st, "a SPEED=*factor on the ATTACH command.\n"); + } + else { + fprintf (st, "The data rate for all lines or a particular line of a the %s\n", dptr->name); + fprintf (st, "device can be controlled by specifying SPEED=nnn{*fac} on the ATTACH\n"); + fprintf (st, "command.\n"); + } + } +if (!port_speed_control) { + fprintf (st, "SPEED values can be any one of:\n\n"); + fprintf (st, " 0 50 75 110 134 150 300 600 1200 1800 2000 2400\n"); + fprintf (st, " 3600 4800 7200 9600 19200 38400 57600 76800 115200\n\n"); + fprintf (st, "A SPEED value of 0 causes input data to be delivered to the simulated\n"); + fprintf (st, "port as fast as it arrives.\n\n"); + } +else { + fprintf (st, "\n"); } -fprintf (st, "SPEED values can be any one of:\n\n"); -fprintf (st, " 0 50 75 110 134 150 300 600 1200 1800 2000 2400\n"); -fprintf (st, " 3600 4800 7200 9600 19200 38400 57600 76800 115200\n\n"); -fprintf (st, "A SPEED value of 0 causes input data to be delivered to the simulated\n"); -fprintf (st, "port as fast as it arrives.\n\n"); -fprintf (st, "If a simulated multiplexor devices can programmatically set a serial\n"); -fprintf (st, "port line speed, the programmatically specified speed will take precidence\n"); -fprintf (st, "over any input speed specified on an attach command.\n"); fprintf (st, "Some simulated systems run very much faster than the original system\n"); -fprintf (st, "which is being simulated. To accommodate this, the speed specified may\n"); -fprintf (st, "include a factor which will increase the input data delivery rate by\n"); -fprintf (st, "the specified factor. A factor is specified with a speed value of the\n"); -fprintf (st, "form \"speed*factor\". Factor values can range from 1 thru 32.\n"); -fprintf (st, "Example:\n\n"); -fprintf (st, " sim> ATTACH %s 1234,SPEED=2400\n", dptr->name); -fprintf (st, " sim> ATTACH %s 1234,SPEED=9600*8\n", dptr->name); -if (!single_line) - fprintf (st, " sim> ATTACH %s Line=2,SPEED=2400\n", dptr->name); -fprintf (st, "\n"); -fprintf (st, "The SPEED parameter only influences the rate at which data is deliverd\n"); -fprintf (st, "into the simulated multiplexor port. Output data rates are unaffected\n"); -fprintf (st, "If an attach command specifies a speed multiply factor, that value will\n"); -fprintf (st, "persist independent of any programatic action by the simulated system to\n"); -fprintf (st, "change the port speed.\n\n"); -fprintf (st, "An optional serial port configuration string may be present after the port\n"); -fprintf (st, "name. If present, it must be separated from the port name with a semicolon\n"); -fprintf (st, "and has this form:\n\n"); -fprintf (st, " -\n\n"); -fprintf (st, "where:\n"); -fprintf (st, " rate = communication rate in bits per second\n"); -fprintf (st, " charsize = character size in bits (5-8, including optional parity)\n"); -fprintf (st, " parity = parity designator (N/E/O/M/S for no/even/odd/mark/space parity)\n"); -fprintf (st, " stopbits = number of stop bits (1, 1.5, or 2)\n\n"); -fprintf (st, "As an example:\n\n"); -fprintf (st, " 9600-8n1\n\n"); -fprintf (st, "The supported rates, sizes, and parity options are host-specific. If\n"); -fprintf (st, "a configuration string is not supplied, then the default of 9600-8N1\n"); -fprintf (st, "is used.\n"); -fprintf (st, "Note: The serial port configuration option is only available on multiplexer\n"); -fprintf (st, " lines which are not operating with full modem control behaviors enabled.\n"); -fprintf (st, " Lines with full modem control behaviors enabled have all of their\n"); -fprintf (st, " configuration managed by the Operating System running within the\n"); -fprintf (st, " simulator.\n\n"); +fprintf (st, "which is being simulated. To accommodate this, multiplexer lines \n"); +fprintf (st, "connected via telnet sessions may include a factor which will increase\n"); +fprintf (st, "the input and output data delivery rates by the specified factor.\n"); +fprintf (st, "A factor is specified with a speed "); +if (!port_speed_control) { + fprintf (st, "value of the form \"speed*factor\"\n"); + fprintf (st, "Factor values can range from 1 thru 32.\n"); + fprintf (st, "Example:\n\n"); + fprintf (st, " sim> ATTACH %s 1234,SPEED=2400\n", dptr->name); + fprintf (st, " sim> ATTACH %s 1234,SPEED=9600*8\n", dptr->name); + if (!single_line) + fprintf (st, " sim> ATTACH %s Line=2,SPEED=2400\n", dptr->name); + fprintf (st, "\n"); + } +else { + fprintf (st, "value of the form \"*factor\"\n"); + fprintf (st, "Factor values can range from 1 thru 32.\n"); + fprintf (st, "Example:\n\n"); + fprintf (st, " sim> ATTACH %s 1234,SPEED=*8\n", dptr->name); + if (!single_line) + fprintf (st, " sim> ATTACH %s Line=2,SPEED=*4\n", dptr->name); + fprintf (st, "\n"); + fprintf (st, "If an attach command specifies a speed multiply factor, that value will\n"); + fprintf (st, "persist independent of any programatic action by the simulated system to\n"); + fprintf (st, "change the port speed.\n\n"); + } +if (!port_speed_control) { + fprintf (st, "An optional serial port configuration string may be present after the port\n"); + fprintf (st, "name. If present, it must be separated from the port name with a semicolon\n"); + fprintf (st, "and has this form:\n\n"); + fprintf (st, " -\n\n"); + fprintf (st, "where:\n"); + fprintf (st, " rate = communication rate in bits per second\n"); + fprintf (st, " charsize = character size in bits (5-8, including optional parity)\n"); + fprintf (st, " parity = parity designator (N/E/O/M/S for no/even/odd/mark/space parity)\n"); + fprintf (st, " stopbits = number of stop bits (1, 1.5, or 2)\n\n"); + fprintf (st, "As an example:\n\n"); + fprintf (st, " 9600-8n1\n\n"); + fprintf (st, "The supported rates, sizes, and parity options are host-specific. If\n"); + fprintf (st, "a configuration string is not supplied, then the default of 9600-8N1\n"); + fprintf (st, "is used.\n"); + fprintf (st, "Note: The serial port configuration option is only available on multiplexer\n"); + fprintf (st, " lines which are not operating with full modem control behaviors enabled.\n"); + fprintf (st, " Lines with full modem control behaviors enabled have all of their\n"); + fprintf (st, " configuration managed by the Operating System running within the\n"); + fprintf (st, " simulator.\n\n"); + } fprintf (st, "An attachment to a serial port with the '-V' switch will cause a\n"); fprintf (st, "connection message to be output to the connected serial port.\n"); fprintf (st, "This will help to confirm the correct port has been connected and\n"); diff --git a/sim_tmxr.h b/sim_tmxr.h index e7597f19..6756e3e8 100644 --- a/sim_tmxr.h +++ b/sim_tmxr.h @@ -157,6 +157,7 @@ struct tmln { int32 txbsz; /* xmt buffer size */ int32 txbfd; /* xmt buffered flag */ t_bool modem_control; /* line supports modem control behaviors */ + t_bool port_speed_control; /* line programmatically sets port speed */ int32 modembits; /* modem bits which are currently set */ FILE *txlog; /* xmt log file */ FILEREF *txlogref; /* xmt log file reference */ @@ -220,6 +221,7 @@ struct tmxr { SOCKET ring_sock; /* incoming connection socket awaiting DTR */ t_bool notelnet; /* default telnet capability for incoming connections */ t_bool modem_control; /* multiplexer supports modem control behaviors */ + t_bool port_speed_control; /* multiplexer programmatically sets port speed */ t_bool packet; /* Lines are packet oriented */ t_bool datagram; /* Lines use datagram packet transport */ }; @@ -246,6 +248,10 @@ t_stat tmxr_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const ch char *tmxr_line_attach_string(TMLN *lp); t_stat tmxr_set_modem_control_passthru (TMXR *mp); t_stat tmxr_clear_modem_control_passthru (TMXR *mp); +t_stat tmxr_set_port_speed_control (TMXR *mp); +t_stat tmxr_clear_port_speed_control (TMXR *mp); +t_stat tmxr_set_line_port_speed_control (TMXR *mp, int line); +t_stat tmxr_clear_line_port_speed_control (TMXR *mp, int line); t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits); t_stat tmxr_set_line_loopback (TMLN *lp, t_bool enable_loopback); t_bool tmxr_get_line_loopback (TMLN *lp);