Debugger: CX4 debugger refactoring/improvements

This commit is contained in:
Sour 2022-02-20 18:22:33 -05:00
parent 571bdef0fe
commit 6de42fb210
9 changed files with 85 additions and 38 deletions

View file

@ -147,8 +147,8 @@ void Debugger::ProcessInstruction()
case CpuType::NecDsp: GetDebugger<type, NecDspDebugger>()->ProcessInstruction(); break;
case CpuType::Sa1: GetDebugger<type, SnesDebugger>()->ProcessInstruction(); break;
case CpuType::Gsu: GetDebugger<type, GsuDebugger>()->ProcessInstruction(); break;
/*case CpuType::Cx4: GetDebugger<type, Cx4Debugger>()->ProcessInstruction(); break;
case CpuType::Gameboy: GetDebugger<type, GbDebugger>()->ProcessInstruction(); break;*/
case CpuType::Cx4: GetDebugger<type, Cx4Debugger>()->ProcessInstruction(); break;
//case CpuType::Gameboy: GetDebugger<type, GbDebugger>()->ProcessInstruction(); break;
case CpuType::Nes: GetDebugger<type, NesDebugger>()->ProcessInstruction(); break;
}
}

View file

@ -11,6 +11,7 @@
#include "SNES/SnesCpuTypes.h"
#include "SNES/SpcTypes.h"
#include "SNES/Coprocessors/GSU/GsuTypes.h"
#include "SNES/Coprocessors/CX4/Cx4Types.h"
#include "Gameboy/GbTypes.h"
#include "NES/NesTypes.h"
#include "Shared/EmuSettings.h"
@ -402,7 +403,6 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem
}
case CpuType::NecDsp:
case CpuType::Cx4:
if(!disInfo.IsInitialized()) {
disInfo = DisassemblyInfo(row.Address.Address, 0, type, row.Address.Type, _memoryDumper);
} else {
@ -414,6 +414,21 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem
data.ValueSize = 0;
break;
case CpuType::Cx4:
{
Cx4State state = (Cx4State&)_debugger->GetCpuStateRef(lineCpuType);
if(!disInfo.IsInitialized()) {
disInfo = DisassemblyInfo(row.Address.Address, 0, type, row.Address.Type, _memoryDumper);
} else {
data.Flags |= LineFlags::VerifiedCode;
}
data.OpSize = disInfo.GetOpSize();
data.EffectiveAddress = disInfo.GetEffectiveAddress(_debugger, &state, lineCpuType);
data.ValueSize = 0;
break;
}
case CpuType::Gameboy:
{
GbCpuState state = (GbCpuState&)_debugger->GetCpuStateRef(lineCpuType);

View file

@ -86,8 +86,8 @@ int32_t DisassemblyInfo::GetEffectiveAddress(Debugger *debugger, void *cpuState,
case CpuType::Spc: return SpcDisUtils::GetEffectiveAddress(*this, (SnesConsole*)debugger->GetConsole(), *(SpcState*)cpuState);
case CpuType::Gsu: return GsuDisUtils::GetEffectiveAddress(*this, (SnesConsole*)debugger->GetConsole(), *(GsuState*)cpuState);
case CpuType::Cx4:
case CpuType::Cx4: return Cx4DisUtils::GetEffectiveAddress(*this, *(Cx4State*)cpuState, debugger->GetMemoryDumper());
case CpuType::NecDsp:
return -1;

View file

@ -91,8 +91,9 @@ void Cx4::Run()
Stop();
}
} else {
_emu->ProcessInstruction<CpuType::Cx4>();
uint16_t opCode = _prgRam[_state.Cache.Page][_state.PC];
_emu->ProcessMemoryRead<CpuType::Cx4>(0, 0, MemoryOperationType::ExecOpCode);
_state.PC++;
if(_state.PC == 0) {
@ -469,16 +470,6 @@ MemoryMappings* Cx4::GetMemoryMappings()
return &_mappings;
}
uint8_t* Cx4::DebugGetDataRam()
{
return _dataRam;
}
uint32_t Cx4::DebugGetDataRamSize()
{
return Cx4::DataRamSize;
}
Cx4State& Cx4::GetState()
{
return _state;

View file

@ -128,7 +128,5 @@ public:
AddressInfo GetAbsoluteAddress(uint32_t address) override;
MemoryMappings* GetMemoryMappings();
uint8_t* DebugGetDataRam();
uint32_t DebugGetDataRamSize();
Cx4State& GetState();
};

View file

@ -40,6 +40,34 @@ void Cx4Debugger::Reset()
{
}
void Cx4Debugger::ProcessInstruction()
{
Cx4State& state = _cx4->GetState();
uint32_t addr = (state.Cache.Address[state.Cache.Page] + (state.PC * 2)) & 0xFFFFFF;
uint16_t value = _cx4->GetMemoryMappings()->PeekWord(addr);
AddressInfo addressInfo = _cx4->GetMemoryMappings()->GetAbsoluteAddress(addr);
MemoryOperationInfo operation(addr, value, MemoryOperationType::ExecOpCode, MemoryType::Cx4Memory);
if(addressInfo.Type == MemoryType::SnesPrgRom) {
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Code | CdlFlags::Cx4);
_codeDataLogger->SetFlags(addressInfo.Address + 1, CdlFlags::Code | CdlFlags::Cx4);
}
if(_traceLogger->IsEnabled() || _settings->CheckDebuggerFlag(DebuggerFlags::Cx4DebuggerEnabled)) {
_disassembler->BuildCache(addressInfo, 0, CpuType::Cx4);
if(_traceLogger->IsEnabled()) {
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo, addr, 0, CpuType::Cx4);
_traceLogger->Log(state, disInfo, operation);
}
}
_prevProgramCounter = addr;
_step->ProcessCpuExec();
_debugger->ProcessBreakConditions(CpuType::Cx4, *_step.get(), _breakpointManager.get(), operation, addressInfo);
}
void Cx4Debugger::ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType type)
{
Cx4State& state = _cx4->GetState();
@ -50,24 +78,6 @@ void Cx4Debugger::ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType
if(type == MemoryOperationType::ExecOpCode) {
AddressInfo opCodeHighAddr = _cx4->GetMemoryMappings()->GetAbsoluteAddress(addr + 1);
if(addressInfo.Type == MemoryType::SnesPrgRom) {
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Code | CdlFlags::Cx4);
_codeDataLogger->SetFlags(addressInfo.Address + 1, CdlFlags::Code | CdlFlags::Cx4);
}
if(_traceLogger->IsEnabled() || _settings->CheckDebuggerFlag(DebuggerFlags::Cx4DebuggerEnabled)) {
_disassembler->BuildCache(addressInfo, 0, CpuType::Cx4);
if(_traceLogger->IsEnabled()) {
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo, addr, 0, CpuType::Cx4);
_traceLogger->Log(state, disInfo, operation);
}
}
_prevProgramCounter = addr;
_step->ProcessCpuExec();
_memoryAccessCounter->ProcessMemoryExec(addressInfo, _memoryManager->GetMasterClock());
_memoryAccessCounter->ProcessMemoryExec(opCodeHighAddr, _memoryManager->GetMasterClock());
} else {
@ -78,9 +88,9 @@ void Cx4Debugger::ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType
_traceLogger->LogNonExec(operation);
}
_memoryAccessCounter->ProcessMemoryRead(addressInfo, _memoryManager->GetMasterClock());
}
_debugger->ProcessBreakConditions(CpuType::Cx4, *_step.get(), _breakpointManager.get(), operation, addressInfo);
_debugger->ProcessBreakConditions(CpuType::Cx4, *_step.get(), _breakpointManager.get(), operation, addressInfo);
}
}
void Cx4Debugger::ProcessWrite(uint32_t addr, uint8_t value, MemoryOperationType type)

View file

@ -37,6 +37,7 @@ public:
void Reset() override;
void ProcessInstruction();
void ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType type);
void ProcessWrite(uint32_t addr, uint8_t value, MemoryOperationType type);

View file

@ -1,5 +1,6 @@
#include "stdafx.h"
#include "SNES/Debugger/Cx4DisUtils.h"
#include "SNES/Coprocessors/CX4/Cx4Types.h"
#include "Debugger/DisassemblyInfo.h"
#include "Shared/EmuSettings.h"
#include "Utilities/HexUtilities.h"
@ -208,3 +209,31 @@ void Cx4DisUtils::GetDisassembly(DisassemblyInfo &info, string &out, uint32_t me
out += str.ToString();
}
int32_t Cx4DisUtils::GetEffectiveAddress(DisassemblyInfo& info, Cx4State& state, MemoryDumper* memoryDumper)
{
uint8_t op = info.GetByteCode()[1] & 0xFC;
uint8_t param1 = info.GetByteCode()[1] & 0x03;
uint8_t param2 = info.GetByteCode()[0] & 0xFF;
switch(op) {
default: return -1;
case 0x08:
case 0x0C:
case 0x10:
case 0x14:
case 0x18:
case 0x28:
case 0x2C:
case 0x30:
case 0x34:
case 0x38:
//Show destination address for branches & JSR
if(param1) {
return (state.P << 9) | (param2 * 2);
} else {
return state.Cache.Address[state.Cache.Page] | (param2 * 2);
}
}
}

View file

@ -4,9 +4,12 @@
class DisassemblyInfo;
class LabelManager;
class EmuSettings;
class MemoryDumper;
struct Cx4State;
class Cx4DisUtils
{
public:
static void GetDisassembly(DisassemblyInfo &info, string &out, uint32_t memoryAddr, LabelManager* labelManager, EmuSettings* settings);
static int32_t GetEffectiveAddress(DisassemblyInfo& info, Cx4State& state, MemoryDumper* memoryDumper);
};