From 938aa58f3ab71a36014ac6118cff23f97476bfbc Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 7 Mar 2020 10:13:18 -0800 Subject: [PATCH] SCP: Provide ways for VM to specify sim_interval adjustment and step units This affects the output of some SCP commands (including help). The results are cosmetic, but allows the simulator to provide correct descriptive information. --- doc/simh.doc | Bin 290816 -> 291328 bytes scp.c | 64 +++++++++++++++++++++++++++++---------------------- scp.h | 2 ++ scp_help.h | 2 ++ sim_timer.c | 18 +++++++-------- 5 files changed, 49 insertions(+), 37 deletions(-) diff --git a/doc/simh.doc b/doc/simh.doc index 4b0fe9be5a0ccb332430e40a010b48785fa77c8c..725ff299869f8aa7b7e9d2bf3d3580ed25498c37 100644 GIT binary patch delta 33574 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 AtN;K2 delta 32850 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 AzW@LL diff --git a/scp.c b/scp.c index 43679d68..41ccc98b 100644 --- a/scp.c +++ b/scp.c @@ -386,7 +386,7 @@ if (AIO_QUEUE_VAL != QUEUE_LIST_END) { /* List !Empty */ q = AIO_QUEUE_VAL; } while (q != AIO_QUEUE_SET(QUEUE_LIST_END, q)); while (q != QUEUE_LIST_END) { /* List !Empty */ - sim_debug (SIM_DBG_AIO_QUEUE, &sim_scp_dev, "Migrating Asynch event for %s after %d instructions\n", sim_uname(q), q->a_event_time); + sim_debug (SIM_DBG_AIO_QUEUE, &sim_scp_dev, "Migrating Asynch event for %s after %d %s\n", sim_uname(q), q->a_event_time, sim_vm_interval_units); ++migrated; uptr = q; q = q->a_next; @@ -414,7 +414,7 @@ return migrated; void sim_aio_activate (ACTIVATE_API caller, UNIT *uptr, int32 event_time) { AIO_ILOCK; -sim_debug (SIM_DBG_AIO_QUEUE, &sim_scp_dev, "Queueing Asynch event for %s after %d instructions\n", sim_uname(uptr), event_time); +sim_debug (SIM_DBG_AIO_QUEUE, &sim_scp_dev, "Queueing Asynch event for %s after %d %s\n", sim_uname(uptr), event_time, sim_vm_interval_units); if (uptr->a_next) { uptr->a_activate_call = sim_activate_abs; } @@ -430,7 +430,7 @@ else { AIO_IUNLOCK; sim_asynch_check = 0; /* try to force check */ if (sim_idle_wait) { - sim_debug (TIMER_DBG_IDLE, &sim_timer_dev, "waking due to event on %s after %d instructions\n", sim_uname(uptr), event_time); + sim_debug (TIMER_DBG_IDLE, &sim_timer_dev, "waking due to event on %s after %d %s\n", sim_uname(uptr), event_time, sim_vm_interval_units); pthread_cond_signal (&sim_asynch_wake); } } @@ -573,6 +573,8 @@ const char *sim_prog_name = NULL; /* pointer to the execut DEVICE *sim_dflt_dev = NULL; UNIT *sim_clock_queue = QUEUE_LIST_END; int32 sim_interval = 0; +const char *sim_vm_interval_units = "instructions"; /* Simulator can change to "cycles" as needed */ +const char *sim_vm_step_unit = "instruction"; /* Simulator can change */ int32 sim_switches = 0; int32 sim_switch_number = 0; FILE *sim_ofile = NULL; @@ -1031,11 +1033,11 @@ static const char simh_help[] = #define HLP_STEP "*Commands Running_A_Simulated_Program STEP" "3STEP\n" " The STEP command (abbreviated S) resumes execution at the current PC for\n" - " the number of instructions given by its argument. If no argument is\n" - " supplied, one instruction is executed.\n" + " the number of %Is given by its argument. If no argument is\n" + " supplied, one %I is executed.\n" "4Switches\n" " If the STEP command is invoked with the -T switch, the step command will\n" - " cause execution to run for microseconds rather than instructions.\n" + " cause execution to run for microseconds rather than %I.\n" #define HLP_NEXT "*Commands Running_A_Simulated_Program NEXT" "3NEXT\n" " The NEXT command (abbreviated N) resumes execution at the current PC for\n" @@ -1330,7 +1332,7 @@ static const char simh_help[] = "+SET NODEBUG disables any currently active debug output\n" "4Switches\n" " Debug message output contains a timestamp which indicates the number of\n" - " simulated instructions which have been executed prior to the debug event.\n\n" + " simulated %C which have been executed prior to the debug event.\n\n" " Debug message output can be enhanced to contain additional, potentially\n" " useful information.\n" "5-T\n" @@ -1374,17 +1376,17 @@ static const char simh_help[] = "3Throttle\n" " Simulator instruction execution rate can be controlled by specifying\n" " one of the following throttle commands:\n\n" - "+SET THROTTLE xM execute x million instructions per second\n" - "+SET THROTTLE xK execute x thousand instructions per second\n" + "+SET THROTTLE xM execute x million %C per second\n" + "+SET THROTTLE xK execute x thousand %C per second\n" "+SET THROTTLE x%% occupy x percent of the host capacity\n" "++++++++executing instructions\n" "+SET THROTTLE x/t sleep for t milliseconds after executing x\n" - "++++++++instructions\n\n" + "++++++++%C\n\n" "+SET NOTHROTTLE set simulation rate to maximum\n\n" " Throttling is only available on host systems that implement a precision\n" " real-time delay function.\n\n" " xM, xK and x%% modes require the simulator to execute sufficient\n" - " instructions to actually calibrate the desired execution rate relative\n" + " %C to actually calibrate the desired execution rate relative\n" " to wall clock time. Very short running programs may complete before\n" " calibration completes and therefore before the simulated execution rate\n" " can match the desired rate.\n\n" @@ -1406,7 +1408,7 @@ static const char simh_help[] = "+SET CLOCK catchup enable catchup clock ticks\n" "+SET CLOCK calib=n%% specify idle calibration skip %%\n" "+SET CLOCK calib=ALWAYS specify calibration independent of idle\n" - "+SET CLOCK stop=n stop execution after n instructions\n\n" + "+SET CLOCK stop=n stop execution after n %C\n\n" " The SET CLOCK STOP command allows execution to have a bound when\n" " execution starts with a BOOT, NEXT or CONTINUE command.\n" #define HLP_SET_ASYNCH "*Commands SET Asynch" @@ -2041,7 +2043,7 @@ static const char simh_help[] = " a multiplier of 1000 or 1000000 respectively\n" /***************** 80 character line width template *************************/ "4After\n" - " Specifies an integer (>=0) representing a minimal number of instructions\n" + " Specifies an integer (>=0) representing a minimal number of %C\n" " which must execute before the first character in the string is sent.\n" " The after parameter value can be set by itself with:\n\n" "++SEND AFTER=n\n\n" @@ -2072,7 +2074,7 @@ static const char simh_help[] = " Switches can be used to influence the behavior of SEND commands\n\n" "5-t\n" " The -t switch indicates that the Delay and After values are in\n" - " units of microseconds rather than instructions.\n" + " units of microseconds rather than %C.\n" /***************** 80 character line width template *************************/ #define HLP_EXPECT "*Commands Executing_Command_Files Reacting_To_Console_Output" /***************** 80 character line width template *************************/ @@ -2138,7 +2140,7 @@ static const char simh_help[] = " The -i switch is only valid for regular expression expect rules.\n" "5-t\n" " The -t switch indicates that the value specified by the HaltAfter\n" - " parameter are in units of microseconds rather than instructions.\n" + " parameter are in units of microseconds rather than %C.\n" "4Determining Which Output Matched\n" " When an expect rule matches data in the output stream, the rule which\n" " matched is recorded in the environment variable _EXPECT_MATCH_PATTERN.\n" @@ -2168,7 +2170,7 @@ static const char simh_help[] = " and hext character values of the form:\n" "++\\xh{h} where each h is a hex digit (0-9A-Fa-f)\n" "4HaltAfter\n" - " Specifies the number of instructions which should be executed before\n" + " Specifies the number of %C which should be executed before\n" " simulator instruction execution should stop. The default is to stop\n" " executing instructions immediately (i.e. HALTAFTER=0).\n" " The default HaltAfter delay, once set, persists for all expect behaviors\n" @@ -6176,14 +6178,14 @@ memset (&buf, 0, sizeof (buf)); if (cptr && (*cptr != 0)) return SCPE_2MARG; if (sim_clock_queue == QUEUE_LIST_END) - fprintf (st, "%s event queue empty, time = %.0f, executing %s instructios/sec\n", - sim_name, sim_time, sim_fmt_numeric (sim_timer_inst_per_sec ())); + fprintf (st, "%s event queue empty, time = %.0f, executing %s %s/sec\n", + sim_name, sim_time, sim_fmt_numeric (sim_timer_inst_per_sec ()), sim_vm_interval_units); else { const char *tim = ""; double inst_per_sec = sim_timer_inst_per_sec (); - fprintf (st, "%s event queue status, time = %.0f, executing %s instructions/sec\n", - sim_name, sim_time, sim_fmt_numeric (inst_per_sec)); + fprintf (st, "%s event queue status, time = %.0f, executing %s %s/sec\n", + sim_name, sim_time, sim_fmt_numeric (inst_per_sec), sim_vm_interval_units); for (uptr = sim_clock_queue; uptr != QUEUE_LIST_END; uptr = uptr->next) { if (uptr == &sim_step_unit) fprintf (st, " Step timer"); @@ -6229,7 +6231,7 @@ else { } } fprintf (st, "asynch latency: %d nanoseconds\n", sim_asynch_latency); -fprintf (st, "asynch instruction latency: %d instructions\n", sim_asynch_inst_latency); +fprintf (st, "asynch instruction latency: %d %s\n", sim_asynch_inst_latency, sim_vm_interval_units); pthread_mutex_unlock (&sim_asynch_lock); sim_mfile = NULL; fprintf (st, "%*.*s", (int)buf.pos, (int)buf.pos, buf.buf); @@ -12365,7 +12367,7 @@ if (exp->buf_size) { fprintf (st, " Buffer Insert Offset: %d\n", exp->buf_ins); fprintf (st, " Buffer Contents: %s\n", bstr); if (default_haltafter) - fprintf (st, " Default HaltAfter: %u instructions\n", (unsigned)default_haltafter); + fprintf (st, " Default HaltAfter: %u %s\n", (unsigned)default_haltafter, sim_vm_interval_units); free (bstr); } if (exp->dptr && (exp->dbit & exp->dptr->dctrl)) @@ -12629,19 +12631,19 @@ else fprintf (st, " No Pending Input Data\n"); if ((snd->next_time - sim_gtime()) > 0) { if (((snd->next_time - sim_gtime()) > (sim_timer_inst_per_sec()/1000000.0)) && ((sim_timer_inst_per_sec()/1000000.0) > 0.0)) - fprintf (st, " Minimum of %d instructions (%d microseconds) before sending first character\n", (int)(snd->next_time - sim_gtime()), + fprintf (st, " Minimum of %d %s (%d microseconds) before sending first character\n", (int)(snd->next_time - sim_gtime()), sim_vm_interval_units, (int)((snd->next_time - sim_gtime())/(sim_timer_inst_per_sec()/1000000.0))); else - fprintf (st, " Minimum of %d instructions before sending first character\n", (int)(snd->next_time - sim_gtime())); + fprintf (st, " Minimum of %d %s before sending first character\n", (int)(snd->next_time - sim_gtime()), sim_vm_interval_units); } if ((snd->delay > (sim_timer_inst_per_sec()/1000000.0)) && ((sim_timer_inst_per_sec()/1000000.0) > 0.0)) - fprintf (st, " Minimum of %d instructions (%d microseconds) between characters\n", (int)snd->delay, (int)(snd->delay/(sim_timer_inst_per_sec()/1000000.0))); + fprintf (st, " Minimum of %d %s (%d microseconds) between characters\n", (int)snd->delay, sim_vm_interval_units, (int)(snd->delay/(sim_timer_inst_per_sec()/1000000.0))); else - fprintf (st, " Minimum of %d instructions between characters\n", (int)snd->delay); + fprintf (st, " Minimum of %d %s between characters\n", (int)snd->delay, sim_vm_interval_units); if (after) - fprintf (st, " Default delay before first character input is %u instructions\n", after); + fprintf (st, " Default delay before first character input is %u %s\n", after, sim_vm_interval_units); if (delay) - fprintf (st, " Default delay between character input is %u instructions\n", after); + fprintf (st, " Default delay between character input is %u %s\n", after, sim_vm_interval_units); if (snd->dptr && (snd->dbit & snd->dptr->dctrl)) fprintf (st, " Send Debugging via: SET %s DEBUG%s%s\n", sim_dname(snd->dptr), snd->dptr->debflags ? "=" : "", snd->dptr->debflags ? _get_dbg_verb (snd->dbit, snd->dptr, NULL) : ""); return SCPE_OK; @@ -13605,6 +13607,12 @@ for (hblock = astrings; (htext = *hblock) != NULL; hblock++) { case 'S': appendText (topic, sim_name, strlen (sim_name)); break; + case 'C': + appendText (topic, sim_vm_interval_units, strlen (sim_vm_interval_units)); + break; + case 'I': + appendText (topic, sim_vm_step_unit, strlen (sim_vm_step_unit)); + break; case '%': appendText (topic, "%", 1); break; diff --git a/scp.h b/scp.h index 120145d6..d9706124 100644 --- a/scp.h +++ b/scp.h @@ -365,6 +365,7 @@ extern int32 sim_switches; extern int32 sim_switch_number; extern int32 sim_quiet; extern int32 sim_step; +extern const char *sim_vm_step_units; /* Simulator can change this */ extern t_stat sim_last_cmd_stat; /* Command Status */ extern FILE *sim_log; /* log file */ extern FILEREF *sim_log_ref; /* log file file reference */ @@ -429,6 +430,7 @@ extern t_bool (*sim_vm_fprint_stopped) (FILE *st, t_stat reason); extern t_value (*sim_vm_pc_value) (void); extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs); extern const char **sim_clock_precalibrate_commands; +extern const char *sim_vm_interval_units; /* Core SCP libraries can potentially have unit test routines. diff --git a/scp_help.h b/scp_help.h index 19b46137..7b9504c2 100644 --- a/scp_help.h +++ b/scp_help.h @@ -47,6 +47,8 @@ * * %D - Inserts the name of the device (e.g. "DTA"). * * %U - Inserts the name of the unit (e.g. "DTA0"). * * %S - Inserts the current simulator name (e.g. "PDP-10") + * * %C - Inserts the current value of the sim_vm_interval_units string + * * %I - Inserts the current value of the sim_vm_step_units string * * %#s - Inserts the string suppled in the "#"th optional argument to the help * routine. # starts with 1. Any embedded newlines will cause following * text to be indented. diff --git a/sim_timer.c b/sim_timer.c index 61a5cae1..4684c840 100644 --- a/sim_timer.c +++ b/sim_timer.c @@ -1706,9 +1706,9 @@ if (w_ms > 1000) /* too long a wait (runa sim_debug (DBG_TIK, &sim_timer_dev, "waiting too long: w_ms=%d usecs, w_idle=%d usecs, sim_interval=%d, rtc->currd=%d\n", w_ms, w_idle, sim_interval, rtc->currd); in_nowait = FALSE; if (sim_clock_queue == QUEUE_LIST_END) - sim_debug (DBG_IDL, &sim_timer_dev, "sleeping for %d ms - pending event in %d instructions\n", w_ms, sim_interval); + sim_debug (DBG_IDL, &sim_timer_dev, "sleeping for %d ms - pending event in %d %s\n", w_ms, sim_interval, sim_vm_interval_units); else - sim_debug (DBG_IDL, &sim_timer_dev, "sleeping for %d ms - pending event on %s in %d instructions\n", w_ms, sim_uname(sim_clock_queue), sim_interval); + sim_debug (DBG_IDL, &sim_timer_dev, "sleeping for %d ms - pending event on %s in %d %s\n", w_ms, sim_uname(sim_clock_queue), sim_interval, sim_vm_interval_units); cyc_since_idle = sim_gtime() - sim_idle_end_time; /* time since prior idle */ act_ms = sim_idle_ms_sleep (w_ms); /* wait */ rtc->clock_time_idled += act_ms; @@ -1720,9 +1720,9 @@ else sim_interval = sim_interval - act_cyc; /* count down sim_interval to reflect idle period */ sim_idle_end_time = sim_gtime(); /* save idle completed time */ if (sim_clock_queue == QUEUE_LIST_END) - sim_debug (DBG_IDL, &sim_timer_dev, "slept for %d ms - pending event in %d instructions\n", act_ms, sim_interval); + sim_debug (DBG_IDL, &sim_timer_dev, "slept for %d ms - pending event in %d %s\n", act_ms, sim_interval, sim_vm_interval_units); else - sim_debug (DBG_IDL, &sim_timer_dev, "slept for %d ms - pending event on %s in %d instructions\n", act_ms, sim_uname(sim_clock_queue), sim_interval); + sim_debug (DBG_IDL, &sim_timer_dev, "slept for %d ms - pending event on %s in %d %s\n", act_ms, sim_uname(sim_clock_queue), sim_interval, sim_vm_interval_units); return TRUE; } @@ -1976,8 +1976,8 @@ switch (sim_throt_state) { sim_set_throt (0, NULL); /* disable throttling */ return SCPE_OK; } - sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc() Not enough time. %d ms executing %.f instructions.\n", - (int)delta_ms, delta_inst); + sim_debug (DBG_THR, &sim_timer_dev, "sim_throt_svc() Not enough time. %d ms executing %.f %s.\n", + (int)delta_ms, delta_inst, sim_vm_interval_units); sim_throt_wait = (int32)(delta_inst * SIM_THROT_WMUL); sim_throt_inst_start = sim_gtime(); sim_idle_ms_sleep (sim_idle_rate_ms); /* start on a tick boundart to calibrate */ @@ -1997,8 +1997,8 @@ switch (sim_throt_state) { a_cps, d_cps); sim_throt_state = SIM_THROT_STATE_INIT; sim_printf ("*********** WARNING ***********\n"); - sim_printf ("Host CPU is too slow to simulate %s instructions per second\n", sim_fmt_numeric(d_cps)); - sim_printf ("Host CPU can only simulate %s instructions per second\n", sim_fmt_numeric(sim_throt_peak_cps)); + sim_printf ("Host CPU is too slow to simulate %s %s per second\n", sim_fmt_numeric(d_cps), sim_vm_interval_units); + sim_printf ("Host CPU can only simulate %s %s per second\n", sim_fmt_numeric(sim_throt_peak_cps), sim_vm_interval_units); sim_printf ("Throttling disabled.\n"); sim_set_throt (0, NULL); return SCPE_OK; @@ -2993,7 +2993,7 @@ else { } rtc = &rtcs[tmr]; if ((NULL == rtc->clock_unit) || (rtc->hz == 0)) { - sim_debug (DBG_TIM, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d) - no clock activating after %d instructions\n", sim_uname (uptr), tmr, ticks, ticks * (rtc->currd ? rtc->currd : rtcs[sim_rtcn_calibrated_tmr ()].currd)); + sim_debug (DBG_TIM, &sim_timer_dev, "sim_clock_coschedule_tmr(%s, tmr=%d, ticks=%d) - no clock activating after %d %s\n", sim_uname (uptr), tmr, ticks, ticks * (rtc->currd ? rtc->currd : rtcs[sim_rtcn_calibrated_tmr ()].currd), sim_vm_interval_units); return sim_activate (uptr, ticks * (rtc->currd ? rtc->currd : rtcs[sim_rtcn_calibrated_tmr ()].currd)); } else {