From 3bd7969d72387c912095b33aca1fa7cd335669f9 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 25 Jun 2020 11:06:04 -0700 Subject: [PATCH] PDP11: Add more thorough help to the DLI/DLO device - Remove potential ambiguity setting character mode for DLO0. DLO0 must be specified rather than just DLO. --- PDP11/pdp11_dl.c | 91 +++++++++++++++++++++++++++++++++++++++------- doc/pdp11_doc.doc | Bin 196608 -> 202752 bytes 2 files changed, 77 insertions(+), 14 deletions(-) diff --git a/PDP11/pdp11_dl.c b/PDP11/pdp11_dl.c index 9b3f2ff1..59737104 100644 --- a/PDP11/pdp11_dl.c +++ b/PDP11/pdp11_dl.c @@ -107,6 +107,9 @@ void dlo_clr_int (int32 ln); void dlo_set_int (int32 ln); int32 dlo_iack (void); void dlx_reset_ln (int32 ln); +t_stat dl_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat dl_show_mode (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat dlx_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); const char *dlx_description (DEVICE *dptr); /* DLI data structures @@ -185,7 +188,7 @@ DEVICE dli_dev = { NULL, NULL, &dlx_reset, NULL, &dlx_attach, &dlx_detach, &dli_dib, DEV_UBUS | DEV_QBUS | DEV_DISABLE | DEV_DIS | DEV_MUX | DEV_DEBUG, - 0, dl_debug, NULL, NULL, NULL, NULL, NULL, &dlx_description}; + 0, dl_debug, NULL, NULL, &dlx_help, NULL, &dlx_desc, &dlx_description}; /* DLO data structures @@ -223,18 +226,16 @@ REG dlo_reg[] = { }; MTAB dlo_mod[] = { - { TT_MODE, TT_MODE_UC, "UC", "UC", NULL }, - { TT_MODE, TT_MODE_7B, "7b", "7B", NULL }, - { TT_MODE, TT_MODE_8B, "8b", "8B", NULL }, - { TT_MODE, TT_MODE_7P, "7p", "7P", NULL }, - { DLX_MDM, 0, "no dataset", "NODATASET", NULL }, - { DLX_MDM, DLX_MDM, "dataset", "DATASET", NULL }, - { MTAB_XTD|MTAB_VUN, 0, NULL, "DISCONNECT", - &tmxr_dscln, NULL, &dlx_desc }, - { MTAB_XTD|MTAB_VUN|MTAB_NC, 0, "LOG", "LOG", - &tmxr_set_log, &tmxr_show_log, &dlx_desc }, - { MTAB_XTD|MTAB_VUN|MTAB_NC, 0, NULL, "NOLOG", - &tmxr_set_nolog, NULL, &dlx_desc }, + { MTAB_XTD|MTAB_VUN, TT_MODE_UC, NULL, "UC", &dl_set_mode, NULL, NULL, "Set upper case mode" }, + { MTAB_XTD|MTAB_VUN, TT_MODE_7B, NULL, "7B", &dl_set_mode, NULL, NULL, "Set 7 bit mode" }, + { MTAB_XTD|MTAB_VUN, TT_MODE_8B, NULL, "8B", &dl_set_mode, NULL, NULL, "Set 8 bit mode" }, + { MTAB_XTD|MTAB_VUN, TT_MODE_7P, NULL, "7P", &dl_set_mode, NULL, NULL, "Set 7 bit mode - non printing suppressed" }, + { MTAB_XTD|MTAB_VUN, 0, "MODE", NULL, NULL, &dl_show_mode, NULL, "Show character mode" }, + { DLX_MDM, 0, "no dataset", "NODATASET", NULL, NULL, NULL, "Set modem signals disabled" }, + { DLX_MDM, DLX_MDM, "dataset", "DATASET", NULL, NULL, NULL, "Set modem signals enabled" }, + { MTAB_XTD|MTAB_VUN, 0, NULL, "DISCONNECT", &tmxr_dscln, NULL, &dlx_desc, "Disconnect line" }, + { MTAB_XTD|MTAB_VUN|MTAB_NC, 0, "LOG", "LOG=file", &tmxr_set_log, &tmxr_show_log, &dlx_desc, "Set Logging to file" }, + { MTAB_XTD|MTAB_VUN|MTAB_NC, 0, NULL, "NOLOG", &tmxr_set_nolog, NULL, &dlx_desc, "Disable logging on line n" }, { 0 } }; @@ -244,7 +245,7 @@ DEVICE dlo_dev = { NULL, NULL, &dlx_reset, NULL, NULL, NULL, NULL, DEV_UBUS | DEV_QBUS | DEV_DISABLE | DEV_DIS | DEV_DEBUG, - 0, dl_debug, NULL, NULL, NULL, NULL, NULL, &dlx_description}; + 0, dl_debug, NULL, NULL, &dlx_help, NULL, &dlx_desc, &dlx_description}; /* Register names for Debug tracing */ static const char *dl_regs[] = @@ -671,6 +672,68 @@ dli_dib.lnt = newln * 010; /* upd IO page lnt */ return auto_config (dli_dev.name, newln); /* auto config */ } +/* SET character MODE processor */ + +t_stat dl_set_mode (UNIT *uptr, int32 val, CONST char *cptr, void *desc) +{ +uptr->flags &= ~TT_MODE; +uptr->flags |= val; +return SCPE_OK; +} + +/* SHOW character MODE processor */ + +t_stat dl_show_mode (FILE *st, UNIT *uptr, int32 val, CONST void *desc) +{ +static const char *modes[] = {"7B", "8B", "UC", "7P"}; + +fprintf (st, "%s", modes[(uptr->flags & TT_MODE) >> TTUF_V_MODE]); +return SCPE_OK; +} + +t_stat dlx_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +{ +fprintf (st, "DLI/DLO Terminal Multiplexer (KL11/DL11)\n\n"); +fprintf (st, "The DLI/DLO implements up to %d KL11/DL11 terminal lines.\n", DLX_LINES); +fprintf (st, "The default number of lines is %d. The number of lines can\n", DLX_LINES); +fprintf (st, "be changed with the command\n\n"); +fprintf (st, " sim> SET DLI LINES=n set line count to n\n\n"); +fprintf (st, "The DLI/DLO supports four character processing modes, UC, 7P, 7B, and 8B:\n\n"); +fprintf (st, " mode input characters output characters\n"); +fprintf (st, " ===========================================================\n"); +fprintf (st, " UC lower case converted to lower case converted to upper case,\n"); +fprintf (st, " upper case, high-order case, high-order bit cleared,\n"); +fprintf (st, " bit cleared\n"); +fprintf (st, " 7P high-order bit cleared high-order bit cleared,\n"); +fprintf (st, " non-printing characters suppressed\n"); +fprintf (st, " 7B high-order bit cleared high-order bit cleared\n"); +fprintf (st, " 8B no changes no changes\n\n"); +fprintf (st, "The default is UC. To change the character processing mode, use\n"); +fprintf (st, "the command:\n\n"); +fprintf (st, " sim> SET DLOn {UC|7P|7B|8B}\n\n"); +fprintf (st, "The DLO supports logging on a per-line basis. The command\n\n"); +fprintf (st, " sim> SET DLOn LOG=filename\n\n"); +fprintf (st, "enables logging for the specified line(n) to the indicated file.\n"); +fprintf (st, "The command:\n\n"); +fprintf (st, " sim> SET DLOn NOLOG=line\n\n"); +fprintf (st, "disables logging for the specified line and closes any open log file.\n"); +fprintf (st, "Finally, the command:\n\n"); +fprintf (st, " sim> SHOW DLOn LOG\n\n"); +fprintf (st, "displays logging information for line n.\n\n"); +fprintf (st, "Once the DLI is attached and the simulator is running, the DLI will listen\n"); +fprintf (st, "for connections on the specified port. It assumes that the incoming\n"); +fprintf (st, "connections are Telnet connections. The connection remains open until\n"); +fprintf (st, "disconnected by the simulated program, the Telnet client, a\n"); +fprintf (st, "SET DLOn DISCONNECT command, or a DETACH DLI command.\n\n"); +fprintf (st, "Other special DLI/DLO commands:\n\n"); +fprintf (st, " sim> SHOW DLI CONNECTIONS show current connections\n"); +fprintf (st, " sim> SHOW DLI STATISTICS show statistics for active connections\n"); +fprintf (st, " sim> SET DLI DISCONNECT=linenumber disconnects the specified line.\n\n"); +fprintf (st, "All open connections are lost when the simulator shuts down or the DLI is\n"); +fprintf (st, "detached.\n\n"); +return SCPE_OK; +} + const char *dlx_description (DEVICE *dptr) { return (dptr == &dli_dev) ? "DL11 asynchronous line interface - receiver" diff --git a/doc/pdp11_doc.doc b/doc/pdp11_doc.doc index e767c75239f093211f647c202fb2d4e270576c85..ffef3e44d23ef4302ce5b61217c8e464726d1547 100644 GIT binary patch delta 22858 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