diff --git a/scp.c b/scp.c index ebcbf226..187d70d3 100644 --- a/scp.c +++ b/scp.c @@ -602,8 +602,34 @@ static DEBTAB sim_dflt_debug[] = { {0} }; -static UNIT sim_step_unit = { UDATA (&step_svc, 0, 0) }; -static UNIT sim_expect_unit = { UDATA (&expect_svc, 0, 0) }; +static const char *sim_int_step_description (DEVICE *dptr) +{ +return "Step/Next facility"; +} + +static UNIT sim_step_unit = { UDATA (&step_svc, 0, 0) }; +DEVICE sim_step_dev = { + "INT-STEP", &sim_step_unit, NULL, NULL, + 1, 0, 0, 0, 0, 0, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, DEV_NOSAVE, 0, + NULL, NULL, NULL, NULL, NULL, NULL, + sim_int_step_description}; + +static const char *sim_int_expect_description (DEVICE *dptr) +{ +return "Expect facility"; +} + +static UNIT sim_expect_unit = { UDATA (&expect_svc, 0, 0) }; +DEVICE sim_expect_dev = { + "INT-EXPECT", &sim_expect_unit, NULL, NULL, + 1, 0, 0, 0, 0, 0, + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, DEV_NOSAVE, 0, + NULL, NULL, NULL, NULL, NULL, NULL, + sim_int_expect_description}; + #if defined USE_INT64 static const char *sim_si64 = "64b data"; #else @@ -2388,6 +2414,8 @@ sim_log = NULL; if (sim_emax <= 0) sim_emax = 1; sim_timer_init (); +sim_register_internal_device (&sim_expect_dev); +sim_register_internal_device (&sim_step_dev); if ((stat = sim_ttinit ()) != SCPE_OK) { fprintf (stderr, "Fatal terminal initialization error\n%s\n", @@ -9403,12 +9431,12 @@ t_stat sim_register_internal_device (DEVICE *dptr) { uint32 i; -for (i = 0; (sim_devices[i] != NULL); i++) - if (sim_devices[i] == dptr) - return SCPE_OK; for (i = 0; i < sim_internal_device_count; i++) if (sim_internal_devices[i] == dptr) return SCPE_OK; +for (i = 0; (sim_devices[i] != NULL); i++) + if (sim_devices[i] == dptr) + return SCPE_OK; ++sim_internal_device_count; sim_internal_devices = (DEVICE **)realloc(sim_internal_devices, (sim_internal_device_count+1)*sizeof(*sim_internal_devices)); sim_internal_devices[sim_internal_device_count-1] = dptr; @@ -10419,11 +10447,15 @@ do { sim_interval = sim_clock_queue->time; else sim_interval = noqueue_time = NOQUEUE_WAIT; - sim_debug (SIM_DBG_EVENT, sim_dflt_dev, "Processing Event for %s\n", sim_uname (uptr)); AIO_EVENT_BEGIN(uptr); - if (uptr->usecs_remaining) + if (uptr->usecs_remaining) { + sim_debug (SIM_DBG_EVENT, sim_dflt_dev, "Requeueing %s after %.0f usecs\n", sim_uname (uptr), uptr->usecs_remaining); reason = sim_timer_activate_after (uptr, uptr->usecs_remaining); + } else { + sim_debug (SIM_DBG_EVENT, sim_dflt_dev, "Processing Event for %s\n", sim_uname (uptr)); + if (uptr->uname && ((*uptr->uname == '\0') || (*uptr->uname == ' '))) + reason = SCPE_OK; /* do nothing breakpoint location */ if (uptr->action != NULL) reason = uptr->action (uptr); else @@ -10607,10 +10639,10 @@ AIO_CANCEL(uptr); AIO_UPDATE_QUEUE; if (sim_clock_queue == QUEUE_LIST_END) return SCPE_OK; -sim_debug (SIM_DBG_EVENT, sim_dflt_dev, "Canceling Event for %s\n", sim_uname(uptr)); UPDATE_SIM_TIME; /* update sim time */ if (!sim_is_active (uptr)) return SCPE_OK; +sim_debug (SIM_DBG_EVENT, sim_dflt_dev, "Canceling Event for %s\n", sim_uname(uptr)); nptr = QUEUE_LIST_END; if (sim_clock_queue == uptr) { diff --git a/sim_timer.c b/sim_timer.c index ae8d77a5..f340fb47 100644 --- a/sim_timer.c +++ b/sim_timer.c @@ -1037,6 +1037,7 @@ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { sim_stop_unit.action = &sim_timer_stop_svc; SIM_INTERNAL_UNIT.flags = UNIT_IDLE; sim_register_internal_device (&sim_timer_dev); /* Register Clock Assist device */ +sim_register_internal_device (&sim_throttle_dev); /* Register Throttle Device */ sim_throttle_unit.action = &sim_throt_svc; sim_register_clock_unit_tmr (&SIM_INTERNAL_UNIT, SIM_INTERNAL_CLK); sim_idle_enab = FALSE; /* init idle off */ @@ -1670,7 +1671,6 @@ else { sim_throt_wait = sim_throt_val; } } -sim_register_internal_device (&sim_throttle_dev); /* Register Throttle Device */ if (sim_throt_type == SIM_THROT_SPC) /* Set initial value while correct one is determined */ sim_throt_cps = (int32)((1000.0 * sim_throt_val) / (double)sim_throt_sleep_time); else @@ -1974,7 +1974,7 @@ if ((stat == SCPE_OK) && if (fabs(skew) > fabs(rtc_clock_skew_max[tmr])) rtc_clock_skew_max[tmr] = skew; } - /* First gather the queued events that are scheduled for now */ + /* Gather any queued events which are scheduled for right now */ do { cptr = sim_clock_cosched_queue[tmr]; sim_clock_cosched_queue[tmr] = cptr->next; @@ -1996,11 +1996,11 @@ if ((stat == SCPE_OK) && cptr->cancel = NULL; cptr->time = 0; if (cptr->usecs_remaining) { - sim_debug (DBG_QUE, &sim_timer_dev, " remnant: %.0f - next %s after cosched interval: %d ticks\n", cptr->usecs_remaining, (sptr != QUEUE_LIST_END) ? sim_uname (sptr) : "", sim_cosched_interval[tmr]); + sim_debug (DBG_QUE, &sim_timer_dev, "Rescheduling %s after %.0f usecs %s%s\n", sim_uname (cptr), cptr->usecs_remaining, (sptr != QUEUE_LIST_END) ? "- next: " : "", (sptr != QUEUE_LIST_END) ? sim_uname (sptr) : ""); sim_timer_activate_after (cptr, cptr->usecs_remaining); } else { - sim_debug (DBG_QUE, &sim_timer_dev, " - next %s after cosched interval: %d ticks\n", (sptr != QUEUE_LIST_END) ? sim_uname (sptr) : "", sim_cosched_interval[tmr]); + sim_debug (DBG_QUE, &sim_timer_dev, "Activating %s now %s%s\n", sim_uname (cptr), (sptr != QUEUE_LIST_END) ? "- next: " : "", (sptr != QUEUE_LIST_END) ? sim_uname (sptr) : ""); _sim_activate (cptr, 0); } } @@ -2501,12 +2501,13 @@ for (tmr=0; tmr<=SIM_NTIMERS; tmr++) } if (sim_is_active (uptr)) /* already active? */ return SCPE_OK; -uptr->usecs_remaining = 0; if (usec_delay <= 0.0) { - sim_debug (DBG_TIM, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - invalid usec value\n", + sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - invalid usec value\n", sim_uname(uptr), usec_delay); + uptr->usecs_remaining = 0.0; return SCPE_ARG; } +uptr->usecs_remaining = 0.0; /* * Handle long delays by aligning with the calibrated timer's calibration * activities. Delays which would expire prior to the next calibration @@ -2532,8 +2533,8 @@ if ((sim_calb_tmr != -1) && (rtc_hz[sim_calb_tmr])) { /* Calibrated Timer if (inst_delay_d > (double)inst_til_calib) { /* long wait? */ stat = sim_clock_coschedule_tmr (uptr, sim_calb_tmr, ticks_til_calib - 1); uptr->usecs_remaining = (stat == SCPE_OK) ? usec_delay - usecs_til_calib : 0.0; - sim_debug (DBG_TIM, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - coscheduling with with calibrated timer(%d), ticks=%d, usecs_remaining=%.0f usecs, inst_til_tick=%d\n", - sim_uname(uptr), usec_delay, sim_calb_tmr, ticks_til_calib, uptr->usecs_remaining, inst_til_tick); + sim_debug (DBG_TIM, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - coscheduling with with calibrated timer(%d), ticks=%d, usecs_remaining=%.0f usecs, inst_til_tick=%d, ticks_til_calib=%d\n", + sim_uname(uptr), usec_delay, sim_calb_tmr, ticks_til_calib, uptr->usecs_remaining, inst_til_tick, ticks_til_calib); sim_debug (DBG_CHK, &sim_timer_dev, "sim_timer_activate_after(%s, %.0f usecs) - result = %.0f usecs, %.0f usecs\n", sim_uname(uptr), usec_delay, sim_timer_activate_time_usecs (ouptr), sim_timer_activate_time_usecs (uptr)); return stat; @@ -3018,7 +3019,7 @@ if (uptr->cancel == &_sim_coschedule_cancel) { accum += cptr->time; if (cptr == uptr) { result = uptr->usecs_remaining + ceil(1000000.0 * ((rtc_currd[tmr] * accum) + sim_activate_time (&sim_timer_units[tmr]) - 1) / sim_timer_inst_per_sec ()); - sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) coscheduled - %.0f usecs, inst_per_sec=%.0f, tmr=%d, ticksize=%d, ticks=%d, inst_til_tick=%d\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), tmr, rtc_currd[tmr], accum, sim_activate_time (&sim_timer_units[tmr]) - 1); + sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) coscheduled - %.0f usecs, inst_per_sec=%.0f, tmr=%d, ticksize=%d, ticks=%d, inst_til_tick=%d, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), tmr, rtc_currd[tmr], accum, sim_activate_time (&sim_timer_units[tmr]) - 1, uptr->usecs_remaining); return result; } } @@ -3027,17 +3028,17 @@ if (uptr->cancel == &_sim_coschedule_cancel) { for (tmr=0; tmr<=SIM_NTIMERS; tmr++) { if ((uptr == sim_clock_unit[tmr]) && (uptr->next)) { result = sim_clock_unit[tmr]->usecs_remaining + (1000000.0 * (sim_activate_time (&sim_timer_units[tmr]) - 1)) / sim_timer_inst_per_sec (); - sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec ()); + sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), uptr->usecs_remaining); return result; } if ((uptr == &sim_timer_units[tmr]) && (uptr->next)){ result = uptr->usecs_remaining + (1000000.0 * (sim_activate_time (uptr) - 1)) / sim_timer_inst_per_sec (); - sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec ()); + sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), uptr->usecs_remaining); return result; } } result = uptr->usecs_remaining + (1000000.0 * (sim_activate_time (uptr) - 1)) / sim_timer_inst_per_sec (); -sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec ()); +sim_debug (DBG_QUE, &sim_timer_dev, "sim_timer_activate_time_usecs(%s) clock - %.0f usecs, inst_per_sec=%.0f, usecs_remaining=%.0f\n", sim_uname (uptr), result, sim_timer_inst_per_sec (), uptr->usecs_remaining); return result; /* Not found. */ } diff --git a/sim_tmxr.c b/sim_tmxr.c index 3f4cc81d..98461014 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -4136,18 +4136,18 @@ if (!(uptr->dynflags & UNIT_TM_POLL)) return _sim_activate (uptr, interval); /* Handle the non mux case */ sooner = _tmxr_activate_delay (uptr, interval); if (sooner != interval) { - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %d instructions rather than %d instructions\n", sim_uname (uptr), sooner, interval); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate() - scheduling %s after %d instructions rather than %d instructions\n", sim_uname (uptr), sooner, interval); return _sim_activate (uptr, sooner); /* Handle the busy case */ } #if defined(SIM_ASYNCH_MUX) if (!sim_asynch_enabled) { - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %d instructions\n", sim_uname (uptr), interval); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate() - scheduling %s after %d instructions\n", sim_uname (uptr), interval); return _sim_activate (uptr, interval); } -sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s asynchronously instead of %d instructions\n", sim_uname (uptr), interval); +sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate() - scheduling %s asynchronously instead of %d instructions\n", sim_uname (uptr), interval); return SCPE_OK; #else -sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %d instructions\n", sim_uname (uptr), interval); +sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate() - scheduling %s after %d instructions\n", sim_uname (uptr), interval); return _sim_activate (uptr, interval); #endif } @@ -4170,21 +4170,21 @@ if (!(uptr->dynflags & UNIT_TM_POLL)) sooner = _tmxr_activate_delay (uptr, 0x7FFFFFFF); if (sooner != 0x7FFFFFFF) { if (sooner < 0) { - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s for %u usecs produced overflow interval %d instructions, sceduling for %d instructions\n", sim_uname (uptr), usecs_walltime, sooner, 0x7FFFFFFF); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate_after() - scheduling %s for %u usecs produced overflow interval %d instructions, sceduling for %d instructions\n", sim_uname (uptr), usecs_walltime, sooner, 0x7FFFFFFF); sooner = _tmxr_activate_delay (uptr, 0x7FFFFFFF); /* Breakpoint here on unexpected value */ } - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %d instructions rather than %u usecs\n", sim_uname (uptr), sooner, usecs_walltime); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate_after() - scheduling %s after %d instructions rather than %u usecs\n", sim_uname (uptr), sooner, usecs_walltime); return _sim_activate (uptr, sooner); /* Handle the busy case directly */ } #if defined(SIM_ASYNCH_MUX) if (!sim_asynch_enabled) { - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %u usecs\n", sim_uname (uptr), usecs_walltime); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate_after() - scheduling %s after %u usecs\n", sim_uname (uptr), usecs_walltime); return _sim_activate_after (uptr, (double)usecs_walltime); } -sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s asynchronously instead of %u usecs\n", sim_uname (uptr), usecs_walltime); +sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate_after() - scheduling %s asynchronously instead of %u usecs\n", sim_uname (uptr), usecs_walltime); return SCPE_OK; #else -sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %u usecs\n", sim_uname (uptr), usecs_walltime); +sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_activate_after() - scheduling %s after %.0f usecs\n", sim_uname (uptr), (double)usecs_walltime); return _sim_activate_after (uptr, (double)usecs_walltime); #endif } @@ -4220,17 +4220,17 @@ if (!(uptr->dynflags & UNIT_TM_POLL)) return sim_clock_coschedule_tmr (uptr, tmr, ticks); /* Handle the non mux case */ sooner = _tmxr_activate_delay (uptr, interval); if (sooner != interval) { - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "scheduling %s after %d instructions rather than %d ticks (%d instructions)\n", sim_uname (uptr), sooner, ticks, interval); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_clock_coschedule_tmr() - scheduling %s after %d instructions rather than %d ticks (%d instructions)\n", sim_uname (uptr), sooner, ticks, interval); return _sim_activate (uptr, sooner); /* Handle the busy case directly */ } #if defined(SIM_ASYNCH_MUX) if (!sim_asynch_enabled) { - sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "coscheduling %s after interval %d ticks\n", sim_uname (uptr), ticks); + sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_clock_coschedule_tmr() - coscheduling %s after interval %d ticks\n", sim_uname (uptr), ticks); return sim_clock_coschedule (uptr, tmr, ticks); } return SCPE_OK; #else -sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "coscheduling %s after interval %d ticks\n", sim_uname (uptr), ticks); +sim_debug (TIMER_DBG_MUX, &sim_timer_dev, "tmxr_clock_coschedule_tmr() - coscheduling %s after interval %d ticks\n", sim_uname (uptr), ticks); return sim_clock_coschedule_tmr (uptr, tmr, ticks); #endif }