From 4e14a83625db97e52f862ccb9ae4f5d93d59a5da Mon Sep 17 00:00:00 2001 From: Souryo Date: Sat, 5 Aug 2017 17:18:09 -0400 Subject: [PATCH] Debugger: General speed optimizations --- Core/BaseMapper.cpp | 2 +- Core/BaseMapper.h | 2 +- Core/CPU.cpp | 35 ++++++++-------- Core/CPU.h | 2 +- Core/CodeRunner.cpp | 4 +- Core/CodeRunner.h | 2 +- Core/Debugger.cpp | 82 +++++++++++++++++++++++--------------- Core/Debugger.h | 6 ++- Core/Disassembler.cpp | 59 +++++++++++++++------------ Core/Disassembler.h | 2 +- Core/DisassemblyInfo.cpp | 4 ++ Core/DisassemblyInfo.h | 1 + Core/EmulationSettings.cpp | 2 +- Core/TraceLogger.cpp | 40 ++++++++++--------- Core/TraceLogger.h | 18 +++++---- 15 files changed, 151 insertions(+), 110 deletions(-) diff --git a/Core/BaseMapper.cpp b/Core/BaseMapper.cpp index fed1e3b7..6bfd495f 100644 --- a/Core/BaseMapper.cpp +++ b/Core/BaseMapper.cpp @@ -800,7 +800,7 @@ void BaseMapper::InternalWriteVRAM(uint16_t addr, uint8_t value) void BaseMapper::WriteVRAM(uint16_t addr, uint8_t value) { ProcessVramAccess(addr); - Debugger::ProcessVramOperation(MemoryOperationType::Write, addr, value); + Debugger::ProcessVramWriteOperation(addr, value); NotifyVRAMAddressChange(addr); if(_chrPageAccessType[addr >> 8] & MemoryAccessType::Write) { diff --git a/Core/BaseMapper.h b/Core/BaseMapper.h index 69ada421..a2425dab 100644 --- a/Core/BaseMapper.h +++ b/Core/BaseMapper.h @@ -179,7 +179,7 @@ public: NotifyVRAMAddressChange(addr); uint8_t value = MapperReadVRAM(addr, type); - Debugger::ProcessVramOperation(type, addr, value); + Debugger::ProcessVramReadOperation(type, addr, value); return value; } diff --git a/Core/CPU.cpp b/Core/CPU.cpp index 49629a3a..84e6038e 100644 --- a/Core/CPU.cpp +++ b/Core/CPU.cpp @@ -34,24 +34,25 @@ CPU::CPU(MemoryManager *memoryManager) &CPU::BEQ, &CPU::SBC, &CPU::HLT, &CPU::ISB, &CPU::NOP, &CPU::SBC, &CPU::INC, &CPU::ISB, &CPU::SED, &CPU::SBC, &CPU::NOP, &CPU::ISB, &CPU::NOP, &CPU::SBC, &CPU::INC, &CPU::ISB //F }; + typedef AddrMode M; AddrMode addrMode[] = { - // 0 1 2 3 4 5 6 7 8 9 A B C D E F - Imp, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //0 - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, //1 - Abs, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //2 - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, //3 - Imp, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //4 - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, //5 - Imp, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //6 - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, //7 - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //8 - Rel, IndYW, None, IndYW, ZeroX, ZeroX, ZeroY, ZeroY, Imp, AbsYW, Imp, AbsYW, AbsXW, AbsXW, AbsYW, AbsYW, //9 - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //A - Rel, IndY, None, IndY, ZeroX, ZeroX, ZeroY, ZeroY, Imp, AbsY, Imp, AbsY, AbsX, AbsX, AbsY, AbsY, //B - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //C - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, //D - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, //E - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, //F + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + M::Imp, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //0 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//1 + M::Abs, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //2 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//3 + M::Imp, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //4 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//5 + M::Imp, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Ind, M::Abs, M::Abs, M::Abs, //6 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//7 + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //8 + M::Rel, M::IndYW, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroY, M::ZeroY, M::Imp, M::AbsYW,M::Imp, M::AbsYW,M::AbsXW,M::AbsXW,M::AbsYW,M::AbsYW,//9 + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //A + M::Rel, M::IndY, M::None, M::IndY, M::ZeroX, M::ZeroX, M::ZeroY, M::ZeroY, M::Imp, M::AbsY, M::Imp, M::AbsY, M::AbsX, M::AbsX, M::AbsY, M::AbsY, //B + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //C + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//D + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //E + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//F }; memcpy(_opTable, opTable, sizeof(opTable)); diff --git a/Core/CPU.h b/Core/CPU.h index 2474667d..1c06218e 100644 --- a/Core/CPU.h +++ b/Core/CPU.h @@ -22,7 +22,7 @@ namespace PSFlags }; } -enum AddrMode +enum class AddrMode { None, Acc, Imp, Imm, Rel, Zero, Abs, ZeroX, ZeroY, diff --git a/Core/CodeRunner.cpp b/Core/CodeRunner.cpp index d001ee8b..d4ae7cb3 100644 --- a/Core/CodeRunner.cpp +++ b/Core/CodeRunner.cpp @@ -42,7 +42,7 @@ void CodeRunner::WriteRAM(uint16_t addr, uint8_t value) } } -shared_ptr CodeRunner::GetDisassemblyInfo(uint16_t cpuAddress) +DisassemblyInfo CodeRunner::GetDisassemblyInfo(uint16_t cpuAddress) { - return shared_ptr(new DisassemblyInfo(_byteCode.data() + cpuAddress - CodeRunner::BaseAddress, false)); + return DisassemblyInfo(_byteCode.data() + cpuAddress - CodeRunner::BaseAddress, false); } \ No newline at end of file diff --git a/Core/CodeRunner.h b/Core/CodeRunner.h index 57f8c8c4..9140a746 100644 --- a/Core/CodeRunner.h +++ b/Core/CodeRunner.h @@ -18,7 +18,7 @@ public: CodeRunner(vector byteCode, Debugger *debugger); bool IsRunning(); - shared_ptr GetDisassemblyInfo(uint16_t cpuAddress); + DisassemblyInfo GetDisassemblyInfo(uint16_t cpuAddress); void GetMemoryRanges(MemoryRanges &ranges) override; uint8_t ReadRAM(uint16_t addr) override; diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index 221acc0a..3b945489 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -213,28 +213,26 @@ void Debugger::SetBreakpoints(Breakpoint breakpoints[], uint32_t length) void Debugger::UpdateBreakpoints() { - if(_bpUpdateNeeded) { - _bpUpdateLock.AcquireSafe(); + _bpUpdateLock.AcquireSafe(); + for(int i = 0; i < Debugger::BreakpointTypeCount; i++) { + _breakpoints[i].clear(); + _breakpointRpnList[i].clear(); + _hasBreakpoint[i] = false; + } + + ExpressionEvaluator expEval(this); + for(Breakpoint &bp : _newBreakpoints) { for(int i = 0; i < Debugger::BreakpointTypeCount; i++) { - _breakpoints[i].clear(); - _breakpointRpnList[i].clear(); - _hasBreakpoint[i] = false; - } - - ExpressionEvaluator expEval(this); - for(Breakpoint &bp : _newBreakpoints) { - for(int i = 0; i < Debugger::BreakpointTypeCount; i++) { - if(bp.HasBreakpointType((BreakpointType)i)) { - _breakpoints[i].push_back(bp); - _breakpointRpnList[i].push_back(*expEval.GetRpnList(bp.GetCondition())); - _hasBreakpoint[i] = true; - } + if(bp.HasBreakpointType((BreakpointType)i)) { + _breakpoints[i].push_back(bp); + _breakpointRpnList[i].push_back(*expEval.GetRpnList(bp.GetCondition())); + _hasBreakpoint[i] = true; } } - - _bpUpdateNeeded = false; } + + _bpUpdateNeeded = false; } bool Debugger::HasMatchingBreakpoint(BreakpointType type, OperationInfo &operationInfo) @@ -244,7 +242,9 @@ bool Debugger::HasMatchingBreakpoint(BreakpointType type, OperationInfo &operati return false; } - UpdateBreakpoints(); + if(_bpUpdateNeeded) { + UpdateBreakpoints(); + } uint32_t absoluteAddr = _mapper->ToAbsoluteAddress(operationInfo.Address); vector &breakpoints = _breakpoints[(int)type]; @@ -488,7 +488,7 @@ bool Debugger::PrivateProcessRamOperation(MemoryOperationType type, uint16_t &ad GetState(&_debugState, false); - shared_ptr disassemblyInfo; + DisassemblyInfo disassemblyInfo; if(_codeRunner && _codeRunner->IsRunning() && addr >= 0x3000 && addr < 0x4000) { disassemblyInfo = _codeRunner->GetDisassemblyInfo(addr); } else { @@ -560,19 +560,30 @@ bool Debugger::SleepUntilResume() return false; } -void Debugger::PrivateProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value) +void Debugger::PrivateProcessVramReadOperation(MemoryOperationType type, uint16_t addr, uint8_t value) { - if(type != MemoryOperationType::Write) { - int32_t absoluteAddr = _mapper->ToAbsoluteChrAddress(addr); - _codeDataLogger->SetFlag(absoluteAddr, type == MemoryOperationType::Read ? CdlChrFlags::Read : CdlChrFlags::Drawn); - } + int32_t absoluteAddr = _mapper->ToAbsoluteChrAddress(addr); + _codeDataLogger->SetFlag(absoluteAddr, type == MemoryOperationType::Read ? CdlChrFlags::Read : CdlChrFlags::Drawn); - BreakpointType bpType = type == MemoryOperationType::Write ? BreakpointType::WriteVram : BreakpointType::ReadVram; - OperationInfo operationInfo { addr, value, type }; - if(_hasBreakpoint[bpType] && HasMatchingBreakpoint(bpType, operationInfo)) { - //Found a matching breakpoint, stop execution - Step(1); - SleepUntilResume(); + if(_hasBreakpoint[BreakpointType::ReadVram]) { + OperationInfo operationInfo{ addr, value, type }; + if(HasMatchingBreakpoint(BreakpointType::ReadVram, operationInfo)) { + //Found a matching breakpoint, stop execution + Step(1); + SleepUntilResume(); + } + } +} + +void Debugger::PrivateProcessVramWriteOperation(uint16_t addr, uint8_t value) +{ + if(_hasBreakpoint[BreakpointType::WriteVram]) { + OperationInfo operationInfo{ addr, value, MemoryOperationType::Write }; + if(HasMatchingBreakpoint(BreakpointType::WriteVram, operationInfo)) { + //Found a matching breakpoint, stop execution + Step(1); + SleepUntilResume(); + } } } @@ -753,10 +764,17 @@ bool Debugger::ProcessRamOperation(MemoryOperationType type, uint16_t &addr, uin return true; } -void Debugger::ProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value) +void Debugger::ProcessVramReadOperation(MemoryOperationType type, uint16_t addr, uint8_t value) { if(Debugger::Instance) { - Debugger::Instance->PrivateProcessVramOperation(type, addr, value); + Debugger::Instance->PrivateProcessVramReadOperation(type, addr, value); + } +} + +void Debugger::ProcessVramWriteOperation(uint16_t addr, uint8_t value) +{ + if(Debugger::Instance) { + Debugger::Instance->PrivateProcessVramWriteOperation(addr, value); } } diff --git a/Core/Debugger.h b/Core/Debugger.h index 926d9c0c..e6dc1a46 100644 --- a/Core/Debugger.h +++ b/Core/Debugger.h @@ -110,7 +110,8 @@ private: void PrivateProcessPpuCycle(); bool PrivateProcessRamOperation(MemoryOperationType type, uint16_t &addr, uint8_t &value); - void PrivateProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value); + void PrivateProcessVramReadOperation(MemoryOperationType type, uint16_t addr, uint8_t value); + void PrivateProcessVramWriteOperation(uint16_t addr, uint8_t value); bool HasMatchingBreakpoint(BreakpointType type, OperationInfo &operationInfo); void UpdateCallstack(uint32_t addr); @@ -176,7 +177,8 @@ public: int32_t EvaluateExpression(string expression, EvalResultType &resultType); static bool ProcessRamOperation(MemoryOperationType type, uint16_t &addr, uint8_t &value); - static void ProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value); + static void ProcessVramReadOperation(MemoryOperationType type, uint16_t addr, uint8_t value); + static void ProcessVramWriteOperation(uint16_t addr, uint8_t value); static void ProcessPpuCycle(); static void SetLastFramePpuScroll(uint16_t x, uint16_t y); diff --git a/Core/Disassembler.cpp b/Core/Disassembler.cpp index fdb8553f..7a59b5dc 100644 --- a/Core/Disassembler.cpp +++ b/Core/Disassembler.cpp @@ -78,23 +78,25 @@ void Disassembler::BuildOpCodeTables(bool useLowerCase) false,false,true, true, true, false,false,true, false,false,true, true, true, false,false,true //F }; - AddrMode opMode[256] = { - Imp, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Acc, Imm, Abs, Abs, Abs, Abs, - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, - Abs, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Acc, Imm, Abs, Abs, Abs, Abs, - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, - Imp, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Acc, Imm, Abs, Abs, Abs, Abs, - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, - Imp, IndX, None, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Acc, Imm, Ind, Abs, Abs, Abs, - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, - Rel, IndYW, None, IndY, ZeroX, ZeroX, ZeroY, ZeroY, Imp, AbsYW, Imp, AbsY, AbsXW, AbsXW, AbsYW, AbsY, - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, - Rel, IndY, None, IndY, ZeroX, ZeroX, ZeroY, ZeroY, Imp, AbsY, Imp, AbsY, AbsX, AbsX, AbsY, AbsY, - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, - Imm, IndX, Imm, IndX, Zero, Zero, Zero, Zero, Imp, Imm, Imp, Imm, Abs, Abs, Abs, Abs, - Rel, IndY, None, IndYW, ZeroX, ZeroX, ZeroX, ZeroX, Imp, AbsY, Imp, AbsYW, AbsX, AbsX, AbsXW, AbsXW, + typedef AddrMode M; + AddrMode opMode[] = { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + M::Imp, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //0 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//1 + M::Abs, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //2 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//3 + M::Imp, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //4 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//5 + M::Imp, M::IndX, M::None, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Acc, M::Imm, M::Ind, M::Abs, M::Abs, M::Abs, //6 + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//7 + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //8 + M::Rel, M::IndYW, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroY, M::ZeroY, M::Imp, M::AbsYW,M::Imp, M::AbsYW,M::AbsXW,M::AbsXW,M::AbsYW,M::AbsYW,//9 + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //A + M::Rel, M::IndY, M::None, M::IndY, M::ZeroX, M::ZeroX, M::ZeroY, M::ZeroY, M::Imp, M::AbsY, M::Imp, M::AbsY, M::AbsX, M::AbsX, M::AbsY, M::AbsY, //B + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //C + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//D + M::Imm, M::IndX, M::Imm, M::IndX, M::Zero, M::Zero, M::Zero, M::Zero, M::Imp, M::Imm, M::Imp, M::Imm, M::Abs, M::Abs, M::Abs, M::Abs, //E + M::Rel, M::IndY, M::None, M::IndYW, M::ZeroX, M::ZeroX, M::ZeroX, M::ZeroX, M::Imp, M::AbsY, M::Imp, M::AbsYW,M::AbsX, M::AbsX, M::AbsXW,M::AbsXW,//F }; for(int i = 0; i < 256; i++) { @@ -201,14 +203,14 @@ uint32_t Disassembler::BuildCache(AddressTypeInfo &info, uint16_t cpuAddress, bo int32_t absoluteAddr = info.Address; if(info.Address >= 0) { - shared_ptr disInfo = (*cache)[info.Address]; + DisassemblyInfo *disInfo = (*cache)[info.Address].get(); if(!disInfo) { while(absoluteAddr < (int32_t)size && !(*cache)[absoluteAddr]) { bool isJump = IsUnconditionalJump(source[absoluteAddr]); - disInfo = shared_ptr(new DisassemblyInfo(source+absoluteAddr, isSubEntryPoint)); + disInfo = new DisassemblyInfo(source+absoluteAddr, isSubEntryPoint); isSubEntryPoint = false; - (*cache)[absoluteAddr] = disInfo; + (*cache)[absoluteAddr] = shared_ptr(disInfo); absoluteAddr += disInfo->GetSize(); if(isJump) { @@ -604,14 +606,19 @@ string Disassembler::GetCode(AddressTypeInfo &addressInfo, uint32_t endAddr, uin return output; } -shared_ptr Disassembler::GetDisassemblyInfo(AddressTypeInfo &info) +DisassemblyInfo Disassembler::GetDisassemblyInfo(AddressTypeInfo &info) { + DisassemblyInfo* disassemblyInfo = nullptr; switch(info.Type) { - case AddressType::InternalRam: return _disassembleMemoryCache[info.Address & 0x7FF]; - case AddressType::PrgRom: return _disassembleCache[info.Address]; - case AddressType::WorkRam: return _disassembleWorkRamCache[info.Address]; - case AddressType::SaveRam: return _disassembleSaveRamCache[info.Address]; + case AddressType::InternalRam: disassemblyInfo = _disassembleMemoryCache[info.Address & 0x7FF].get(); break; + case AddressType::PrgRom: disassemblyInfo = _disassembleCache[info.Address].get(); break; + case AddressType::WorkRam: disassemblyInfo = _disassembleWorkRamCache[info.Address].get(); break; + case AddressType::SaveRam: disassemblyInfo = _disassembleSaveRamCache[info.Address].get(); break; } - return nullptr; + if(disassemblyInfo) { + return *disassemblyInfo; + } else { + return DisassemblyInfo(); + } } \ No newline at end of file diff --git a/Core/Disassembler.h b/Core/Disassembler.h index fd07b090..22284640 100644 --- a/Core/Disassembler.h +++ b/Core/Disassembler.h @@ -42,7 +42,7 @@ public: string GetCode(AddressTypeInfo &addressInfo, uint32_t endAddr, uint16_t memoryAddr, bool showEffectiveAddresses, bool showOnlyDiassembledCode, State& cpuState, shared_ptr memoryManager, shared_ptr labelManager); - shared_ptr GetDisassemblyInfo(AddressTypeInfo &info); + DisassemblyInfo GetDisassemblyInfo(AddressTypeInfo &info); void RebuildPrgRomCache(uint32_t absoluteAddr, int32_t length); }; diff --git a/Core/DisassemblyInfo.cpp b/Core/DisassemblyInfo.cpp index 0f88ea7c..cb114f94 100644 --- a/Core/DisassemblyInfo.cpp +++ b/Core/DisassemblyInfo.cpp @@ -29,6 +29,10 @@ static const char* hexTable[256] = { "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" }; +DisassemblyInfo::DisassemblyInfo() +{ +} + void DisassemblyInfo::ToString(string &out, uint32_t memoryAddr, MemoryManager* memoryManager, LabelManager* labelManager) { char buffer[500]; diff --git a/Core/DisassemblyInfo.h b/Core/DisassemblyInfo.h index e0b9f189..b82e2729 100644 --- a/Core/DisassemblyInfo.h +++ b/Core/DisassemblyInfo.h @@ -21,6 +21,7 @@ private: AddrMode _opMode; public: + DisassemblyInfo(); DisassemblyInfo(uint8_t* opPointer, bool isSubEntryPoint); void SetSubEntryPoint(); diff --git a/Core/EmulationSettings.cpp b/Core/EmulationSettings.cpp index ca339ce3..ee7cbdb2 100644 --- a/Core/EmulationSettings.cpp +++ b/Core/EmulationSettings.cpp @@ -14,7 +14,7 @@ Language EmulationSettings::_displayLanguage = Language::English; uint64_t EmulationSettings::_flags = 0; bool EmulationSettings::_audioSettingsChanged = true; -uint32_t EmulationSettings::_audioLatency = 20000; +uint32_t EmulationSettings::_audioLatency = 50; double EmulationSettings::_channelVolume[11] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; double EmulationSettings::_channelPanning[11] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; EqualizerFilterType EmulationSettings::_equalizerFilterType = EqualizerFilterType::None; diff --git a/Core/TraceLogger.cpp b/Core/TraceLogger.cpp index 826c4cd9..18ec7f83 100644 --- a/Core/TraceLogger.cpp +++ b/Core/TraceLogger.cpp @@ -20,7 +20,9 @@ TraceLogger::TraceLogger(Debugger* debugger, shared_ptr memoryMan _labelManager = labelManager; _instance = this; _currentPos = 0; + _logCount = 0; _logToFile = false; + _pendingLog = false; } TraceLogger::~TraceLogger() @@ -103,7 +105,7 @@ void TraceLogger::GetStatusFlag(string &output, uint8_t ps) } } -void TraceLogger::GetTraceRow(string &output, State &cpuState, PPUDebugState &ppuState, shared_ptr &disassemblyInfo, bool firstLine) +void TraceLogger::GetTraceRow(string &output, State &cpuState, PPUDebugState &ppuState, DisassemblyInfo &disassemblyInfo, bool firstLine) { if(!firstLine) { output += "\n"; @@ -113,7 +115,7 @@ void TraceLogger::GetTraceRow(string &output, State &cpuState, PPUDebugState &pp if(_options.ShowByteCode) { string byteCode; - disassemblyInfo->GetByteCode(byteCode); + disassemblyInfo.GetByteCode(byteCode); output += byteCode + std::string(13 - byteCode.size(), ' '); } @@ -125,8 +127,8 @@ void TraceLogger::GetTraceRow(string &output, State &cpuState, PPUDebugState &pp string code; LabelManager* labelManager = _options.UseLabels ? _labelManager.get() : nullptr; - disassemblyInfo->ToString(code, cpuState.DebugPC, _memoryManager.get(), labelManager); - disassemblyInfo->GetEffectiveAddressString(code, cpuState, _memoryManager.get(), labelManager); + disassemblyInfo.ToString(code, cpuState.DebugPC, _memoryManager.get(), labelManager); + disassemblyInfo.GetEffectiveAddressString(code, cpuState, _memoryManager.get(), labelManager); code += std::string(std::max(0, (int)(32 - code.size())), ' '); output += code; @@ -159,7 +161,7 @@ void TraceLogger::GetTraceRow(string &output, State &cpuState, PPUDebugState &pp } } -bool TraceLogger::ConditionMatches(DebugState &state, shared_ptr &disassemblyInfo, OperationInfo &operationInfo) +bool TraceLogger::ConditionMatches(DebugState &state, DisassemblyInfo &disassemblyInfo, OperationInfo &operationInfo) { if(!_conditionRpnList.empty()) { EvalResultType type; @@ -168,6 +170,7 @@ bool TraceLogger::ConditionMatches(DebugState &state, shared_ptr &disassemblyInfo, DebugState &state) +void TraceLogger::AddRow(DisassemblyInfo &disassemblyInfo, DebugState &state) { _disassemblyCache[_currentPos] = disassemblyInfo; _cpuStateCache[_currentPos] = state.CPU; _ppuStateCache[_currentPos] = state.PPU; _currentPos = (_currentPos + 1) % ExecutionLogSize; - _lastDisassemblyInfo.reset(); + _pendingLog = false; + + if(_logCount < ExecutionLogSize) { + _logCount++; + } if(_logToFile) { GetTraceRow(_outputBuffer, state.CPU, state.PPU, disassemblyInfo, _firstLine); @@ -196,7 +203,7 @@ void TraceLogger::AddRow(shared_ptr &disassemblyInfo, DebugStat void TraceLogger::LogNonExec(OperationInfo& operationInfo) { - if(_lastDisassemblyInfo) { + if(_pendingLog) { auto lock = _lock.AcquireSafe(); if(ConditionMatches(_lastState, _lastDisassemblyInfo, operationInfo)) { AddRow(_lastDisassemblyInfo, _lastState); @@ -204,13 +211,11 @@ void TraceLogger::LogNonExec(OperationInfo& operationInfo) } } -void TraceLogger::Log(DebugState &state, shared_ptr disassemblyInfo, OperationInfo &operationInfo) +void TraceLogger::Log(DebugState &state, DisassemblyInfo &disassemblyInfo, OperationInfo &operationInfo) { - if(disassemblyInfo) { - auto lock = _lock.AcquireSafe(); - if(ConditionMatches(state, disassemblyInfo, operationInfo)) { - AddRow(disassemblyInfo, state); - } + auto lock = _lock.AcquireSafe(); + if(ConditionMatches(state, disassemblyInfo, operationInfo)) { + AddRow(disassemblyInfo, state); } } @@ -218,14 +223,13 @@ const char* TraceLogger::GetExecutionTrace(uint32_t lineCount) { _executionTrace.clear(); auto lock = _lock.AcquireSafe(); + lineCount = std::min(lineCount, _logCount); int startPos = _currentPos + ExecutionLogSize - lineCount; bool firstLine = true; for(int i = 0; i < (int)lineCount; i++) { int index = (startPos + i) % ExecutionLogSize; - if(_disassemblyCache[index]) { - GetTraceRow(_executionTrace, _cpuStateCache[index], _ppuStateCache[index], _disassemblyCache[index], firstLine); - firstLine = false; - } + GetTraceRow(_executionTrace, _cpuStateCache[index], _ppuStateCache[index], _disassemblyCache[index], firstLine); + firstLine = false; } return _executionTrace.c_str(); } \ No newline at end of file diff --git a/Core/TraceLogger.h b/Core/TraceLogger.h index e9864c61..1316ed22 100644 --- a/Core/TraceLogger.h +++ b/Core/TraceLogger.h @@ -2,8 +2,8 @@ #include "stdafx.h" #include "DebuggerTypes.h" #include "../Utilities/SimpleLock.h" +#include "DisassemblyInfo.h" -class DisassemblyInfo; class MemoryManager; class LabelManager; class ExpressionEvaluator; @@ -47,35 +47,39 @@ private: shared_ptr _expEvaluator; vector _conditionRpnList; + + bool _pendingLog; DebugState _lastState; - shared_ptr _lastDisassemblyInfo; + DisassemblyInfo _lastDisassemblyInfo; constexpr static int ExecutionLogSize = 30000; bool _logToFile; uint16_t _currentPos; + uint32_t _logCount; State _cpuStateCache[ExecutionLogSize] = {}; PPUDebugState _ppuStateCache[ExecutionLogSize] = {}; - shared_ptr _disassemblyCache[ExecutionLogSize] = {}; + DisassemblyInfo _disassemblyCache[ExecutionLogSize]; SimpleLock _lock; string _executionTrace; void GetStatusFlag(string &output, uint8_t ps); - void AddRow(shared_ptr &disassemblyInfo, DebugState &state); - bool ConditionMatches(DebugState &state, shared_ptr &disassemblyInfo, OperationInfo &operationInfo); + void AddRow(DisassemblyInfo &disassemblyInfo, DebugState &state); + bool ConditionMatches(DebugState &state, DisassemblyInfo &disassemblyInfo, OperationInfo &operationInfo); + + void GetTraceRow(string &output, State &cpuState, PPUDebugState &ppuState, DisassemblyInfo &disassemblyInfo, bool firstLine); public: TraceLogger(Debugger* debugger, shared_ptr memoryManager, shared_ptr labelManager); ~TraceLogger(); - void Log(DebugState &state, shared_ptr disassemblyInfo, OperationInfo &operationInfo); + void Log(DebugState &state, DisassemblyInfo &disassemblyInfo, OperationInfo &operationInfo); void LogNonExec(OperationInfo& operationInfo); void SetOptions(TraceLoggerOptions options); void StartLogging(string filename); void StopLogging(); - void GetTraceRow(string &output, State &cpuState, PPUDebugState &ppuState, shared_ptr &disassemblyInfo, bool firstLine); const char* GetExecutionTrace(uint32_t lineCount); static void LogStatic(string log);