diff --git a/scp.c b/scp.c index 87b14fa6..558be89a 100644 --- a/scp.c +++ b/scp.c @@ -228,6 +228,7 @@ #include #include #include +#include #if defined(_WIN32) #include #include @@ -4617,6 +4618,8 @@ if (sim_clock_queue == QUEUE_LIST_END) fprintf (st, "%s event queue empty, time = %.0f, executing %.0f instructios/sec\n", sim_name, sim_time, sim_timer_inst_per_sec ()); else { + const char *tim; + fprintf (st, "%s event queue status, time = %.0f, executing %.0f instructions/sec\n", sim_name, sim_time, sim_timer_inst_per_sec ()); accum = 0; @@ -4627,13 +4630,17 @@ else { if (uptr == &sim_expect_unit) fprintf (st, " Expect fired"); else - if ((dptr = find_dev_from_unit (uptr)) != NULL) + if ((dptr = find_dev_from_unit (uptr)) != NULL) { fprintf (st, " %s", sim_dname (dptr)); + if (dptr->numunits > 1) + fprintf (st, " unit %d", (int32) (uptr - dptr->units)); + } else fprintf (st, " Unknown"); - fprintf (st, " at %d (%.0f usecs) %s\n", accum + uptr->time, - ((accum + uptr->time)*1000000.0)/sim_timer_inst_per_sec (), - (uptr->flags & UNIT_IDLE) ? " (Idle capable)" : ""); + tim = sim_fmt_secs((accum + uptr->time)/sim_timer_inst_per_sec ()); + fprintf (st, " at %d%s%s%s%s\n", accum + uptr->time, + (*tim) ? " (" : "", tim, (*tim) ? ")" : "", + (uptr->flags & UNIT_IDLE) ? " (Idle capable)" : ""); accum = accum + uptr->time; } } @@ -8657,6 +8664,67 @@ if (sim_deb && (sim_deb != stdout)) return SCPE_OK; } +const char *sim_fmt_secs (double seconds) +{ +static char buf[60]; +char frac[16] = ""; +char *sign = ""; +double val = seconds; +double days, hours, mins, secs, msecs, usecs; + +if (val == 0.0) + return ""; +if (val < 0.0) { + sign = "-"; + val = -val; + } +days = floor (val / (24.0*60.0*60.0)); +val -= (days * 24.0*60.0*60.0); +hours = floor (val / (60.0*60.0)); +val -= (hours * 60.0 * 60.0); +mins = floor (val / 60.0); +val -= (mins * 60.0); +secs = floor (val); +val -= secs; +val *= 1000.0; +msecs = floor (val); +val -= msecs; +val *= 1000.0; +usecs = floor (val+0.5); +if (usecs == 1000.0) { + usecs = 0.0; + msecs += 1; + } +if ((msecs > 0.0) || (usecs > 0.0)) { + sprintf (frac, ".%03.0f%03.0f", msecs, usecs); + while (frac[strlen (frac) - 1] == '0') + frac[strlen (frac) - 1] = '\0'; + if (strlen (frac) == 1) + frac[0] = '\0'; + } +if (days > 0) + sprintf (buf, "%s%.0f %02.0f:%02.0f:%02.0f%s days", sign, days, hours, mins, secs, frac); +else + if (hours > 0) + sprintf (buf, "%s.0f:%02.0f:%02.0f%s hours", sign, hours, mins, secs, frac); + else + if (mins > 0) + sprintf (buf, "%s%.0f:%02.0f%s minutes", sign, mins, secs, frac); + else + if (secs > 0) + sprintf (buf, "%s%.0f%s seconds", sign, secs, frac); + else + if (msecs > 0) { + if (usecs > 0) + sprintf (buf, "%s%.0f%03.0f usecs", sign, msecs, usecs); + else + sprintf (buf, "%s%.0f msecs", sign, msecs); + } + else + sprintf (buf, "%s%.0f usecs", sign, usecs); +return buf; +} + /* Event queue package sim_activate add entry to event queue diff --git a/scp.h b/scp.h index 7859f114..d20239df 100644 --- a/scp.h +++ b/scp.h @@ -148,7 +148,7 @@ int sim_isprint (char c); int sim_isdigit (char c); int sim_isgraph (char c); int sim_isalnum (char c); -int sim_strncasecmp (const char* string1, const char* string2, size_t len); +int sim_strncasecmp (const char *string1, const char *string2, size_t len); CONST char *get_sim_opt (int32 opt, CONST char *cptr, t_stat *st); const char *put_switches (char *buf, size_t bufsize, uint32 sw); CONST char *get_glyph (const char *iptr, char *optr, char mchar); @@ -162,12 +162,13 @@ t_stat sim_decode_quoted_string (const char *iptr, uint8 *optr, uint32 *osize); char *sim_encode_quoted_string (const uint8 *iptr, uint32 size); void fprint_buffer_string (FILE *st, const uint8 *buf, uint32 size); t_value strtotv (CONST char *cptr, CONST char **endptr, uint32 radix); -int Fprintf (FILE *f, const char* fmt, ...) GCC_FMT_ATTR(2, 3); +int Fprintf (FILE *f, const char *fmt, ...) GCC_FMT_ATTR(2, 3); t_stat sim_set_memory_load_file (const unsigned char *data, size_t size); int Fgetc (FILE *f); t_stat fprint_val (FILE *stream, t_value val, uint32 rdx, uint32 wid, uint32 fmt); t_stat sprint_val (char *buf, t_value val, uint32 rdx, uint32 wid, uint32 fmt); t_stat sim_print_val (t_value val, uint32 radix, uint32 width, uint32 format); +const char *sim_fmt_secs (double seconds); char *read_line (char *cptr, int32 size, FILE *stream); void fprint_reg_help (FILE *st, DEVICE *dptr); void fprint_set_help (FILE *st, DEVICE *dptr); @@ -208,9 +209,9 @@ t_stat show_dev_debug (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, CONST cha const char *sim_error_text (t_stat stat); t_stat sim_string_to_stat (const char *cptr, t_stat *cond); t_stat sim_cancel_step (void); -void sim_printf (const char* fmt, ...) GCC_FMT_ATTR(1, 2); -void sim_perror (const char* msg); -t_stat sim_messagef (t_stat stat, const char* fmt, ...) GCC_FMT_ATTR(2, 3); +void sim_printf (const char *fmt, ...) GCC_FMT_ATTR(1, 2); +void sim_perror (const char *msg); +t_stat sim_messagef (t_stat stat, const char *fmt, ...) GCC_FMT_ATTR(2, 3); void sim_data_trace(DEVICE *dptr, UNIT *uptr, const uint8 *data, const char *position, size_t len, const char *txt, uint32 reason); void sim_debug_bits_hdr (uint32 dbits, DEVICE* dptr, const char *header, BITFIELD* bitdefs, uint32 before, uint32 after, int terminate); @@ -222,17 +223,17 @@ void sim_debug_bits (uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs, #if defined(__cplusplus) #ifdef CANT_USE_MACRO_VA_ARGS #define _sim_debug sim_debug -void sim_debug (uint32 dbits, void* dptr, const char* fmt, ...) GCC_FMT_ATTR(3, 4); +void sim_debug (uint32 dbits, void* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #else -void _sim_debug (uint32 dbits, void* dptr, const char* fmt, ...) GCC_FMT_ATTR(3, 4); +void _sim_debug (uint32 dbits, void* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #define sim_debug(dbits, dptr, ...) do { if (sim_deb && dptr && ((dptr)->dctrl & dbits)) _sim_debug (dbits, dptr, __VA_ARGS__);} while (0) #endif #else #ifdef CANT_USE_MACRO_VA_ARGS #define _sim_debug sim_debug -void sim_debug (uint32 dbits, DEVICE* dptr, const char* fmt, ...) GCC_FMT_ATTR(3, 4); +void sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #else -void _sim_debug (uint32 dbits, DEVICE* dptr, const char* fmt, ...) GCC_FMT_ATTR(3, 4); +void _sim_debug (uint32 dbits, DEVICE* dptr, const char *fmt, ...) GCC_FMT_ATTR(3, 4); #define sim_debug(dbits, dptr, ...) do { if (sim_deb && dptr && ((dptr)->dctrl & dbits)) _sim_debug (dbits, dptr, __VA_ARGS__);} while (0) #endif #endif @@ -299,7 +300,7 @@ extern t_stat parse_sym (CONST char *cptr, t_addr addr, UNIT *uptr, t_value *val The other per-simulator pointers can be overrriden by the init routine */ WEAK extern void (*sim_vm_init) (void); -extern char* (*sim_vm_read) (char *ptr, int32 size, FILE *stream); +extern char *(*sim_vm_read) (char *ptr, int32 size, FILE *stream); extern void (*sim_vm_post) (t_bool from_scp); extern CTAB *sim_vm_cmd; extern void (*sim_vm_sprint_addr) (char *buf, DEVICE *dptr, t_addr addr);