void Utility::modifySystemState(system_state_t systemState) { fileBrowser->close(); //avoid edge case oddities (eg movie playback window still open from previous game) state.resetHistory(); //do not allow rewinding past a destructive system action movie.stop(); //movies cannot continue to record after destructive system actions video.clear(); audio.clear(); switch(systemState) { case LoadCartridge: { if(application.cartridgeLoaded == true) break; application.cartridgeLoaded = true; cartridge.loadCheats(); application.power = true; application.pause = false; snes_power(); showMessage(string() << "Loaded " << cartridge.name << (cartridge.patchApplied ? ", and applied UPS patch." : ".")); mainWindow->setWindowTitle(string() << cartridge.name << " - " << ProgramName); #if defined(DEBUGGER) debugger->echo(string() << "Loaded " << cartridge.name << ".<br>"); #endif } break; case UnloadCartridge: { if(application.cartridgeLoaded == false) break; //no cart to unload? application.cartridgeLoaded = false; cartridge.saveCheats(); cartridge.saveMemory(); //save memory to disk snes_unload_cartridge(); //deallocate memory application.power = false; application.pause = true; showMessage(string() << "Unloaded " << cartridge.name << "."); mainWindow->setWindowTitle(string() << ProgramName); } break; case PowerOn: { if(application.cartridgeLoaded == false || application.power == true) break; application.power = true; application.pause = false; snes_power(); showMessage("Power on."); } break; case PowerOff: { if(application.cartridgeLoaded == false || application.power == false) break; application.power = false; application.pause = true; showMessage("Power off."); } break; case PowerCycle: { if(application.cartridgeLoaded == false) break; application.power = true; application.pause = false; snes_power(); showMessage("System power was cycled."); } break; case Reset: { if(application.cartridgeLoaded == false || application.power == false) break; application.pause = false; snes_reset(); showMessage("System was reset."); } break; } mainWindow->syncUi(); #if defined(DEBUGGER) debugger->modifySystemState(systemState); debugger->synchronize(); #endif cheatEditorWindow->synchronize(); cheatFinderWindow->synchronize(); stateManagerWindow->reload(); }
void snes_term(void) { snes_power(); }
void emuthread() { for(;;) { switch(s_EmulationControl.command) { case eMessage_CMD_init: snes_init(); break; case eMessage_CMD_power: snes_power(); break; case eMessage_CMD_reset: snes_reset(); break; case eMessage_CMD_term: snes_term(); break; case eMessage_CMD_unload_cartridge: snes_unload_cartridge(); break; case eMessage_CMD_load_cartridge_normal: EMUTHREAD_handleCommand_LoadCartridgeNormal(); break; case eMessage_CMD_load_cartridge_super_game_boy: EMUTHREAD_handleCommand_LoadCartridgeSuperGameBoy(); break; case eMessage_CMD_serialize: EMUTHREAD_handle_CMD_serialize(); break; case eMessage_CMD_unserialize: EMUTHREAD_handle_CMD_unserialize(); break; case eMessage_CMD_run: SIG_FlushAudio(); //we could avoid this if we saved the current thread before jumping back to co_control, instead of always jumping back to co_emu //in effect, we're scrambling the scheduler //EDIT - well, we changed that, but.. we still want this probably, for debugging and stuff for(;;) { SNES::scheduler.sync = SNES::Scheduler::SynchronizeMode::None; SNES::scheduler.clearExitReason(); SNES::scheduler.enter(); if(SNES::scheduler.exit_reason() == SNES::Scheduler::ExitReason::FrameEvent) { SNES::video.update(); break; } //not used yet if(SNES::scheduler.exit_reason() == SNES::Scheduler::ExitReason::DebuggerEvent) break; } SIG_FlushAudio(); break; } s_EmulationControl.exitReason = eEmulationExitReason_CMD_Complete; SETCONTROL; } }
void snes_reset(void) { snes_power(); }