static void EMSCRIPTEN_KEEPALIVE emu_reset(void) { /* Reset the scheduler */ sched_reset(); sched.items[SCHED_THROTTLE].clock = CLOCK_27M; sched.items[SCHED_THROTTLE].proc = throttle_interval_event; /* Reset the ASIC */ asic_reset(); /* Drain everything */ cpuEvents = EVENT_NONE; sched_update_next_event(); }
static void emu_reset() { cpu_events &= EVENT_DEBUG_STEP; sched_reset(); sched.items[SCHED_THROTTLE].clock = CLOCK_27M; sched.items[SCHED_THROTTLE].proc = throttle_interval_event; asic_reset(); /* Drain everything */ cycle_count_delta = 0; sched_update_next_event(0); }
void emu_loop(bool reset) { #if OS_HAS_PAGEFAULT_HANDLER os_exception_frame_t seh_frame = { NULL, NULL }; os_faulthandler_arm(&seh_frame); #endif if(reset) { reset: emu_reset(); } gdbstub_reset(); addr_cache_flush(); flush_translations(); sched_update_next_event(0); exiting = false; // clang segfaults with that, for an iOS build :( #ifndef NO_SETJMP // Workaround for LLVM bug #18974 while(__builtin_setjmp(restart_after_exception)){}; #endif while (!exiting) { sched_process_pending_events(); while (!exiting && cycle_count_delta < 0) { if (cpu_events & EVENT_RESET) { gui_status_printf("Reset"); goto reset; } if (cpu_events & (EVENT_FIQ | EVENT_IRQ)) { // Align PC in case the interrupt occurred immediately after a jump if (arm.cpsr_low28 & 0x20) arm.reg[15] &= ~1; else arm.reg[15] &= ~3; if (cpu_events & EVENT_WAITING) arm.reg[15] += 4; // Skip over wait instruction arm.reg[15] += 4; cpu_exception((cpu_events & EVENT_FIQ) ? EX_FIQ : EX_IRQ); } cpu_events &= ~EVENT_WAITING; if (arm.cpsr_low28 & 0x20) cpu_thumb_loop(); else cpu_arm_loop(); } } #if OS_HAS_PAGEFAULT_HANDLER os_faulthandler_unarm(&seh_frame); #endif }