SGB: Use GB/GBC mode if SGB bios rom cannot be found/loaded

This commit is contained in:
Sour 2020-06-18 22:42:51 -04:00
parent 6592805fc0
commit e310ff30d8
4 changed files with 20 additions and 9 deletions

View file

@ -66,7 +66,7 @@ shared_ptr<BaseCartridge> 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();

View file

@ -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();

View file

@ -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<uint8_t> 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;

View file

@ -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);