示例#1
0
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();
}
示例#2
0
void snes_term(void) { snes_power(); }
示例#3
0
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;
	}
}
示例#4
0
void snes_reset(void) { snes_power(); }