SA-1: Fixed timing regressions

Memory handlers did not have the _memoryType value set, which caused some memory accesses to be much faster than expected
This commit is contained in:
Sour 2020-03-01 18:24:33 -05:00
parent 1d6253d2e5
commit 6539b92502
21 changed files with 28 additions and 29 deletions

View file

@ -6,6 +6,8 @@
class BaseCoprocessor : public ISerializable, public IMemoryHandler class BaseCoprocessor : public ISerializable, public IMemoryHandler
{ {
public: public:
using IMemoryHandler::IMemoryHandler;
virtual void Reset() = 0; virtual void Reset() = 0;
virtual void ProcessEndOfFrame() { } virtual void ProcessEndOfFrame() { }

View file

@ -9,7 +9,7 @@
#include "RamHandler.h" #include "RamHandler.h"
#include "EmuSettings.h" #include "EmuSettings.h"
BsxCart::BsxCart(Console* console, BsxMemoryPack* memPack) BsxCart::BsxCart(Console* console, BsxMemoryPack* memPack) : BaseCoprocessor(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_memoryManager = _console->GetMemoryManager().get(); _memoryManager = _console->GetMemoryManager().get();

View file

@ -5,7 +5,7 @@
#include "EmuSettings.h" #include "EmuSettings.h"
#include "../Utilities/Serializer.h" #include "../Utilities/Serializer.h"
BsxSatellaview::BsxSatellaview(Console* console, IMemoryHandler* bBusHandler) BsxSatellaview::BsxSatellaview(Console* console, IMemoryHandler* bBusHandler) : IMemoryHandler(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_memoryManager = console->GetMemoryManager().get(); _memoryManager = console->GetMemoryManager().get();

View file

@ -15,7 +15,7 @@ private:
Sa1* _sa1; Sa1* _sa1;
public: public:
CpuBwRamHandler(IMemoryHandler* handler, Sa1State* state, Sa1* sa1) CpuBwRamHandler(IMemoryHandler* handler, Sa1State* state, Sa1* sa1) : IMemoryHandler(handler->GetMemoryType())
{ {
_handler = handler; _handler = handler;
_sa1 = sa1; _sa1 = sa1;

View file

@ -13,7 +13,7 @@
//TODO: CPU shouldn't have access to PRG ROM while the CX4 is loading from PRG ROM //TODO: CPU shouldn't have access to PRG ROM while the CX4 is loading from PRG ROM
//TODO: Timings are apparently not perfect (desync in MMX2 intro) //TODO: Timings are apparently not perfect (desync in MMX2 intro)
Cx4::Cx4(Console* console) Cx4::Cx4(Console* console) : BaseCoprocessor(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_memoryType = SnesMemoryType::Register; _memoryType = SnesMemoryType::Register;

View file

@ -12,7 +12,7 @@
#include "BatteryManager.h" #include "BatteryManager.h"
#include "../Utilities/HexUtilities.h" #include "../Utilities/HexUtilities.h"
Gsu::Gsu(Console *console, uint32_t gsuRamSize) Gsu::Gsu(Console *console, uint32_t gsuRamSize) : BaseCoprocessor(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_memoryManager = console->GetMemoryManager().get(); _memoryManager = console->GetMemoryManager().get();

View file

@ -10,9 +10,8 @@ private:
IMemoryHandler *_handler; IMemoryHandler *_handler;
public: public:
GsuRamHandler(GsuState &state, IMemoryHandler *handler) GsuRamHandler(GsuState &state, IMemoryHandler *handler) : IMemoryHandler(SnesMemoryType::GsuWorkRam)
{ {
_memoryType = SnesMemoryType::GsuWorkRam;
_handler = handler; _handler = handler;
_state = &state; _state = &state;
} }

View file

@ -10,9 +10,8 @@ private:
IMemoryHandler *_romHandler; IMemoryHandler *_romHandler;
public: public:
GsuRomHandler(GsuState &state, IMemoryHandler *romHandler) GsuRomHandler(GsuState &state, IMemoryHandler *romHandler) : IMemoryHandler(SnesMemoryType::PrgRom)
{ {
_memoryType = SnesMemoryType::PrgRom;
_romHandler = romHandler; _romHandler = romHandler;
_state = &state; _state = &state;
} }

View file

@ -8,6 +8,13 @@ protected:
SnesMemoryType _memoryType; SnesMemoryType _memoryType;
public: public:
IMemoryHandler(SnesMemoryType memType)
{
_memoryType = memType;
}
virtual ~IMemoryHandler() {}
virtual uint8_t Read(uint32_t addr) = 0; virtual uint8_t Read(uint32_t addr) = 0;
virtual uint8_t Peek(uint32_t addr) = 0; virtual uint8_t Peek(uint32_t addr) = 0;
virtual void PeekBlock(uint32_t addr, uint8_t *output) = 0; virtual void PeekBlock(uint32_t addr, uint8_t *output) = 0;
@ -19,9 +26,4 @@ public:
} }
virtual AddressInfo GetAbsoluteAddress(uint32_t address) = 0; virtual AddressInfo GetAbsoluteAddress(uint32_t address) = 0;
//virtual void GetMemoryRanges(MemoryRanges &ranges) = 0;
//virtual uint8_t PeekRAM(uint16_t addr) { return 0; }
virtual ~IMemoryHandler() {}
}; };

View file

@ -13,7 +13,7 @@
#include "FirmwareHelper.h" #include "FirmwareHelper.h"
#include "../Utilities/FolderUtilities.h" #include "../Utilities/FolderUtilities.h"
NecDsp::NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programRom, vector<uint8_t> &dataRom) NecDsp::NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programRom, vector<uint8_t> &dataRom) : BaseCoprocessor(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_type = type; _type = type;

View file

@ -4,7 +4,7 @@
#include "MemoryManager.h" #include "MemoryManager.h"
#include "MemoryMappings.h" #include "MemoryMappings.h"
Obc1::Obc1(Console* console, uint8_t* saveRam, uint32_t saveRamSize) Obc1::Obc1(Console* console, uint8_t* saveRam, uint32_t saveRamSize) : BaseCoprocessor(SnesMemoryType::Register)
{ {
MemoryMappings *mappings = console->GetMemoryManager()->GetMemoryMappings(); MemoryMappings *mappings = console->GetMemoryManager()->GetMemoryMappings();
mappings->RegisterHandler(0x00, 0x3F, 0x6000, 0x7FFF, this); mappings->RegisterHandler(0x00, 0x3F, 0x6000, 0x7FFF, this);

View file

@ -13,7 +13,7 @@ protected:
uint32_t _offset; uint32_t _offset;
public: public:
RamHandler(uint8_t *ram, uint32_t offset, uint32_t size, SnesMemoryType memoryType) RamHandler(uint8_t *ram, uint32_t offset, uint32_t size, SnesMemoryType memoryType) : IMemoryHandler(memoryType)
{ {
_ram = ram + offset; _ram = ram + offset;
_offset = offset; _offset = offset;

View file

@ -13,12 +13,11 @@ private:
ControlManager *_controlManager; ControlManager *_controlManager;
public: public:
RegisterHandlerA(DmaController *dmaController, InternalRegisters *regs, ControlManager *controlManager) RegisterHandlerA(DmaController *dmaController, InternalRegisters *regs, ControlManager *controlManager) : IMemoryHandler(SnesMemoryType::Register)
{ {
_regs = regs; _regs = regs;
_dmaController = dmaController; _dmaController = dmaController;
_controlManager = controlManager; _controlManager = controlManager;
_memoryType = SnesMemoryType::Register;
} }
uint8_t Read(uint32_t addr) override uint8_t Read(uint32_t addr) override

View file

@ -9,7 +9,7 @@
#include "CheatManager.h" #include "CheatManager.h"
#include "../Utilities/Serializer.h" #include "../Utilities/Serializer.h"
RegisterHandlerB::RegisterHandlerB(Console *console, Ppu * ppu, Spc * spc, uint8_t * workRam) RegisterHandlerB::RegisterHandlerB(Console *console, Ppu * ppu, Spc * spc, uint8_t * workRam) : IMemoryHandler(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_cheatManager = console->GetCheatManager().get(); _cheatManager = console->GetCheatManager().get();
@ -19,7 +19,6 @@ RegisterHandlerB::RegisterHandlerB(Console *console, Ppu * ppu, Spc * spc, uint8
_msu1 = console->GetMsu1().get(); _msu1 = console->GetMsu1().get();
_workRam = workRam; _workRam = workRam;
_wramPosition = 0; _wramPosition = 0;
_memoryType = SnesMemoryType::Register;
} }
uint8_t RegisterHandlerB::Read(uint32_t addr) uint8_t RegisterHandlerB::Read(uint32_t addr)

View file

@ -15,7 +15,7 @@
#include "MessageManager.h" #include "MessageManager.h"
#include "../Utilities/HexUtilities.h" #include "../Utilities/HexUtilities.h"
Sa1::Sa1(Console* console) Sa1::Sa1(Console* console) : BaseCoprocessor(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_memoryManager = console->GetMemoryManager().get(); _memoryManager = console->GetMemoryManager().get();

View file

@ -37,7 +37,7 @@ private:
} }
public: public:
Sa1BwRamHandler(uint8_t* bwRam, uint32_t bwRamSize, Sa1State* state) Sa1BwRamHandler(uint8_t* bwRam, uint32_t bwRamSize, Sa1State* state) : IMemoryHandler(SnesMemoryType::SaveRam)
{ {
_ram = bwRam; _ram = bwRam;
_mask = bwRamSize - 1; _mask = bwRamSize - 1;

View file

@ -18,10 +18,9 @@ private:
} }
public: public:
Sa1IRamHandler(uint8_t *ram) Sa1IRamHandler(uint8_t *ram) : IMemoryHandler(SnesMemoryType::Sa1InternalRam)
{ {
_ram = ram; _ram = ram;
_memoryType = SnesMemoryType::Sa1InternalRam;
} }
uint8_t Read(uint32_t addr) override uint8_t Read(uint32_t addr) override

View file

@ -11,7 +11,7 @@ private:
Sa1State* _state; Sa1State* _state;
public: public:
Sa1VectorHandler(IMemoryHandler* handler, Sa1State* state) Sa1VectorHandler(IMemoryHandler* handler, Sa1State* state) : IMemoryHandler(handler->GetMemoryType())
{ {
_handler = handler; _handler = handler;
_state = state; _state = state;

View file

@ -6,7 +6,7 @@
#include "MemoryManager.h" #include "MemoryManager.h"
#include "MemoryMappings.h" #include "MemoryMappings.h"
Sdd1::Sdd1(Console* console) Sdd1::Sdd1(Console* console) : BaseCoprocessor(SnesMemoryType::Register)
{ {
//This handler is used to dynamically map the ROM based on the banking registers //This handler is used to dynamically map the ROM based on the banking registers
_sdd1Mmc.reset(new Sdd1Mmc(_state, console->GetCartridge().get())); _sdd1Mmc.reset(new Sdd1Mmc(_state, console->GetCartridge().get()));

View file

@ -3,7 +3,7 @@
#include "Sdd1Types.h" #include "Sdd1Types.h"
#include "BaseCartridge.h" #include "BaseCartridge.h"
Sdd1Mmc::Sdd1Mmc(Sdd1State &state, BaseCartridge *cart) Sdd1Mmc::Sdd1Mmc(Sdd1State &state, BaseCartridge *cart) : IMemoryHandler(SnesMemoryType::Register)
{ {
_romHandlers = &cart->GetPrgRomHandlers(); _romHandlers = &cart->GetPrgRomHandlers();
_handlerMask = (uint32_t)((*_romHandlers).size() - 1); _handlerMask = (uint32_t)((*_romHandlers).size() - 1);

View file

@ -10,7 +10,7 @@
#include "MessageManager.h" #include "MessageManager.h"
#include "../Utilities/HexUtilities.h" #include "../Utilities/HexUtilities.h"
Spc7110::Spc7110(Console* console, bool useRtc) Spc7110::Spc7110(Console* console, bool useRtc) : BaseCoprocessor(SnesMemoryType::Register)
{ {
_console = console; _console = console;
_cart = console->GetCartridge().get(); _cart = console->GetCartridge().get();