diff --git a/Core/BaseCartridge.cpp b/Core/BaseCartridge.cpp index 21d829f..fe689ae 100644 --- a/Core/BaseCartridge.cpp +++ b/Core/BaseCartridge.cpp @@ -66,7 +66,7 @@ shared_ptr BaseCartridge::CreateCartridge(Console* console, Virtu return nullptr; } } else if(fileExt == ".gb" || fileExt == ".gbc") { - if(cart->LoadGameboy(romFile)) { + if(cart->LoadGameboy(romFile, true)) { return cart; } else { return nullptr; @@ -620,9 +620,9 @@ void BaseCartridge::LoadSpc() SetupCpuHalt(); } -bool BaseCartridge::LoadGameboy(VirtualFile &romFile) +bool BaseCartridge::LoadGameboy(VirtualFile &romFile, bool sgbEnabled) { - _gameboy.reset(Gameboy::Create(_console, romFile)); + _gameboy.reset(Gameboy::Create(_console, romFile, sgbEnabled)); if(!_gameboy) { return false; } @@ -632,10 +632,16 @@ bool BaseCartridge::LoadGameboy(VirtualFile &romFile) if(_gameboy->IsSgb()) { EmulationConfig cfg = _console->GetSettings()->GetEmulationConfig(); - if(!FirmwareHelper::LoadSgbFirmware(_console, &_prgRom, _prgRomSize, cfg.UseSgb2)) { - return false; + if(FirmwareHelper::LoadSgbFirmware(_console, &_prgRom, _prgRomSize, cfg.UseSgb2)) { + LoadRom(); + if(_coprocessorType != CoprocessorType::SGB) { + //SGB bios file isn't a recognized SGB bios, try again without SGB mode + return LoadGameboy(romFile, false); + } + } else { + //Couldn't load the SGB bios, try again with in GB/GBC mode + return LoadGameboy(romFile, false); } - LoadRom(); } else { _coprocessorType = CoprocessorType::Gameboy; SetupCpuHalt(); diff --git a/Core/BaseCartridge.h b/Core/BaseCartridge.h index f9d65f4..e54590b 100644 --- a/Core/BaseCartridge.h +++ b/Core/BaseCartridge.h @@ -74,7 +74,7 @@ private: void LoadRom(); void LoadSpc(); - bool LoadGameboy(VirtualFile& romFile); + bool LoadGameboy(VirtualFile& romFile, bool sgbEnabled); void SetupCpuHalt(); void InitCoprocessor(); void LoadEmbeddedFirmware(); diff --git a/Core/Gameboy.cpp b/Core/Gameboy.cpp index b63dbff..2ed58a8 100644 --- a/Core/Gameboy.cpp +++ b/Core/Gameboy.cpp @@ -19,7 +19,7 @@ #include "../Utilities/VirtualFile.h" #include "../Utilities/Serializer.h" -Gameboy* Gameboy::Create(Console* console, VirtualFile &romFile) +Gameboy* Gameboy::Create(Console* console, VirtualFile &romFile, bool sgbEnabled) { vector romData; romFile.ReadFile(romData); @@ -63,6 +63,11 @@ Gameboy* Gameboy::Create(Console* console, VirtualFile &romFile) } } + if(!sgbEnabled && model == GameboyModel::SuperGameboy) { + //SGB bios isn't available, use gameboy color mode instead + model = GameboyModel::GameboyColor; + } + gb->_model = model; bool cgbMode = gb->_model == GameboyModel::GameboyColor; diff --git a/Core/Gameboy.h b/Core/Gameboy.h index b199c46..7cbef3e 100644 --- a/Core/Gameboy.h +++ b/Core/Gameboy.h @@ -60,7 +60,7 @@ private: public: static constexpr int HeaderOffset = 0x134; - static Gameboy* Create(Console* console, VirtualFile& romFile); + static Gameboy* Create(Console* console, VirtualFile& romFile, bool sgbEnabled); virtual ~Gameboy(); void PowerOn(SuperGameboy* superGameboy = nullptr);