bsnes/higan/target-bsnes/program/game.cpp

113 lines
3.3 KiB
C++

auto Program::load() -> void {
unload();
for(auto& media : emulator->media) {
if(media.type != "sfc") continue;
Emulator::audio.reset(2, audio->frequency());
if(emulator->load(media.id)) {
gameQueue = {};
connectDevices();
emulator->power();
presentation->setTitle(emulator->title());
presentation->resetSystem.setEnabled(true);
presentation->unloadGame.setEnabled(true);
presentation->toolsMenu.setVisible(true);
presentation->pauseEmulation.setChecked(false);
presentation->resizeViewport();
toolsWindow->cheatEditor.loadCheats();
toolsWindow->stateManager.loadStates();
string locations = superNintendo.location;
if(auto location = gameBoy.location) locations.append("|", location);
presentation->addRecentGame(locations);
}
break;
}
}
auto Program::loadFile(string location) -> vector<uint8_t> {
if(Location::suffix(location) == ".zip") {
Decode::ZIP archive;
if(archive.open(location)) {
for(auto& file : archive.file) {
auto type = Location::suffix(file.name);
if(type == ".sfc" || type == ".smc" || type == ".gb" || type == ".gbc" || type == ".bs" || type == ".st") {
return archive.extract(file);
}
}
}
} else {
return file::read(location);
}
}
auto Program::loadSuperNintendo(string location) -> void {
auto rom = loadFile(location);
if(!rom) return;
//Heuristics::SuperFamicom() call will remove copier header from rom if present
auto heuristics = Heuristics::SuperFamicom(rom, location);
superNintendo.manifest = heuristics.manifest();
superNintendo.document = BML::unserialize(superNintendo.manifest);
superNintendo.location = location;
uint offset = 0;
if(auto size = heuristics.programRomSize()) {
superNintendo.program.resize(size);
memory::copy(&superNintendo.program[0], &rom[offset], size);
offset += size;
}
if(auto size = heuristics.dataRomSize()) {
superNintendo.data.resize(size);
memory::copy(&superNintendo.data[0], &rom[offset], size);
offset += size;
}
if(auto size = heuristics.expansionRomSize()) {
superNintendo.expansion.resize(size);
memory::copy(&superNintendo.expansion[0], &rom[offset], size);
offset += size;
}
if(auto size = heuristics.firmwareRomSize()) {
superNintendo.firmware.resize(size);
memory::copy(&superNintendo.firmware[0], &rom[offset], size);
offset += size;
}
}
auto Program::loadGameBoy(string location) -> void {
auto rom = loadFile(location);
if(!rom) return;
auto heuristics = Heuristics::GameBoy(rom, location);
gameBoy.manifest = heuristics.manifest();
gameBoy.document = BML::unserialize(gameBoy.manifest);
gameBoy.location = location;
gameBoy.program = rom;
}
auto Program::save() -> void {
if(!emulator->loaded()) return;
emulator->save();
}
auto Program::unload() -> void {
if(!emulator->loaded()) return;
toolsWindow->cheatEditor.saveCheats();
toolsWindow->setVisible(false);
saveRecoveryState();
emulator->unload();
superNintendo = {};
gameBoy = {};
bsMemory = {};
sufamiTurbo[0] = {};
sufamiTurbo[1] = {};
presentation->setTitle({"bsnes v", Emulator::Version});
presentation->resetSystem.setEnabled(false);
presentation->unloadGame.setEnabled(false);
presentation->toolsMenu.setVisible(false);
presentation->clearViewport();
}