diff --git a/Core/DebugTypes.h b/Core/DebugTypes.h index 1d9613c..1e19281 100644 --- a/Core/DebugTypes.h +++ b/Core/DebugTypes.h @@ -18,7 +18,8 @@ enum class SnesMemoryType VideoRam, SpriteRam, CGRam, - Register + Register, + SpcRam, }; struct AddressInfo diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index 0c98916..e670f06 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -33,7 +33,7 @@ Debugger::Debugger(shared_ptr console) _codeDataLogger.reset(new CodeDataLogger(console->GetCartridge()->DebugGetPrgRomSize())); _disassembler.reset(new Disassembler(console, _codeDataLogger)); _traceLogger.reset(new TraceLogger(this, _console)); - _memoryDumper.reset(new MemoryDumper(_ppu, _memoryManager, console->GetCartridge())); + _memoryDumper.reset(new MemoryDumper(_ppu, console->GetSpc(), _memoryManager, console->GetCartridge())); _breakpointManager.reset(new BreakpointManager(this)); _ppuTools.reset(new PpuTools(_console.get(), _ppu.get())); _eventManager.reset(new EventManager(this, _cpu.get(), _ppu.get())); diff --git a/Core/MemoryDumper.cpp b/Core/MemoryDumper.cpp index 78acf84..c26b597 100644 --- a/Core/MemoryDumper.cpp +++ b/Core/MemoryDumper.cpp @@ -2,14 +2,16 @@ #include "Debugger.h" #include "MemoryManager.h" #include "Ppu.h" +#include "Spc.h" #include "MemoryDumper.h" #include "BaseCartridge.h" #include "VideoDecoder.h" #include "DebugTypes.h" -MemoryDumper::MemoryDumper(shared_ptr ppu, shared_ptr memoryManager, shared_ptr cartridge) +MemoryDumper::MemoryDumper(shared_ptr ppu, shared_ptr spc, shared_ptr memoryManager, shared_ptr cartridge) { _ppu = ppu; + _spc = spc; _memoryManager = memoryManager; _cartridge = cartridge; } @@ -30,6 +32,7 @@ void MemoryDumper::SetMemoryState(SnesMemoryType type, uint8_t *buffer, uint32_t case SnesMemoryType::VideoRam: memcpy(_ppu->GetVideoRam(), buffer, length); break; case SnesMemoryType::SpriteRam: memcpy(_ppu->GetSpriteRam(), buffer, length); break; case SnesMemoryType::CGRam: memcpy(_ppu->GetCgRam(), buffer, length); break; + case SnesMemoryType::SpcRam: memcpy(_spc->GetSpcRam(), buffer, length); break; } } @@ -43,6 +46,7 @@ uint32_t MemoryDumper::GetMemorySize(SnesMemoryType type) case SnesMemoryType::VideoRam: return Ppu::VideoRamSize; case SnesMemoryType::SpriteRam: return Ppu::SpriteRamSize; case SnesMemoryType::CGRam: return Ppu::CgRamSize; + case SnesMemoryType::SpcRam: return Spc::SpcRamSize; } return 0; } @@ -62,6 +66,7 @@ void MemoryDumper::GetMemoryState(SnesMemoryType type, uint8_t *buffer) case SnesMemoryType::VideoRam: memcpy(buffer, _ppu->GetVideoRam(), Ppu::VideoRamSize); break; case SnesMemoryType::SpriteRam: memcpy(buffer, _ppu->GetSpriteRam(), Ppu::SpriteRamSize); break; case SnesMemoryType::CGRam: memcpy(buffer, _ppu->GetCgRam(), Ppu::CgRamSize); break; + case SnesMemoryType::SpcRam: memcpy(buffer, _spc->GetSpcRam(), Spc::SpcRamSize); break; } } @@ -85,9 +90,10 @@ void MemoryDumper::SetMemoryValue(SnesMemoryType memoryType, uint32_t address, u case SnesMemoryType::WorkRam: _memoryManager->DebugGetWorkRam()[address] = value; break; case SnesMemoryType::SaveRam: _cartridge->DebugGetSaveRam()[address] = value; break; - case SnesMemoryType::VideoRam: _ppu->GetVideoRam()[address & (Ppu::VideoRamSize - 1)] = value; - case SnesMemoryType::SpriteRam: _ppu->GetSpriteRam()[address % Ppu::SpriteRamSize] = value; break; - case SnesMemoryType::CGRam: _ppu->GetCgRam()[address & (Ppu::CgRamSize - 1)] = value; break; + case SnesMemoryType::VideoRam: _ppu->GetVideoRam()[address] = value; + case SnesMemoryType::SpriteRam: _ppu->GetSpriteRam()[address] = value; break; + case SnesMemoryType::CGRam: _ppu->GetCgRam()[address] = value; break; + case SnesMemoryType::SpcRam: _spc->GetSpcRam()[address] = value; break; } } @@ -104,9 +110,10 @@ uint8_t MemoryDumper::GetMemoryValue(SnesMemoryType memoryType, uint32_t address case SnesMemoryType::WorkRam: return _memoryManager->DebugGetWorkRam()[address]; case SnesMemoryType::SaveRam: return _cartridge->DebugGetSaveRam()[address]; - case SnesMemoryType::VideoRam: return _ppu->GetVideoRam()[address & (Ppu::VideoRamSize - 1)]; - case SnesMemoryType::SpriteRam: return _ppu->GetSpriteRam()[address % Ppu::SpriteRamSize]; - case SnesMemoryType::CGRam: return _ppu->GetCgRam()[address & (Ppu::CgRamSize - 1)]; + case SnesMemoryType::VideoRam: return _ppu->GetVideoRam()[address]; + case SnesMemoryType::SpriteRam: return _ppu->GetSpriteRam()[address]; + case SnesMemoryType::CGRam: return _ppu->GetCgRam()[address]; + case SnesMemoryType::SpcRam: return _spc->GetSpcRam()[address]; } return 0; diff --git a/Core/MemoryDumper.h b/Core/MemoryDumper.h index d47f736..ae89eff 100644 --- a/Core/MemoryDumper.h +++ b/Core/MemoryDumper.h @@ -6,17 +6,19 @@ class MemoryManager; class BaseCartridge; class Ppu; +class Spc; enum class SnesMemoryType; class MemoryDumper { private: shared_ptr _ppu; + shared_ptr _spc; shared_ptr _memoryManager; shared_ptr _cartridge; public: - MemoryDumper(shared_ptr ppu, shared_ptr memoryManager, shared_ptr cartridge); + MemoryDumper(shared_ptr ppu, shared_ptr spc, shared_ptr memoryManager, shared_ptr cartridge); uint32_t GetMemorySize(SnesMemoryType type); void GetMemoryState(SnesMemoryType type, uint8_t *buffer); diff --git a/Core/Spc.cpp b/Core/Spc.cpp index c48dddb..d9d17d1 100644 --- a/Core/Spc.cpp +++ b/Core/Spc.cpp @@ -213,6 +213,11 @@ void Spc::ProcessEndFrame() _dsp->set_output(_soundBuffer, Spc::SampleBufferSize >> 1); } +uint8_t* Spc::GetSpcRam() +{ + return _ram; +} + void Spc::Serialize(Serializer &s) { s.Stream(_state.A, _state.Cycle, _state.PC, _state.PS, _state.SP, _state.X, _state.Y); diff --git a/Core/Spc.h b/Core/Spc.h index 2122a56..d8adf94 100644 --- a/Core/Spc.h +++ b/Core/Spc.h @@ -10,9 +10,11 @@ class SPC_DSP; class Spc : public ISerializable { +public: + static constexpr int SpcRamSize = 0x10000; + private: static constexpr int SampleBufferSize = 0x100000; - static constexpr int SpcRamSize = 0x10000; static constexpr uint16_t ResetVector = 0xFFFE; shared_ptr _console; @@ -243,5 +245,7 @@ public: void ProcessEndFrame(); + uint8_t* GetSpcRam(); + void Serialize(Serializer &s) override; }; \ No newline at end of file diff --git a/UI/Debugger/frmMemoryTools.cs b/UI/Debugger/frmMemoryTools.cs index 3c50cb8..722aada 100644 --- a/UI/Debugger/frmMemoryTools.cs +++ b/UI/Debugger/frmMemoryTools.cs @@ -156,7 +156,8 @@ namespace Mesen.GUI.Debugger cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.VideoRam)); cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.CGRam)); cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpriteRam)); - + cboMemoryType.Items.Add("-"); + cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpcRam)); cboMemoryType.SelectedIndex = 0; cboMemoryType.SetEnumValue(originalValue); diff --git a/UI/Interop/DebugApi.cs b/UI/Interop/DebugApi.cs index 614c656..e778134 100644 --- a/UI/Interop/DebugApi.cs +++ b/UI/Interop/DebugApi.cs @@ -118,6 +118,8 @@ namespace Mesen.GUI VideoRam, SpriteRam, CGRam, + Register, + SpcRam } public class AddressInfo