diff --git a/0readme_39.txt b/0readme_39.txt index 1dfc5fa6..1877c9ec 100644 --- a/0readme_39.txt +++ b/0readme_39.txt @@ -52,7 +52,7 @@ in the source module sim_rev.h. This is the last release of SimH for which I will be lead editor. After this release, the source is moving to a public repository: -https://github.com/markpizz/simh +https://github.com/simh/simh under the general editorship of Dave Hittner and Mark Pizzolato. The status of the individual simulators is as follows: diff --git a/scp.c b/scp.c index 7d678bae..ab6b80f0 100644 --- a/scp.c +++ b/scp.c @@ -8229,6 +8229,7 @@ return; match the expect match string size the number of bytes in the match string + match_pattern the expect match string in display format cnt number of iterations before match is declared action command string to be executed when match occurs @@ -8345,6 +8346,8 @@ exp->size += 1; memset (ep, 0, sizeof(*ep)); ep->match = match_buf; ep->size = match_size; +ep->match_pattern = (char *)malloc (strlen (match) + 1); +strcpy (ep->match_pattern, match); /* Make sure that the production buffer is large enough to detect a match for all rules */ for (i=0; isize; i++) { if (exp->rules[i].size > exp->buf_size) { @@ -8405,6 +8408,7 @@ int32 i; if (!ep) /* not there? ok */ return SCPE_OK; free (ep->match); /* deallocate match string */ +free (ep->match_pattern); /* deallocate the display format match string */ free (ep->act); /* deallocate action */ for (i=ep-exp->rules; isize; i++) /* shuffle up remaining rules */ exp->rules[i] = exp->rules[i+1]; @@ -8429,6 +8433,7 @@ int32 i; for (i=0; isize; i++) { free (exp->rules[i].match); /* deallocate match string */ + free (exp->rules[i].match_pattern); /* deallocate display format match string */ free (exp->rules[i].act); /* deallocate action */ } free (exp->rules); @@ -8508,9 +8513,19 @@ for (i=0; i < exp->size; i++) { if (exp->buf_ins == exp->buf_size) /* At end of match buffer? */ exp->buf_ins = 0; /* wrap around to beginning */ if (i != exp->size) { /* Found? */ - if (ep->cnt > 0) + sim_debug (exp->dbit, exp->dptr, "Matched expect pattern: %s\n", ep->match_pattern); + if (ep->cnt > 0) { ep->cnt -= 1; + sim_debug (exp->dbit, exp->dptr, "Waiting for %d more match%s before stopping\n", + ep->cnt, (ep->cnt == 1) ? "" : "es"); + } else { + if (ep->act && *ep->act) { + sim_debug (exp->dbit, exp->dptr, "Initiating actions: %s\n", ep->act); + } + else { + sim_debug (exp->dbit, exp->dptr, "No actions specified, stopping...\n"); + } sim_brk_setact (ep->act); /* set up actions */ if (!(ep->switches & EXP_TYP_PERSIST)) /* One shot expect rule? */ sim_exp_clr_tab (exp, ep); /* delete it */ @@ -8527,10 +8542,10 @@ return SCPE_OK; t_stat sim_send_input (SEND *snd, uint8 *data, size_t size, uint32 delay) { if (snd->extoff != 0) { - if ((snd->insoff-snd->extoff) > 0) + if (snd->insoff-snd->extoff > 0) memmove(snd->buffer, snd->buffer+snd->extoff, snd->insoff-snd->extoff); snd->insoff -= snd->extoff; - snd->extoff -= 0; + snd->extoff -= snd->extoff; } if (snd->insoff+size > snd->bufsize) { snd->bufsize = snd->insoff+size; @@ -8564,11 +8579,18 @@ return SCPE_OK; t_bool sim_send_poll_data (SEND *snd, t_stat *stat) { if (snd && (snd->extoff < snd->insoff)) { /* pending input characters available? */ - if (sim_gtime() < snd->next_time) /* too soon? */ + if (sim_gtime() < snd->next_time) { /* too soon? */ *stat = SCPE_OK; + sim_debug (snd->dbit, snd->dptr, "Too soon to inject next byte\n"); + } else { + char dstr[8] = ""; + *stat = snd->buffer[snd->extoff++] | SCPE_KFLAG;/* get one */ snd->next_time = sim_gtime() + snd->delay; + if (isgraph(*stat & 0xFF) || ((*stat & 0xFF) == ' ')) + sprintf (dstr, " '%c'", *stat & 0xFF); + sim_debug (snd->dbit, snd->dptr, "Byte value: 0x%02X%s injected\n", *stat & 0xFF, dstr); } return TRUE; } diff --git a/sim_console.c b/sim_console.c index 8f86d1ed..299ce817 100644 --- a/sim_console.c +++ b/sim_console.c @@ -163,8 +163,6 @@ int32 sim_del_char = '\b'; /* delete character */ #else int32 sim_del_char = 0177; #endif -SEND sim_con_send = {SEND_DEFAULT_DELAY}; -EXPECT sim_con_expect; static t_stat sim_con_poll_svc (UNIT *uptr); /* console connection poll routine */ static t_stat sim_con_reset (DEVICE *dptr); /* console reset routine */ @@ -175,6 +173,8 @@ UNIT sim_con_unit = { UDATA (&sim_con_poll_svc, 0, 0) }; /* console connectio #define DBG_RCV TMXR_DBG_RCV /* display Received Data */ #define DBG_RET TMXR_DBG_RET /* display Returned Received Data */ #define DBG_ASY TMXR_DBG_ASY /* asynchronous thread activity */ +#define DBG_EXP 0x00000001 /* Expect match activity */ +#define DBG_SND 0x00000002 /* Send (Inject) data activity */ static DEBTAB sim_con_debug[] = { {"TRC", DBG_TRC}, @@ -182,6 +182,8 @@ static DEBTAB sim_con_debug[] = { {"RCV", DBG_RCV}, {"RET", DBG_RET}, {"ASY", DBG_ASY}, + {"EXP", DBG_EXP}, + {"SND", DBG_SND}, {0} }; @@ -197,6 +199,10 @@ DEVICE sim_con_telnet = { TMLN sim_con_ldsc = { 0 }; /* console line descr */ TMXR sim_con_tmxr = { 1, 0, 0, &sim_con_ldsc, NULL, &sim_con_telnet };/* console line mux */ + +SEND sim_con_send = {SEND_DEFAULT_DELAY, &sim_con_telnet, DBG_SND}; +EXPECT sim_con_expect = {&sim_con_telnet, DBG_EXP}; + /* Unit service for console connection polling */ static t_stat sim_con_poll_svc (UNIT *uptr) diff --git a/sim_defs.h b/sim_defs.h index 123c4910..d6911e3a 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -638,6 +638,7 @@ struct sim_brktab { struct sim_exptab { uint8 *match; /* match string */ uint32 size; /* match string size */ + char *match_pattern; /* match pattern for format */ int32 cnt; /* proceed count */ int32 switches; /* flags */ #define EXP_TYP_PERSIST (SWMASK ('P')) /* rule persists after match, default is once a rule matches, it is removed */ @@ -648,6 +649,8 @@ struct sim_exptab { /* Expect Context */ struct sim_expect { + struct sim_device *dptr; /* Device (for Debug) */ + uint32 dbit; /* Debugging Bit */ struct sim_exptab *rules; /* match rules */ int32 size; /* count of match rules */ uint8 *buf; /* buffer of output data which has produced */ @@ -659,6 +662,8 @@ struct sim_expect { struct sim_send { uint32 delay; /* instruction delay before/between sent data */ + struct sim_device *dptr; /* Device (for Debug) */ + uint32 dbit; /* Debugging Bit */ #define SEND_DEFAULT_DELAY 1000 /* default delay instruction count */ double next_time; /* execution time when next data can be sent */ uint8 *buffer; /* buffer */