From c77415581f33e8de248074996a54f10f8f19949e Mon Sep 17 00:00:00 2001 From: Sour Date: Sat, 20 Jul 2024 21:39:16 +0900 Subject: [PATCH] NES: Disable Game Genie bus conflicts emulation when running an unknown iNES 1.0 ROM Otherwise, Game Genie codes that could have worked on hardware did not work as expected because of the bus conflicts. This could occur when e.g trying to use cheats on a romhack, etc. --- Core/NES/BaseMapper.cpp | 7 +++++++ Core/NES/BaseMapper.h | 3 +++ Core/NES/GameDatabase.cpp | 6 ------ Core/NES/NesConsole.cpp | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Core/NES/BaseMapper.cpp b/Core/NES/BaseMapper.cpp index 33d185fcd..0a2c4291c 100644 --- a/Core/NES/BaseMapper.cpp +++ b/Core/NES/BaseMapper.cpp @@ -478,6 +478,11 @@ void BaseMapper::InitializeChrRam(int32_t chrRamSize) } } +bool BaseMapper::HasDefaultWorkRam() +{ + return _hasDefaultWorkRam; +} + void BaseMapper::SetupDefaultWorkRam() { //Setup a default work/save ram in 0x6000-0x7FFF space @@ -576,6 +581,7 @@ void BaseMapper::Initialize(NesConsole* console, RomData& romData) if(romData.SaveRamSize == -1) { _saveRamSize = HasBattery() ? GetSaveRamSize() : 0; + _hasDefaultWorkRam = _saveRamSize > 0; } else if(ForceSaveRamSize()) { _saveRamSize = GetSaveRamSize(); } else { @@ -584,6 +590,7 @@ void BaseMapper::Initialize(NesConsole* console, RomData& romData) if(romData.WorkRamSize == -1) { _workRamSize = HasBattery() ? 0 : GetWorkRamSize(); + _hasDefaultWorkRam = _workRamSize > 0; } else if(ForceWorkRamSize()) { _workRamSize = GetWorkRamSize(); } else { diff --git a/Core/NES/BaseMapper.h b/Core/NES/BaseMapper.h index 5964a0fd0..8f2a619a5 100644 --- a/Core/NES/BaseMapper.h +++ b/Core/NES/BaseMapper.h @@ -33,6 +33,7 @@ class BaseMapper : public INesMemoryHandler, public ISerializable uint32_t _internalRamMask = 0x7FF; bool _hasBusConflicts = false; + bool _hasDefaultWorkRam = false; bool _allowRegisterRead = false; bool _isReadRegisterAddr[0x10000] = {}; @@ -170,6 +171,8 @@ class BaseMapper : public INesMemoryHandler, public ISerializable GameSystem GetGameSystem(); PpuModel GetPpuModel(); + + bool HasDefaultWorkRam(); virtual void SetRegion(ConsoleRegion region) { } virtual void ProcessCpuClock() { } diff --git a/Core/NES/GameDatabase.cpp b/Core/NES/GameDatabase.cpp index 4a96e65b1..77dea69ce 100644 --- a/Core/NES/GameDatabase.cpp +++ b/Core/NES/GameDatabase.cpp @@ -217,12 +217,6 @@ void GameDatabase::SetGameInfo(uint32_t romCrc, RomData &romData, bool updateRom bool foundInDatabase = result != _gameDatabase.end(); if(foundInDatabase) { info = result->second; - if(!forHeaderlessRom && info.Board == "UNK") { - //Boards marked as UNK should only be used for headerless roms (since their data is unverified) - romData.Info.DatabaseInfo = {}; - return; - } - MessageManager::Log("[DB] Game found in database"); MessageManager::Log("[DB] Mapper: " + std::to_string(info.MapperID) + " Sub: " + std::to_string(GetSubMapper(info))); diff --git a/Core/NES/NesConsole.cpp b/Core/NES/NesConsole.cpp index b719371db..e56fcda27 100644 --- a/Core/NES/NesConsole.cpp +++ b/Core/NES/NesConsole.cpp @@ -616,7 +616,7 @@ void NesConsole::InitializeInputDevices(GameInputType inputType, GameSystem syst void NesConsole::ProcessCheatCode(InternalCheatCode& code, uint32_t addr, uint8_t& value) { if(code.Type == CheatType::NesGameGenie && addr >= 0xC020) { - if(GetNesConfig().DisableGameGenieBusConflicts) { + if(GetNesConfig().DisableGameGenieBusConflicts || _mapper->HasDefaultWorkRam()) { return; }