1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-04-14 15:55:33 +00:00

SCP: Updated to latest SCP.

This commit is contained in:
Richard Cornwell
2018-01-08 22:35:43 -05:00
parent f8c76f4556
commit 1a0cbc76b5
3 changed files with 233 additions and 50 deletions

166
scp.c
View File

@@ -959,6 +959,14 @@ static const char simh_help[] =
"+++++++++D MQ 0\n"
"++BREAK 100; delete action on break at 100\n\n"
/***************** 80 character line width template *************************/
#define HLP_DEBUG "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions DEBUG"
#define HLP_NODEBUG "*Commands Stopping_The_Simulator User_Specified_Stop_Conditions DEBUG"
"4Debug\n"
" The DEBUG snd NODEBUG commands are aliases for the \"SET DEBUG\" and\n"
" \"SET NODEBUG\" commands. Additionally, support is provided that is\n"
" equivalent to the \"SET <dev> DEBUG=opt1{;opt2}\" and\n"
" \"SET <dev> NODEBUG=opt1{;opt2}\" commands.\n\n"
/***************** 80 character line width template *************************/
"2Connecting and Disconnecting Devices\n"
" Except for main memory and network devices, units are simulated as\n"
" unstructured binary disk files in the host file system. Before using a\n"
@@ -1611,15 +1619,57 @@ ASSERT failure have several different actions:
#endif
#define HLP_ECHO "*Commands Executing_Command_Files Displaying_Arbitrary_Text"
#define HLP_ECHO "*Commands Executing_Command_Files Displaying_Arbitrary_Text ECHO_Command"
/***************** 80 character line width template *************************/
"3Displaying Arbitrary Text\n"
" The ECHO command is a useful way of annotating command files. ECHO prints\n"
" out its arguments on the console (and log):\n\n"
" The ECHO and ECHOF commands are useful ways of annotating command files.\n\n"
"4ECHO command\n"
" The ECHO command prints out its arguments on the console (and log)\n"
" followed by a newline:\n\n"
"++ECHO <string> output string to console\n\n"
" If there is no argument, ECHO prints a blank line on the console. This\n"
" may be used to provide spacing in the console display or log.\n"
/***************** 80 character line width template *************************/
#define HLP_ECHOF "*Commands Executing_Command_Files Displaying_Arbitrary_Text ECHOF_Command"
/***************** 80 character line width template *************************/
"4ECHOF command\n"
" The ECHOF command prints out its arguments on the console (and log)\n"
" followed by a newline:\n\n"
/***************** 80 character line width template *************************/
"++ECHOF {-n} \"<string>\"|<string> output string to console\n\n"
" If there is no argument, ECHOF prints a blank line on the console.\n"
" The string argument may be delimited by quote characters. Quotes may\n"
" be either single or double but the opening and closing quote characters\n"
" must match. If the string is enclosed in quotes, the string may\n"
" contain escaped character strings which is interpreted as described\n"
" in Quoted_String_Data and the resulting string is output.\n\n"
" A command alias can be used to replace the ECHO command with the ECHOF\n"
" command:\n\n"
"++sim> SET ENV ECHO=ECHOF\n"
"5Switches\n"
" Switches can be used to influence the behavior of ECHOF commands\n\n"
"6-n\n"
" The -n switch indicates that the supplied string should be output\n"
" without a newline after the string is written.\n"
"5Quoted String Data\n"
" String data enclosed in quotes is transformed interpreting character\n"
" escapes. The following character escapes are explicitly supported:\n"
"++\\r Sends the ASCII Carriage Return character (Decimal value 13)\n"
"++\\n Sends the ASCII Linefeed character (Decimal value 10)\n"
"++\\f Sends the ASCII Formfeed character (Decimal value 12)\n"
"++\\t Sends the ASCII Horizontal Tab character (Decimal value 9)\n"
"++\\v Sends the ASCII Vertical Tab character (Decimal value 11)\n"
"++\\b Sends the ASCII Backspace character (Decimal value 8)\n"
"++\\\\ Sends the ASCII Backslash character (Decimal value 92)\n"
"++\\' Sends the ASCII Single Quote character (Decimal value 39)\n"
"++\\\" Sends the ASCII Double Quote character (Decimal value 34)\n"
"++\\? Sends the ASCII Question Mark character (Decimal value 63)\n"
"++\\e Sends the ASCII Escape character (Decimal value 27)\n"
" as well as octal character values of the form:\n"
"++\\n{n{n}} where each n is an octal digit (0-7)\n"
" and hext character values of the form:\n"
"++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n"
/***************** 80 character line width template *************************/
#define HLP_SEND "*Commands Executing_Command_Files Injecting_Console_Input"
/***************** 80 character line width template *************************/
"3Injecting Console Input\n"
@@ -1956,6 +2006,8 @@ static CTAB cmd_table[] = {
{ "BOOT", &run_cmd, RU_BOOT, HLP_BOOT, NULL, &run_cmd_message },
{ "BREAK", &brk_cmd, SSH_ST, HLP_BREAK },
{ "NOBREAK", &brk_cmd, SSH_CL, HLP_NOBREAK },
{ "DEBUG", &debug_cmd, 1, HLP_DEBUG},
{ "NODEBUG", &debug_cmd, 0, HLP_NODEBUG },
{ "ATTACH", &attach_cmd, 0, HLP_ATTACH },
{ "DETACH", &detach_cmd, 0, HLP_DETACH },
{ "ASSIGN", &assign_cmd, 0, HLP_ASSIGN },
@@ -1990,6 +2042,7 @@ static CTAB cmd_table[] = {
{ "PROCEED", &noop_cmd, 0, HLP_PROCEED },
{ "IGNORE", &noop_cmd, 0, HLP_IGNORE },
{ "ECHO", &echo_cmd, 0, HLP_ECHO },
{ "ECHOF", &echof_cmd, 0, HLP_ECHOF },
{ "ASSERT", &assert_cmd, 1, HLP_ASSERT },
{ "SEND", &send_cmd, 1, HLP_SEND },
{ "NOSEND", &send_cmd, 0, HLP_SEND },
@@ -2970,6 +3023,30 @@ sim_printf ("%s\n", cptr);
return SCPE_OK;
}
/* EchoF command */
t_stat echof_cmd (int32 flag, CONST char *cptr)
{
char gbuf[CBUFSIZE];
uint8 dbuf[CBUFSIZE];
uint32 dsize = 0;
GET_SWITCHES (cptr);
if (!*cptr)
return SCPE_2FARG;
if ((*cptr == '"') || (*cptr == '\'')) {
cptr = get_glyph_quoted (cptr, gbuf, 0);
if (*cptr != '\0')
return SCPE_2MARG; /* No more arguments */
if (SCPE_OK != sim_decode_quoted_string (gbuf, dbuf, &dsize))
return sim_messagef (SCPE_ARG, "Invalid String\n");
dbuf[dsize] = 0;
cptr = (char *)dbuf;
}
sim_printf ("%s%s", cptr, (sim_switches & SWMASK('N')) ? "" : "\n");
return SCPE_OK;
}
/* Do command
Syntax: DO {-E} {-V} <filename> {<arguments>...}
@@ -3153,7 +3230,8 @@ do {
((cmdp->action != &return_cmd) &&
(cmdp->action != &goto_cmd) &&
(cmdp->action != &on_cmd) &&
(cmdp->action != &echo_cmd)))
(cmdp->action != &echo_cmd) &&
(cmdp->action != &echof_cmd)))
sim_last_cmd_stat = stat; /* save command error status */
switch (stat) {
case SCPE_AFAIL:
@@ -3298,6 +3376,26 @@ while (sim_isspace (*ip)) { /* skip leading spac
sim_sub_instr_off[outstr_off++] = ip - instr;
*op++ = *ip++;
}
/* If entire string is within quotes, strip the quotes */
if ((*ip == '"') || (*ip == '\'')) { /* start with a quote character? */
const char *cptr = ip;
char *tp = op; /* use remainder of output buffer as temp buffer */
cptr = get_glyph_quoted (cptr, tp, 0); /* get quoted string */
while (sim_isspace (*cptr))
++cptr; /* skip over trailing spaces */
if (*cptr == '\0') { /* full string was quoted? */
uint32 dsize;
if (SCPE_OK == sim_decode_quoted_string (tp, (uint8 *)tp, &dsize)) {
tp[dsize] = '\0';
while (sim_isspace (*tp))
memmove (tp, tp + 1, strlen (tp));
strlcpy (ip, tp, instr_size - (ip - instr));/* copy quoted contents to input buffer */
strlcpy (sim_sub_instr + (ip - instr), tp, instr_size - (ip - instr));
}
}
}
istart = ip;
for (; *ip && (op < oend); ) {
if ((ip [0] == '%') && (ip [1] == '%')) { /* literal % insert? */
@@ -5477,9 +5575,7 @@ if (dir) {
#endif
t_offset FileSize;
char FileName[PATH_MAX + 1];
#if defined (HAVE_FNMATCH)
char *MatchName = 1 + strrchr (cptr, '/');;
#endif
char *p_name;
struct tm *local;
#if defined (HAVE_GLOB)
@@ -5494,6 +5590,9 @@ if (dir) {
#if defined (HAVE_FNMATCH)
if (fnmatch(MatchName, ent->d_name, 0))
continue;
#else
if (strcmp(MatchName, ent->d_name) != 0)
continue;
#endif
sprintf (FileName, "%s/%s", DirName, ent->d_name);
#endif
@@ -5742,6 +5841,25 @@ if ((stat == SCPE_OK) && (copy_state.count))
return copy_state.stat;
}
/* Debug command */
t_stat debug_cmd (int32 flg, CONST char *cptr)
{
char gbuf[CBUFSIZE];
CONST char *svptr;
DEVICE *dptr;
GET_SWITCHES (cptr); /* get switches */
cptr = get_glyph (svptr = cptr, gbuf, 0); /* get next glyph */
if ((dptr = find_dev (gbuf))) /* device match? */
return set_dev_debug (dptr, NULL, flg, *cptr ? cptr : NULL);
cptr = svptr;
if (flg)
return sim_set_debon (0, cptr);
else
return sim_set_deboff (0, cptr);
}
/* Breakpoint commands */
t_stat brk_cmd (int32 flg, CONST char *cptr)
@@ -7155,16 +7273,14 @@ if (sim_deb && (sim_deb != stdout) && (sim_deb != sim_log)) {/* debug if enabled
t_stat sim_run_boot_prep (int32 flag)
{
UNIT *uptr;
t_stat r;
sim_interval = 0; /* reset queue */
sim_time = sim_rtime = 0;
noqueue_time = 0;
for (uptr = sim_clock_queue; uptr != QUEUE_LIST_END; uptr = sim_clock_queue) {
sim_clock_queue = uptr->next;
uptr->next = NULL;
}
noqueue_time = 0; /* reset queue */
while (sim_clock_queue != QUEUE_LIST_END)
sim_cancel (sim_clock_queue);
noqueue_time = sim_interval = 0;
r = reset_all (0);
if ((r == SCPE_OK) && (flag == RU_RUN)) {
if ((run_cmd_did_reset) && (0 == (sim_switches & SWMASK ('Q')))) {
@@ -9888,6 +10004,7 @@ if (nptr != QUEUE_LIST_END)
nptr->time += (uptr->next) ? 0 : uptr->time;
if (!uptr->next)
uptr->time = 0;
uptr->usecs_remaining = 0;
if (sim_clock_queue != QUEUE_LIST_END)
sim_interval = sim_clock_queue->time;
else sim_interval = noqueue_time = NOQUEUE_WAIT;
@@ -10423,7 +10540,19 @@ while (sim_isspace (*sim_brk_act[sim_do_depth])) /* skip spaces */
if (*sim_brk_act[sim_do_depth] == 0) { /* now empty? */
return sim_brk_clract ();
}
if ((ep = strchr (sim_brk_act[sim_do_depth], ';'))) { /* cmd delimiter? */
ep = strpbrk (sim_brk_act[sim_do_depth], ";\"'"); /* search for a semicolon or single or double quote */
if ((ep != NULL) && (*ep != ';')) { /* if a quoted string is present */
char quote = *ep++; /* then save the opening quotation mark */
while (ep [0] != '\0' && ep [0] != quote) /* while characters remain within the quotes */
if (ep [0] == '\\' && ep [1] == quote) /* if an escaped quote sequence follows */
ep = ep + 2; /* then skip over the pair */
else /* otherwise */
ep = ep + 1; /* skip the non-quote character */
ep = strchr (ep, ';'); /* the next semicolon is outside the quotes if it exists */
}
if (ep != NULL) { /* if a semicolon is present */
lnt = ep - sim_brk_act[sim_do_depth]; /* cmd length */
memcpy (buf, sim_brk_act[sim_do_depth], lnt + 1); /* copy with ; */
buf[lnt] = 0; /* erase ; */
@@ -10457,6 +10586,14 @@ else
sim_brk_clract ();
}
char *sim_brk_replace_act (char *new_action)
{
char *old_action = sim_brk_act_buf[sim_do_depth];
sim_brk_act_buf[sim_do_depth] = new_action;
return old_action;
}
/* New PC */
void sim_brk_npc (uint32 cnt)
@@ -10779,7 +10916,8 @@ if (switches & EXP_TYP_REGEX) {
}
else {
sim_data_trace(exp->dptr, exp->dptr->units, (const uint8 *)match, "", strlen(match)+1, "Expect Match String", exp->dbit);
sim_decode_quoted_string (match, match_buf, &match_size);
/* quoted string was validated above, this decode operation will always succeed */
(void)sim_decode_quoted_string (match, match_buf, &match_size);
ep->match = match_buf;
ep->size = match_size;
}

3
scp.h
View File

@@ -108,6 +108,8 @@ t_stat help_cmd (int32 flag, CONST char *ptr);
t_stat screenshot_cmd (int32 flag, CONST char *ptr);
t_stat spawn_cmd (int32 flag, CONST char *ptr);
t_stat echo_cmd (int32 flag, CONST char *ptr);
t_stat echof_cmd (int32 flag, CONST char *ptr);
t_stat debug_cmd (int32 flag, CONST char *ptr);
/* Allow compiler to help validate printf style format arguments */
#if !defined __GNUC__
@@ -273,6 +275,7 @@ uint32 sim_brk_test (t_addr bloc, uint32 btyp);
void sim_brk_clrspc (uint32 spc, uint32 btyp);
void sim_brk_npc (uint32 cnt);
void sim_brk_setact (const char *action);
char *sim_brk_replace_act (char *new_action);
const char *sim_brk_message(void);
t_stat sim_send_input (SEND *snd, uint8 *data, size_t size, uint32 after, uint32 delay);
t_stat sim_show_send_input (FILE *st, const SEND *snd);

View File

@@ -702,16 +702,21 @@ static t_stat x_sampleout_cmd (int32 flag, CONST char *cptr)
return 4+SCPE_IERR; /* This routine should never be called */
}
static t_stat x_step_cmd (int32 flag, CONST char *cptr)
static t_stat x_execute_cmd (int32 flag, CONST char *cptr)
{
return 5+SCPE_IERR; /* This routine should never be called */
}
static t_stat x_run_cmd (int32 flag, CONST char *cptr)
static t_stat x_step_cmd (int32 flag, CONST char *cptr)
{
return 6+SCPE_IERR; /* This routine should never be called */
}
static t_stat x_run_cmd (int32 flag, CONST char *cptr)
{
return 7+SCPE_IERR; /* This routine should never be called */
}
static t_stat x_help_cmd (int32 flag, CONST char *cptr);
static CTAB allowed_remote_cmds[] = {
@@ -732,6 +737,7 @@ static CTAB allowed_remote_cmds[] = {
{ "DIR", &dir_cmd, 0 },
{ "LS", &dir_cmd, 0 },
{ "ECHO", &echo_cmd, 0 },
{ "ECHOF", &echof_cmd, 0 },
{ "SET", &set_cmd, 0 },
{ "SHOW", &show_cmd, 0 },
{ "HELP", &x_help_cmd, 0 },
@@ -750,6 +756,7 @@ static CTAB allowed_master_remote_cmds[] = {
{ "REPEAT", &x_repeat_cmd, 0 },
{ "COLLECT", &x_collect_cmd, 0 },
{ "SAMPLEOUT",&x_sampleout_cmd, 0 },
{ "EXECUTE", &x_execute_cmd, 0 },
{ "STEP", &x_step_cmd, 0 },
{ "PWD", &pwd_cmd, 0 },
{ "SAVE", &save_cmd, 0 },
@@ -757,6 +764,7 @@ static CTAB allowed_master_remote_cmds[] = {
{ "DIR", &dir_cmd, 0 },
{ "LS", &dir_cmd, 0 },
{ "ECHO", &echo_cmd, 0 },
{ "ECHOF", &echof_cmd, 0 },
{ "SET", &set_cmd, 0 },
{ "SHOW", &show_cmd, 0 },
{ "HELP", &x_help_cmd, 0 },
@@ -769,6 +777,8 @@ static CTAB allowed_master_remote_cmds[] = {
{ "NOBREAK", &brk_cmd, SSH_CL },
{ "EXPECT", &expect_cmd, 1 },
{ "NOEXPECT", &expect_cmd, 0 },
{ "DEBUG", &debug_cmd, 1 },
{ "NODEBUG", &debug_cmd, 0 },
{ "SEND", &send_cmd, 0 },
{ NULL, NULL }
};
@@ -781,10 +791,12 @@ static CTAB allowed_single_remote_cmds[] = {
{ "REPEAT", &x_repeat_cmd, 0 },
{ "COLLECT", &x_collect_cmd, 0 },
{ "SAMPLEOUT",&x_sampleout_cmd, 0 },
{ "EXECUTE", &x_execute_cmd, 0 },
{ "PWD", &pwd_cmd, 0 },
{ "DIR", &dir_cmd, 0 },
{ "LS", &dir_cmd, 0 },
{ "ECHO", &echo_cmd, 0 },
{ "ECHOF", &echof_cmd, 0 },
{ "SHOW", &show_cmd, 0 },
{ "HELP", &x_help_cmd, 0 },
{ NULL, NULL }
@@ -794,6 +806,7 @@ static CTAB remote_only_cmds[] = {
{ "REPEAT", &x_repeat_cmd, 0 },
{ "COLLECT", &x_collect_cmd, 0 },
{ "SAMPLEOUT",&x_sampleout_cmd, 0 },
{ "EXECUTE", &x_execute_cmd, 0 },
{ NULL, NULL }
};
@@ -939,15 +952,28 @@ while (sim_isspace (*rem->act)) /* skip spaces */
rem->act++;
if (*rem->act == 0) /* now empty? */
return sim_rem_clract (line);
if ((ep = strchr (rem->act, ';'))) { /* cmd delimiter? */
ep = strpbrk (rem->act, ";\"'"); /* search for a semicolon or single or double quote */
if ((ep != NULL) && (*ep != ';')) { /* if a quoted string is present */
char quote = *ep++; /* then save the opening quotation mark */
while (ep [0] != '\0' && ep [0] != quote) /* while characters remain within the quotes */
if (ep [0] == '\\' && ep [1] == quote) /* if an escaped quote sequence follows */
ep = ep + 2; /* then skip over the pair */
else /* otherwise */
ep = ep + 1; /* skip the non-quote character */
ep = strchr (ep, ';'); /* the next semicolon is outside the quotes if it exists */
}
if (ep != NULL) { /* if a semicolon is present */
lnt = ep - rem->act; /* cmd length */
memcpy (buf, rem->act, lnt + 1); /* copy with ; */
buf[lnt] = 0; /* erase ; */
rem->act += lnt + 1; /* adv ptr */
}
else {
strncpy (buf, rem->act, size); /* copy action */
strlcpy (buf, rem->act, size); /* copy action */
rem->act += strlen (rem->act); /* adv ptr to end */
sim_rem_clract (line);
}
return buf;
}
@@ -1443,7 +1469,7 @@ for (i=(was_active_command ? sim_rem_cmd_active_line : 0);
while (1) {
if (stat == SCPE_EXIT)
return stat|SCPE_NOMESSAGE;
if (!rem->single_mode) {
if ((!rem->single_mode) && (rem->act == NULL)) {
read_start_time = sim_os_msec();
if (master_session)
tmxr_linemsg (lp, "sim> ");
@@ -1457,26 +1483,24 @@ for (i=(was_active_command ? sim_rem_cmd_active_line : 0);
if (!master_session)
tmxr_linemsgf (lp, "%s%s\n", sim_prompt, rem->buf);
else
tmxr_linemsgf (lp, "%s%s\n", sim_is_running ? "SIM> " : "sim> ", rem->buf);
rem->buf_ptr = strlen (rem->repeat_action);
tmxr_linemsgf (lp, "%s%s\n", "SIM> ", rem->buf);
rem->buf_ptr = strlen (rem->buf);
got_command = TRUE;
break;
}
else {
if ((rem->repeat_pending) && /* New repeat pending */
(rem->act == NULL) && /* AND no prior still active */
(!tmxr_input_pending_ln (lp))) { /* AND no session input pending */
rem->repeat_pending = FALSE;
sim_rem_setact (rem-sim_rem_consoles, rem->repeat_action);
sim_rem_getact (rem-sim_rem_consoles, rem->buf, rem->buf_size);
if (!master_session)
tmxr_linemsgf (lp, "%s%s\n", sim_prompt, rem->buf);
else
tmxr_linemsgf (lp, "%s%s\n", sim_is_running ? "SIM> " : "sim> ", rem->buf);
rem->buf_ptr = strlen (rem->repeat_action);
got_command = TRUE;
break;
}
if ((rem->repeat_pending) && /* New repeat pending */
(rem->act == NULL) && /* AND no prior still active */
(!tmxr_input_pending_ln (lp))) { /* AND no session input pending */
rem->repeat_pending = FALSE;
sim_rem_setact (rem-sim_rem_consoles, rem->repeat_action);
sim_rem_getact (rem-sim_rem_consoles, rem->buf, rem->buf_size);
if (!master_session)
tmxr_linemsgf (lp, "%s%s\n", sim_prompt, rem->buf);
else
tmxr_linemsgf (lp, "%s%s\n", "SIM> ", rem->buf);
rem->buf_ptr = strlen (rem->buf);
got_command = TRUE;
break;
}
}
if (!rem->single_mode) {
@@ -1688,21 +1712,32 @@ for (i=(was_active_command ? sim_rem_cmd_active_line : 0);
stat = sim_rem_repeat_cmd_setup (i, &cptr);
}
else {
if (cmdp->action == &x_collect_cmd) {
sim_debug (DBG_CMD, &sim_remote_console, "sample_cmd executing\n");
stat = sim_rem_collect_cmd_setup (i, &cptr);
if (cmdp->action == &x_execute_cmd) {
sim_debug (DBG_CMD, &sim_remote_console, "execute_cmd executing\n");
if (rem->act)
stat = SCPE_IERR;
else {
sim_rem_setact (rem-sim_rem_consoles, cptr);
stat = SCPE_OK;
}
}
else {
if (sim_con_stable_registers &&
sim_rem_master_mode) { /* can we process command now? */
sim_debug (DBG_CMD, &sim_remote_console, "Processing Command directly\n");
sim_oline = lp; /* specify output socket */
sim_remote_process_command ();
stat = SCPE_OK; /* any message has already been emitted */
if (cmdp->action == &x_collect_cmd) {
sim_debug (DBG_CMD, &sim_remote_console, "collect_cmd executing\n");
stat = sim_rem_collect_cmd_setup (i, &cptr);
}
else {
sim_debug (DBG_CMD, &sim_remote_console, "Processing Command via SCPE_REMOTE\n");
stat = SCPE_REMOTE; /* force processing outside of sim_instr() */
if (sim_con_stable_registers &&
sim_rem_master_mode) { /* can we process command now? */
sim_debug (DBG_CMD, &sim_remote_console, "Processing Command directly\n");
sim_oline = lp; /* specify output socket */
sim_remote_process_command ();
stat = SCPE_OK; /* any message has already been emitted */
}
else {
sim_debug (DBG_CMD, &sim_remote_console, "Processing Command via SCPE_REMOTE\n");
stat = SCPE_REMOTE; /* force processing outside of sim_instr() */
}
}
}
}
@@ -1779,7 +1814,7 @@ for (i=(was_active_command ? sim_rem_cmd_active_line : 0);
}
if (sim_rem_master_was_connected && /* Master mode ever connected? */
!sim_rem_con_tmxr.ldsc[0].sock) /* Master Connection lost? */
return SCPE_EXIT; /* simulator has been 'unplugged' */
return sim_messagef (SCPE_EXIT, "Master Session Disconnect");/* simulator has been 'unplugged' */
if (sim_rem_cmd_active_line != -1) {
if (steps)
sim_activate(uptr, steps); /* check again after 'steps' instructions */
@@ -1983,6 +2018,8 @@ if (sim_rem_master_mode) {
sim_rem_master_was_enabled = TRUE;
sim_last_cmd_stat = SCPE_OK;
while (sim_rem_master_mode) {
char *brk_action;
sim_rem_consoles[0].single_mode = FALSE;
sim_cancel (rem_con_data_unit);
sim_activate (rem_con_data_unit, -1);
@@ -1991,9 +2028,14 @@ if (sim_rem_master_mode) {
stat_nomessage = stat & SCPE_NOMESSAGE; /* extract possible message supression flag */
stat = _sim_rem_message ("RUN", stat);
}
sim_debug (DBG_MOD, &sim_remote_console, "Master Session Returned: Status - %d Active_Line: %d, Mode: %s, Active Cmd: %s\n", stat, sim_rem_cmd_active_line, sim_rem_consoles[0].single_mode ? "Single" : "^E Stopped", sim_rem_active_command ? sim_rem_active_command->name : "");
brk_action = sim_brk_replace_act (NULL);
sim_debug (DBG_MOD, &sim_remote_console, "Master Session Returned: Status - %d Active_Line: %d, Mode: %s, Active Cmd: %s%s%s\n", stat, sim_rem_cmd_active_line, sim_rem_consoles[0].single_mode ? "Single" : "^E Stopped", sim_rem_active_command ? sim_rem_active_command->name : "", brk_action ? " Break Action: " : "", brk_action ? brk_action : "");
if (stat == SCPE_EXIT)
sim_rem_master_mode = FALSE;
if (brk_action) {
free (sim_rem_consoles[0].act);
sim_rem_consoles[0].act = brk_action;
}
sim_rem_cmd_active_line = 0; /* Make it look like */
sim_rem_consoles[0].single_mode = FALSE;
if (stat != SCPE_STEP)
@@ -2181,7 +2223,6 @@ char gbuf[CBUFSIZE];
t_stat r;
time_t now;
sim_deb_switches = sim_switches; /* save debug switches */
if ((cptr == NULL) || (*cptr == 0)) /* need arg */
return SCPE_2FARG;
cptr = get_glyph_nc (cptr, gbuf, 0); /* get file name */
@@ -2192,6 +2233,7 @@ r = sim_open_logfile (gbuf, FALSE, &sim_deb, &sim_deb_ref);
if (r != SCPE_OK)
return r;
sim_deb_switches = sim_switches; /* save debug switches */
if (sim_deb_switches & SWMASK ('R')) {
clock_gettime(CLOCK_REALTIME, &sim_deb_basetime);
if (!(sim_deb_switches & (SWMASK ('A') | SWMASK ('T'))))