Debugger: Add SPC RAM to memory tools

This commit is contained in:
Sour 2019-03-22 21:38:31 -04:00
parent 66c457771c
commit 75a93f6993
8 changed files with 34 additions and 12 deletions

View file

@ -18,7 +18,8 @@ enum class SnesMemoryType
VideoRam, VideoRam,
SpriteRam, SpriteRam,
CGRam, CGRam,
Register Register,
SpcRam,
}; };
struct AddressInfo struct AddressInfo

View file

@ -33,7 +33,7 @@ Debugger::Debugger(shared_ptr<Console> console)
_codeDataLogger.reset(new CodeDataLogger(console->GetCartridge()->DebugGetPrgRomSize())); _codeDataLogger.reset(new CodeDataLogger(console->GetCartridge()->DebugGetPrgRomSize()));
_disassembler.reset(new Disassembler(console, _codeDataLogger)); _disassembler.reset(new Disassembler(console, _codeDataLogger));
_traceLogger.reset(new TraceLogger(this, _console)); _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)); _breakpointManager.reset(new BreakpointManager(this));
_ppuTools.reset(new PpuTools(_console.get(), _ppu.get())); _ppuTools.reset(new PpuTools(_console.get(), _ppu.get()));
_eventManager.reset(new EventManager(this, _cpu.get(), _ppu.get())); _eventManager.reset(new EventManager(this, _cpu.get(), _ppu.get()));

View file

@ -2,14 +2,16 @@
#include "Debugger.h" #include "Debugger.h"
#include "MemoryManager.h" #include "MemoryManager.h"
#include "Ppu.h" #include "Ppu.h"
#include "Spc.h"
#include "MemoryDumper.h" #include "MemoryDumper.h"
#include "BaseCartridge.h" #include "BaseCartridge.h"
#include "VideoDecoder.h" #include "VideoDecoder.h"
#include "DebugTypes.h" #include "DebugTypes.h"
MemoryDumper::MemoryDumper(shared_ptr<Ppu> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseCartridge> cartridge) MemoryDumper::MemoryDumper(shared_ptr<Ppu> ppu, shared_ptr<Spc> spc, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseCartridge> cartridge)
{ {
_ppu = ppu; _ppu = ppu;
_spc = spc;
_memoryManager = memoryManager; _memoryManager = memoryManager;
_cartridge = cartridge; _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::VideoRam: memcpy(_ppu->GetVideoRam(), buffer, length); break;
case SnesMemoryType::SpriteRam: memcpy(_ppu->GetSpriteRam(), buffer, length); break; case SnesMemoryType::SpriteRam: memcpy(_ppu->GetSpriteRam(), buffer, length); break;
case SnesMemoryType::CGRam: memcpy(_ppu->GetCgRam(), 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::VideoRam: return Ppu::VideoRamSize;
case SnesMemoryType::SpriteRam: return Ppu::SpriteRamSize; case SnesMemoryType::SpriteRam: return Ppu::SpriteRamSize;
case SnesMemoryType::CGRam: return Ppu::CgRamSize; case SnesMemoryType::CGRam: return Ppu::CgRamSize;
case SnesMemoryType::SpcRam: return Spc::SpcRamSize;
} }
return 0; 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::VideoRam: memcpy(buffer, _ppu->GetVideoRam(), Ppu::VideoRamSize); break;
case SnesMemoryType::SpriteRam: memcpy(buffer, _ppu->GetSpriteRam(), Ppu::SpriteRamSize); break; case SnesMemoryType::SpriteRam: memcpy(buffer, _ppu->GetSpriteRam(), Ppu::SpriteRamSize); break;
case SnesMemoryType::CGRam: memcpy(buffer, _ppu->GetCgRam(), Ppu::CgRamSize); 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::WorkRam: _memoryManager->DebugGetWorkRam()[address] = value; break;
case SnesMemoryType::SaveRam: _cartridge->DebugGetSaveRam()[address] = value; break; case SnesMemoryType::SaveRam: _cartridge->DebugGetSaveRam()[address] = value; break;
case SnesMemoryType::VideoRam: _ppu->GetVideoRam()[address & (Ppu::VideoRamSize - 1)] = value; case SnesMemoryType::VideoRam: _ppu->GetVideoRam()[address] = value;
case SnesMemoryType::SpriteRam: _ppu->GetSpriteRam()[address % Ppu::SpriteRamSize] = value; break; case SnesMemoryType::SpriteRam: _ppu->GetSpriteRam()[address] = value; break;
case SnesMemoryType::CGRam: _ppu->GetCgRam()[address & (Ppu::CgRamSize - 1)] = 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::WorkRam: return _memoryManager->DebugGetWorkRam()[address];
case SnesMemoryType::SaveRam: return _cartridge->DebugGetSaveRam()[address]; case SnesMemoryType::SaveRam: return _cartridge->DebugGetSaveRam()[address];
case SnesMemoryType::VideoRam: return _ppu->GetVideoRam()[address & (Ppu::VideoRamSize - 1)]; case SnesMemoryType::VideoRam: return _ppu->GetVideoRam()[address];
case SnesMemoryType::SpriteRam: return _ppu->GetSpriteRam()[address % Ppu::SpriteRamSize]; case SnesMemoryType::SpriteRam: return _ppu->GetSpriteRam()[address];
case SnesMemoryType::CGRam: return _ppu->GetCgRam()[address & (Ppu::CgRamSize - 1)]; case SnesMemoryType::CGRam: return _ppu->GetCgRam()[address];
case SnesMemoryType::SpcRam: return _spc->GetSpcRam()[address];
} }
return 0; return 0;

View file

@ -6,17 +6,19 @@
class MemoryManager; class MemoryManager;
class BaseCartridge; class BaseCartridge;
class Ppu; class Ppu;
class Spc;
enum class SnesMemoryType; enum class SnesMemoryType;
class MemoryDumper class MemoryDumper
{ {
private: private:
shared_ptr<Ppu> _ppu; shared_ptr<Ppu> _ppu;
shared_ptr<Spc> _spc;
shared_ptr<MemoryManager> _memoryManager; shared_ptr<MemoryManager> _memoryManager;
shared_ptr<BaseCartridge> _cartridge; shared_ptr<BaseCartridge> _cartridge;
public: public:
MemoryDumper(shared_ptr<Ppu> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseCartridge> cartridge); MemoryDumper(shared_ptr<Ppu> ppu, shared_ptr<Spc> spc, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseCartridge> cartridge);
uint32_t GetMemorySize(SnesMemoryType type); uint32_t GetMemorySize(SnesMemoryType type);
void GetMemoryState(SnesMemoryType type, uint8_t *buffer); void GetMemoryState(SnesMemoryType type, uint8_t *buffer);

View file

@ -213,6 +213,11 @@ void Spc::ProcessEndFrame()
_dsp->set_output(_soundBuffer, Spc::SampleBufferSize >> 1); _dsp->set_output(_soundBuffer, Spc::SampleBufferSize >> 1);
} }
uint8_t* Spc::GetSpcRam()
{
return _ram;
}
void Spc::Serialize(Serializer &s) void Spc::Serialize(Serializer &s)
{ {
s.Stream(_state.A, _state.Cycle, _state.PC, _state.PS, _state.SP, _state.X, _state.Y); s.Stream(_state.A, _state.Cycle, _state.PC, _state.PS, _state.SP, _state.X, _state.Y);

View file

@ -10,9 +10,11 @@ class SPC_DSP;
class Spc : public ISerializable class Spc : public ISerializable
{ {
public:
static constexpr int SpcRamSize = 0x10000;
private: private:
static constexpr int SampleBufferSize = 0x100000; static constexpr int SampleBufferSize = 0x100000;
static constexpr int SpcRamSize = 0x10000;
static constexpr uint16_t ResetVector = 0xFFFE; static constexpr uint16_t ResetVector = 0xFFFE;
shared_ptr<Console> _console; shared_ptr<Console> _console;
@ -243,5 +245,7 @@ public:
void ProcessEndFrame(); void ProcessEndFrame();
uint8_t* GetSpcRam();
void Serialize(Serializer &s) override; void Serialize(Serializer &s) override;
}; };

View file

@ -156,7 +156,8 @@ namespace Mesen.GUI.Debugger
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.VideoRam)); cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.VideoRam));
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.CGRam)); cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.CGRam));
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpriteRam)); cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpriteRam));
cboMemoryType.Items.Add("-");
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpcRam));
cboMemoryType.SelectedIndex = 0; cboMemoryType.SelectedIndex = 0;
cboMemoryType.SetEnumValue(originalValue); cboMemoryType.SetEnumValue(originalValue);

View file

@ -118,6 +118,8 @@ namespace Mesen.GUI
VideoRam, VideoRam,
SpriteRam, SpriteRam,
CGRam, CGRam,
Register,
SpcRam
} }
public class AddressInfo public class AddressInfo