void run() { input->poll_input(); if(circuit && !settings.pause) { circuit->run(2.5e-3 / Circuit::timescale); // Run 2.5 ms //circuit->run(100.0e-6 / Circuit::timescale); // Run 100 us uint64_t emu_time = circuit->global_time * 1000000.0 * Circuit::timescale; // Make sure real time is at least mostly caught up if(settings.throttle) while(circuit->rtc.get_usecs() + 50000 < emu_time); // If real time is too far ahead, adjust timer if(circuit->rtc.get_usecs() > emu_time + 100000) circuit->rtc += (circuit->rtc.get_usecs() - emu_time - 100000); if(real_time.get_usecs() > 1000000) { setStatusText({"FPS: ", circuit->video.frame_count}); circuit->video.frame_count = 0; real_time += 1000000; } //if(emu_time > 1.56e6) onClose(); } else { SDL_Delay(10); if(settings.pause && statusText() != "Paused") setStatusText("Paused"); else if(!settings.pause && statusText() != VERSION_STRING) setStatusText(VERSION_STRING); if(circuit == nullptr && (focused() || video_window.focused())) drawLogo(); } if(input_window.active_selector) { auto key_state = Keyboard::state(); for(unsigned i = 0; i < key_state.size(); i++) if(key_state[i]) input_window.active_selector->assign({KeyAssignment::KEYBOARD, i}); //Check Joystick Events SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_JOYBUTTONDOWN: input_window.active_selector->assign({KeyAssignment::JOYSTICK_BUTTON, event.jbutton.button, event.jbutton.which}); break; case SDL_JOYAXISMOTION: if(!input_window.active_selector->allow_joystick) break; if(abs(event.jaxis.value) > 8192) { unsigned axis = (event.jaxis.axis << 1) | (event.jaxis.value > 0); input_window.active_selector->assign({KeyAssignment::JOYSTICK_AXIS, axis, event.jaxis.which}); } default: break; } } } else // Handle user interface inputs { UserInterfaceState ui_state = UserInterfaceState::getCurrent(*this); // Don't update ui inputs while main window is in the background if(focused()) { if(ui_state.quit && !prev_ui_state.quit) { onClose(); } if(ui_state.pause && !prev_ui_state.pause) { settings.pause = !settings.pause; pause_item.setChecked(settings.pause); } if(ui_state.fullscreen && !prev_ui_state.fullscreen) { fullscreen_item.setChecked(!settings.fullscreen); fullscreen_item.onToggle(); } if(ui_state.throttle && !prev_ui_state.throttle) { throttle_item.setChecked(!settings.throttle); throttle_item.onToggle(); } } prev_ui_state = ui_state; } }