diff --git a/Core/Disassembler.cpp b/Core/Disassembler.cpp index 666d55a..2ec1265 100644 --- a/Core/Disassembler.cpp +++ b/Core/Disassembler.cpp @@ -11,6 +11,7 @@ #include "BsxCart.h" #include "BsxMemoryPack.h" #include "Gameboy.h" +#include "GbCpu.h" #include "Debugger.h" #include "MemoryManager.h" #include "LabelManager.h" @@ -638,7 +639,8 @@ bool Disassembler::GetLineData(CpuType type, uint32_t lineIndex, CodeLineData &d data.ValueSize = 0; break; - case CpuType::Gameboy: + case CpuType::Gameboy: { + GbCpuState state = _gameboy->GetCpu()->GetState(); if(!disInfo.IsInitialized()) { disInfo = DisassemblyInfo(src.Data + result.Address.Address, 0, CpuType::Gameboy); } else { @@ -646,9 +648,10 @@ bool Disassembler::GetLineData(CpuType type, uint32_t lineIndex, CodeLineData &d } data.OpSize = disInfo.GetOpSize(); - data.EffectiveAddress = -1; + data.EffectiveAddress = disInfo.GetEffectiveAddress(_console, &state, lineCpuType); data.ValueSize = 0; break; + } } string text; diff --git a/Core/DisassemblyInfo.cpp b/Core/DisassemblyInfo.cpp index 129cf61..839f4f4 100644 --- a/Core/DisassemblyInfo.cpp +++ b/Core/DisassemblyInfo.cpp @@ -93,8 +93,9 @@ int32_t DisassemblyInfo::GetEffectiveAddress(Console *console, void *cpuState, C case CpuType::Cx4: case CpuType::NecDsp: - case CpuType::Gameboy: return -1; + + case CpuType::Gameboy: return GameboyDisUtils::GetEffectiveAddress(*this, console, *(GbCpuState*)cpuState); } return -1; } diff --git a/Core/GameboyDisUtils.cpp b/Core/GameboyDisUtils.cpp index 7b03a9b..5a6d27b 100644 --- a/Core/GameboyDisUtils.cpp +++ b/Core/GameboyDisUtils.cpp @@ -64,6 +64,35 @@ constexpr const uint8_t _opSize[256] = { 2,1,1,1,1,1,2,1,2,1,3,1,1,1,2,1, }; +static enum class AddrType : uint8_t +{ + None, + BC, + DE, + HL, + C, + Suff +}; + +static constexpr const AddrType _gbEffAddrType[256] = { + AddrType::None,AddrType::None,AddrType::BC, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::BC, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::DE, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::DE, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::HL, AddrType::HL, AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::HL, AddrType::HL, AddrType::HL, AddrType::HL, AddrType::HL, AddrType::HL, AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::HL, AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::Suff,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::C,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None, + AddrType::None,AddrType::None,AddrType::C,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None,AddrType::None +}; + void GameboyDisUtils::GetDisassembly(DisassemblyInfo& info, string& out, uint32_t memoryAddr, LabelManager* labelManager, EmuSettings* settings) { FastString str(settings->CheckDebuggerFlag(DebuggerFlags::UseLowerCaseDisassembly)); @@ -109,7 +138,20 @@ void GameboyDisUtils::GetDisassembly(DisassemblyInfo& info, string& out, uint32_ int32_t GameboyDisUtils::GetEffectiveAddress(DisassemblyInfo& info, Console* console, GbCpuState& state) { - return -1; + switch(_gbEffAddrType[info.GetOpCode()]) { + default: + case AddrType::None: return -1; + + case AddrType::BC: return (state.B << 8) | state.C; + case AddrType::DE: return (state.D << 8) | state.E; + case AddrType::HL: return (state.H << 8) | state.L; + case AddrType::C: return 0xFF00 + state.C; + case AddrType::Suff: + if((info.GetByteCode()[1] & 0x07) == 0x06) { + return (state.H << 8) | state.L; + } + return -1; + } } uint8_t GameboyDisUtils::GetOpSize(uint8_t opCode)