diff --git a/Core/Debugger/Disassembler.cpp b/Core/Debugger/Disassembler.cpp index 4d1bdfa7..7d0c3c03 100644 --- a/Core/Debugger/Disassembler.cpp +++ b/Core/Debugger/Disassembler.cpp @@ -383,6 +383,9 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem case CpuType::Gsu: { GsuState state = (GsuState&)_debugger->GetCpuStateRef(lineCpuType); + state.R[15] = (uint16_t)row.CpuAddress; + state.ProgramBank = (row.CpuAddress >> 16); + if(!disInfo.IsInitialized()) { disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Gsu, row.Address.Type, _memoryDumper); } else { @@ -430,6 +433,8 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem case CpuType::Gameboy: { GbCpuState state = (GbCpuState&)_debugger->GetCpuStateRef(lineCpuType); + state.PC = (uint16_t)row.CpuAddress; + CodeDataLogger* cdl = _debugger->GetCodeDataLogger(lineCpuType); if(!disInfo.IsInitialized()) { disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Gameboy, row.Address.Type, _memoryDumper); @@ -446,6 +451,8 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem case CpuType::Nes: { NesCpuState state = (NesCpuState&)_debugger->GetCpuStateRef(lineCpuType); + state.PC = (uint16_t)row.CpuAddress; + CodeDataLogger* cdl = _debugger->GetCodeDataLogger(lineCpuType); if(!disInfo.IsInitialized()) { disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Nes, row.Address.Type, _memoryDumper); @@ -466,6 +473,8 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem case CpuType::Pce: { PceCpuState state = (PceCpuState&)_debugger->GetCpuStateRef(lineCpuType); + state.PC = (uint16_t)row.CpuAddress; + CodeDataLogger* cdl = _debugger->GetCodeDataLogger(lineCpuType); if(!disInfo.IsInitialized()) { disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Pce, row.Address.Type, _memoryDumper); diff --git a/Core/Debugger/DisassemblyInfo.cpp b/Core/Debugger/DisassemblyInfo.cpp index f4bf02af..1da50aa1 100644 --- a/Core/Debugger/DisassemblyInfo.cpp +++ b/Core/Debugger/DisassemblyInfo.cpp @@ -96,7 +96,7 @@ int32_t DisassemblyInfo::GetEffectiveAddress(Debugger *debugger, void *cpuState, case CpuType::Gameboy: return GameboyDisUtils::GetEffectiveAddress(*this, *(GbCpuState*)cpuState); case CpuType::Nes: return NesDisUtils::GetEffectiveAddress(*this, *(NesCpuState*)cpuState, debugger->GetMemoryDumper()); - case CpuType::Pce: return PceDisUtils::GetEffectiveAddress(*this, *(PceCpuState*)cpuState, debugger->GetMemoryDumper()); + case CpuType::Pce: return PceDisUtils::GetEffectiveAddress(*this, (PceConsole*)debugger->GetConsole(), *(PceCpuState*)cpuState); } throw std::runtime_error("GetEffectiveAddress - Unsupported CPU type"); diff --git a/Core/PCE/Debugger/DummyPceCpu.cpp b/Core/PCE/Debugger/DummyPceCpu.cpp index 9ef18c43..7184cf35 100644 --- a/Core/PCE/Debugger/DummyPceCpu.cpp +++ b/Core/PCE/Debugger/DummyPceCpu.cpp @@ -8,10 +8,9 @@ #undef PceCpu #undef DUMMYCPU -DummyPceCpu::DummyPceCpu(Emulator* emu, PceConsole* console, PceMemoryManager* memoryManager) +DummyPceCpu::DummyPceCpu(Emulator* emu, PceMemoryManager* memoryManager) { _emu = emu; - _console = console; _memoryManager = memoryManager; } diff --git a/Core/PCE/Debugger/PceDebugger.cpp b/Core/PCE/Debugger/PceDebugger.cpp index c14b53b8..c5aeab02 100644 --- a/Core/PCE/Debugger/PceDebugger.cpp +++ b/Core/PCE/Debugger/PceDebugger.cpp @@ -45,7 +45,7 @@ PceDebugger::PceDebugger(Debugger* debugger) _memoryAccessCounter = debugger->GetMemoryAccessCounter(); _settings = debugger->GetEmulator()->GetSettings(); - _dummyCpu.reset(new DummyPceCpu(_emu, _console, _memoryManager)); + _dummyCpu.reset(new DummyPceCpu(_emu, _memoryManager)); _codeDataLogger.reset(new CodeDataLogger(MemoryType::PcePrgRom, _emu->GetMemory(MemoryType::PcePrgRom).Size, CpuType::Pce)); diff --git a/Core/PCE/Debugger/PceDisUtils.cpp b/Core/PCE/Debugger/PceDisUtils.cpp index 35546bf7..7fc335be 100644 --- a/Core/PCE/Debugger/PceDisUtils.cpp +++ b/Core/PCE/Debugger/PceDisUtils.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" #include "PCE/Debugger/PceDisUtils.h" +#include "PCE/Debugger/DummyPceCpu.h" +#include "PCE/PceConsole.h" #include "PCE/PceTypes.h" #include "Shared/EmuSettings.h" #include "Debugger/DisassemblyInfo.h" @@ -83,8 +85,7 @@ void PceDisUtils::GetDisassembly(DisassemblyInfo& info, string& out, uint32_t me }; auto writeZeroAddr = [&str, &info, &writeLabelOrAddr, labelManager](uint8_t zero) { - uint16_t addr = 0x2000 + zero; - writeLabelOrAddr(addr); + str.WriteAll('$', HexUtilities::ToHex(zero)); }; switch(addrMode) { @@ -173,44 +174,38 @@ void PceDisUtils::GetDisassembly(DisassemblyInfo& info, string& out, uint32_t me out += str.ToString(); } -int32_t PceDisUtils::GetEffectiveAddress(DisassemblyInfo& info, PceCpuState& state, MemoryDumper* memoryDumper) +int32_t PceDisUtils::GetEffectiveAddress(DisassemblyInfo& info, PceConsole* console, PceCpuState& state) { - uint8_t* byteCode = info.GetByteCode(); switch(_opMode[info.GetOpCode()]) { default: break; - case PceAddrMode::ZeroX: return (uint8_t)(byteCode[1] + state.X); break; - case PceAddrMode::ZeroY: return (uint8_t)(byteCode[1] + state.Y); break; - - case PceAddrMode::IndX: { - uint8_t zeroAddr = byteCode[1] + state.X; - return memoryDumper->GetMemoryValue(MemoryType::PceMemory, zeroAddr) | memoryDumper->GetMemoryValue(MemoryType::PceMemory, (uint8_t)(zeroAddr + 1)) << 8; - } - - case PceAddrMode::IndY: { - uint8_t zeroAddr = byteCode[1]; - uint16_t addr = memoryDumper->GetMemoryValue(MemoryType::PceMemory, zeroAddr) | memoryDumper->GetMemoryValue(MemoryType::PceMemory, (uint8_t)(zeroAddr + 1)) << 8; - return (uint16_t)(addr + state.Y); - } - - case PceAddrMode::Ind: { - uint16_t addr = byteCode[1] | (byteCode[2] << 8); - if((addr & 0xFF) == 0xFF) { - //CPU bug when indirect address starts at the end of a page - uint8_t lo = memoryDumper->GetMemoryValue(MemoryType::PceMemory, addr); - uint8_t hi = memoryDumper->GetMemoryValue(MemoryType::PceMemory, addr & 0xFF00); - return lo | (hi << 8); - } else { - return memoryDumper->GetMemoryValue(MemoryType::PceMemory, addr); - } - } - + case PceAddrMode::Zero: + case PceAddrMode::ZeroX: + case PceAddrMode::ZeroY: + case PceAddrMode::IndX: + case PceAddrMode::IndY: + case PceAddrMode::Ind: case PceAddrMode::AbsX: case PceAddrMode::AbsXInd: - return (uint16_t)((byteCode[1] | (byteCode[2] << 8)) + state.X) & 0xFFFF; - case PceAddrMode::AbsY: - return (uint16_t)((byteCode[1] | (byteCode[2] << 8)) + state.Y) & 0xFFFF; + case PceAddrMode::ZInd: + case PceAddrMode::ZeroRel: + case PceAddrMode::ImZero: + case PceAddrMode::ImZeroX: + case PceAddrMode::ImAbs: + case PceAddrMode::ImAbsX: + DummyPceCpu pceCpu(nullptr, console->GetMemoryManager()); + pceCpu.SetDummyState(state); + pceCpu.Exec(); + + uint32_t count = pceCpu.GetOperationCount(); + for(int i = count - 1; i > 0; i--) { + MemoryOperationInfo opInfo = pceCpu.GetOperationInfo(i); + if(opInfo.Type != MemoryOperationType::ExecOperand) { + return opInfo.Address; + } + } + break; } return -1; diff --git a/Core/PCE/Debugger/PceDisUtils.h b/Core/PCE/Debugger/PceDisUtils.h index 1506d5be..4c6b5173 100644 --- a/Core/PCE/Debugger/PceDisUtils.h +++ b/Core/PCE/Debugger/PceDisUtils.h @@ -5,6 +5,7 @@ class DisassemblyInfo; class LabelManager; class MemoryDumper; class EmuSettings; +class PceConsole; struct PceCpuState; enum class PceAddrMode; @@ -15,7 +16,7 @@ private: public: static void GetDisassembly(DisassemblyInfo& info, string& out, uint32_t memoryAddr, LabelManager* labelManager, EmuSettings* settings); - static int32_t GetEffectiveAddress(DisassemblyInfo& info, PceCpuState& state, MemoryDumper* memoryDumper); + static int32_t GetEffectiveAddress(DisassemblyInfo& info, PceConsole* console, PceCpuState& state); static uint8_t GetOpSize(uint8_t opCode); static char const* const GetOpName(uint8_t opCode); diff --git a/Core/PCE/PceConsole.cpp b/Core/PCE/PceConsole.cpp index 966ec8c0..643b84f7 100644 --- a/Core/PCE/PceConsole.cpp +++ b/Core/PCE/PceConsole.cpp @@ -104,7 +104,7 @@ LoadRomResult PceConsole::LoadRom(VirtualFile& romFile) _psg.reset(new PcePsg(_emu)); _memoryManager.reset(new PceMemoryManager(_emu, this, _vpc.get(), _vce.get(), _controlManager.get(), _psg.get(), _mapper.get(), _cdrom.get(), romData, cardRamSize)); - _cpu.reset(new PceCpu(_emu, this, _memoryManager.get())); + _cpu.reset(new PceCpu(_emu, _memoryManager.get())); MessageManager::Log("-----------------"); MessageManager::Log("Loaded: " + romFile.GetFileName()); diff --git a/Core/PCE/PceCpu.cpp b/Core/PCE/PceCpu.cpp index 8c915b6d..a023b10b 100644 --- a/Core/PCE/PceCpu.cpp +++ b/Core/PCE/PceCpu.cpp @@ -48,10 +48,9 @@ PceAddrMode const PceCpu::_addrMode[] = { }; #ifndef DUMMYCPU -PceCpu::PceCpu(Emulator* emu, PceConsole* console, PceMemoryManager* memoryManager) +PceCpu::PceCpu(Emulator* emu, PceMemoryManager* memoryManager) { _emu = emu; - _console = console; _memoryManager = memoryManager; _instAddrMode = PceAddrMode::None; diff --git a/Core/PCE/PceCpu.h b/Core/PCE/PceCpu.h index 13d88c1c..a6f08948 100644 --- a/Core/PCE/PceCpu.h +++ b/Core/PCE/PceCpu.h @@ -10,7 +10,6 @@ #include "MemoryOperationType.h" class Emulator; -class PceConsole; class PceMemoryManager; class PceCpu @@ -31,7 +30,6 @@ private: static PceAddrMode const _addrMode[256]; Emulator* _emu; - PceConsole* _console; PceMemoryManager* _memoryManager; PceCpuState _state; @@ -294,14 +292,12 @@ private: void ProcessIrq(bool forBrk); public: - PceCpu(Emulator* emu, PceConsole* console, PceMemoryManager* memoryManager); + PceCpu(Emulator* emu, PceMemoryManager* memoryManager); PceCpuState& GetState() { return _state; } void Exec(); - - #ifdef DUMMYCPU private: uint32_t _memOpCounter = 0;