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: {
//must call cartridge.load_cart_...() before calling modifySystemState(LoadCartridge)
if(SNES::cartridge.loaded() == false) break;
cartridge.loadCheats();
application.power = true;
application.pause = false;
SNES::system.power();
//warn if unsupported hardware detected
string chip;
if(0);
else if(SNES::cartridge.has_dsp3()) chip = "DSP-3";
else if(SNES::cartridge.has_st0011()) chip = "ST-0011";
else if(SNES::cartridge.has_st0018()) chip = "ST-0018";
if(chip != "") {
QMessageBox::warning(mainWindow, "Warning", string()
<< "
Warning:
The " << chip << " chip was detected, which is not fully emulated yet.
"
<< "It is unlikely that this title will work properly.
");
}
showMessage(string()
<< "Loaded " << cartridge.name
<< (cartridge.patchApplied ? ", and applied UPS patch." : "."));
mainWindow->setWindowTitle(string() << cartridge.name << " - " << SNES::Info::Name << " v" << SNES::Info::Version);
#if defined(DEBUGGER)
debugger->echo(string() << "Loaded " << cartridge.name << ".
");
#endif
} break;
case UnloadCartridge: {
if(SNES::cartridge.loaded() == false) break; //no cart to unload?
cartridge.saveCheats();
SNES::system.unload(); //flush all memory to memory::* devices
cartridge.saveMemory(); //save memory to disk
SNES::cartridge.unload(); //deallocate memory
application.power = false;
application.pause = true;
showMessage(string() << "Unloaded " << cartridge.name << ".");
mainWindow->setWindowTitle(string() << SNES::Info::Name << " v" << SNES::Info::Version);
} break;
case PowerOn: {
if(SNES::cartridge.loaded() == false || application.power == true) break;
application.power = true;
application.pause = false;
SNES::system.power();
showMessage("Power on.");
} break;
case PowerOff: {
if(SNES::cartridge.loaded() == false || application.power == false) break;
application.power = false;
application.pause = true;
showMessage("Power off.");
} break;
case PowerCycle: {
if(SNES::cartridge.loaded() == false) break;
application.power = true;
application.pause = false;
SNES::system.power();
showMessage("System power was cycled.");
} break;
case Reset: {
if(SNES::cartridge.loaded() == false || application.power == false) break;
application.pause = false;
SNES::system.reset();
showMessage("System was reset.");
} break;
}
mainWindow->syncUi();
#if defined(DEBUGGER)
debugger->modifySystemState(systemState);
debugger->synchronize();
#endif
cheatEditorWindow->synchronize();
cheatFinderWindow->synchronize();
stateManagerWindow->reload();
}