modifySystemState(system_state_t systemState)1 void Utility::modifySystemState(system_state_t systemState) {
2   diskBrowser->hide();  //avoid edge case oddities (eg movie playback window still open from previous game)
3   state.resetHistory();  //do not allow rewinding past a destructive system action
4   movie.stop();  //movies cannot continue to record after destructive system actions
5 
6   video.clear();
7   audio.clear();
8 
9   switch(systemState) {
10     case LoadCartridge: {
11       //must call cartridge.load_cart_...() before calling modifySystemState(LoadCartridge)
12       if(SNES::cartridge.loaded() == false) break;
13       cartridge.loadCheats();
14 
15       application.power = true;
16       application.pause = false;
17       SNES::system.power();
18 
19       //warn if unsupported hardware detected
20       string chip;
21       if(0);
22       else if(SNES::cartridge.has_dsp3())  chip = "DSP3";
23       else if(SNES::cartridge.has_st011()) chip = "ST011";
24       else if(SNES::cartridge.has_st018()) chip = "ST018";
25       if(chip != "") {
26         QMessageBox::warning(mainWindow, "Warning", string()
27         << "<p><b>Warning:</b><br> The " << chip << " chip was detected, which is not fully emulated yet.<br>"
28         << "It is unlikely that this title will work properly.</p>");
29       }
30 
31       showMessage(string()
32       << "Loaded " << cartridge.name
33       << (cartridge.patchApplied ? ", and applied UPS patch." : "."));
34       mainWindow->setWindowTitle(string() << cartridge.name << " - " << bsnesTitle << " v" << bsnesVersion);
35       #if defined(DEBUGGER)
36       debugger->echo(string() << "Loaded " << cartridge.name << ".<br>");
37       #endif
38     } break;
39 
40     case UnloadCartridge: {
41       if(SNES::cartridge.loaded() == false) break;  //no cart to unload?
42       cartridge.saveCheats();
43 
44       SNES::system.unload();     //flush all memory to memory::* devices
45       cartridge.saveMemory();    //save memory to disk
46       SNES::cartridge.unload();  //deallocate memory
47 
48       application.power = false;
49       application.pause = true;
50 
51       showMessage(string() << "Unloaded " << cartridge.name << ".");
52       mainWindow->setWindowTitle(string() << bsnesTitle << " v" << bsnesVersion);
53     } break;
54 
55     case PowerOn: {
56       if(SNES::cartridge.loaded() == false || application.power == true) break;
57 
58       application.power = true;
59       application.pause = false;
60       SNES::system.power();
61 
62       showMessage("Power on.");
63     } break;
64 
65     case PowerOff: {
66       if(SNES::cartridge.loaded() == false || application.power == false) break;
67 
68       application.power = false;
69       application.pause = true;
70 
71       showMessage("Power off.");
72     } break;
73 
74     case PowerCycle: {
75       if(SNES::cartridge.loaded() == false) break;
76 
77       application.power = true;
78       application.pause = false;
79       SNES::system.power();
80 
81       showMessage("System power was cycled.");
82     } break;
83 
84     case Reset: {
85       if(SNES::cartridge.loaded() == false || application.power == false) break;
86 
87       application.pause = false;
88       SNES::system.reset();
89 
90       showMessage("System was reset.");
91     } break;
92   }
93 
94   mainWindow->syncUi();
95   #if defined(DEBUGGER)
96   debugger->modifySystemState(systemState);
97   debugger->synchronize();
98   #endif
99   cheatEditorWindow->synchronize();
100   cheatFinderWindow->synchronize();
101   stateManagerWindow->reload();
102 }
103