SCP: Added routine to format time in seconds down to usecs

This commit is contained in:
Mark Pizzolato 2016-11-04 22:59:33 -07:00
parent 67213a53da
commit efabcb9856
2 changed files with 83 additions and 14 deletions

74
scp.c
View file

@ -228,6 +228,7 @@
#include <signal.h> #include <signal.h>
#include <ctype.h> #include <ctype.h>
#include <time.h> #include <time.h>
#include <math.h>
#if defined(_WIN32) #if defined(_WIN32)
#include <direct.h> #include <direct.h>
#include <io.h> #include <io.h>
@ -4617,6 +4618,8 @@ if (sim_clock_queue == QUEUE_LIST_END)
fprintf (st, "%s event queue empty, time = %.0f, executing %.0f instructios/sec\n", fprintf (st, "%s event queue empty, time = %.0f, executing %.0f instructios/sec\n",
sim_name, sim_time, sim_timer_inst_per_sec ()); sim_name, sim_time, sim_timer_inst_per_sec ());
else { else {
const char *tim;
fprintf (st, "%s event queue status, time = %.0f, executing %.0f instructions/sec\n", fprintf (st, "%s event queue status, time = %.0f, executing %.0f instructions/sec\n",
sim_name, sim_time, sim_timer_inst_per_sec ()); sim_name, sim_time, sim_timer_inst_per_sec ());
accum = 0; accum = 0;
@ -4627,12 +4630,16 @@ else {
if (uptr == &sim_expect_unit) if (uptr == &sim_expect_unit)
fprintf (st, " Expect fired"); fprintf (st, " Expect fired");
else else
if ((dptr = find_dev_from_unit (uptr)) != NULL) if ((dptr = find_dev_from_unit (uptr)) != NULL) {
fprintf (st, " %s", sim_dname (dptr)); fprintf (st, " %s", sim_dname (dptr));
if (dptr->numunits > 1)
fprintf (st, " unit %d", (int32) (uptr - dptr->units));
}
else else
fprintf (st, " Unknown"); fprintf (st, " Unknown");
fprintf (st, " at %d (%.0f usecs) %s\n", accum + uptr->time, tim = sim_fmt_secs((accum + uptr->time)/sim_timer_inst_per_sec ());
((accum + uptr->time)*1000000.0)/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)" : ""); (uptr->flags & UNIT_IDLE) ? " (Idle capable)" : "");
accum = accum + uptr->time; accum = accum + uptr->time;
} }
@ -8657,6 +8664,67 @@ if (sim_deb && (sim_deb != stdout))
return SCPE_OK; 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 /* Event queue package
sim_activate add entry to event queue sim_activate add entry to event queue

1
scp.h
View file

@ -168,6 +168,7 @@ int Fgetc (FILE *f);
t_stat fprint_val (FILE *stream, t_value val, uint32 rdx, uint32 wid, uint32 fmt); 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 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); 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); char *read_line (char *cptr, int32 size, FILE *stream);
void fprint_reg_help (FILE *st, DEVICE *dptr); void fprint_reg_help (FILE *st, DEVICE *dptr);
void fprint_set_help (FILE *st, DEVICE *dptr); void fprint_set_help (FILE *st, DEVICE *dptr);