diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index bd3bf2ac..8bcd8f04 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -518,6 +518,7 @@ int32_t Debugger::GetRelativeAddress(uint32_t addr, AddressType type) { switch(type) { case AddressType::InternalRam: + case AddressType::Register: return addr; case AddressType::PrgRom: diff --git a/Core/DebuggerTypes.h b/Core/DebuggerTypes.h index 16ac45f9..85918f85 100644 --- a/Core/DebuggerTypes.h +++ b/Core/DebuggerTypes.h @@ -13,6 +13,7 @@ enum class AddressType PrgRom = 1, WorkRam = 2, SaveRam = 3, + Register = 4 }; struct AddressTypeInfo diff --git a/Core/Disassembler.cpp b/Core/Disassembler.cpp index e5ffe5e2..926204bb 100644 --- a/Core/Disassembler.cpp +++ b/Core/Disassembler.cpp @@ -214,7 +214,7 @@ string Disassembler::GetCode(uint32_t startAddr, uint32_t endAddr, uint16_t memo uint32_t byteCount = 0; bool skippingCode = false; while(addr <= endAddr) { - string label = labelManager->GetLabel(memoryAddr); + string label = labelManager->GetLabel(memoryAddr, false); string commentString = labelManager->GetComment(memoryAddr); string labelString = label.empty() ? "" : ("\x1\x1\x1" + label + ":\n"); bool multilineComment = commentString.find_first_of('\n') != string::npos; diff --git a/Core/DisassemblyInfo.cpp b/Core/DisassemblyInfo.cpp index 5ef358cf..d1c06e8f 100644 --- a/Core/DisassemblyInfo.cpp +++ b/Core/DisassemblyInfo.cpp @@ -26,7 +26,7 @@ string DisassemblyInfo::ToString(uint32_t memoryAddr, shared_ptr string operandValue; if(labelManager && _opMode != AddrMode::Imm) { - operandValue = labelManager->GetLabel(_opAddr); + operandValue = labelManager->GetLabel(_opAddr, true); } if(operandValue.empty()) { @@ -38,7 +38,7 @@ string DisassemblyInfo::ToString(uint32_t memoryAddr, shared_ptr output << " "; switch(_opMode) { - case AddrMode::Acc: output << " A"; break; + case AddrMode::Acc: output << "A"; break; case AddrMode::Imm: output << "#" << operandValue; break; case AddrMode::Ind: output << "(" << operandValue << ")"; break; case AddrMode::IndX: output << "(" << operandValue << ",X)"; break; @@ -116,7 +116,7 @@ string DisassemblyInfo::GetEffectiveAddressString(State& cpuState, shared_ptrGetLabel(effectiveAddress); + string label = labelManager->GetLabel(effectiveAddress, true); if(!label.empty()) { return " @ " + label; } diff --git a/Core/LabelManager.cpp b/Core/LabelManager.cpp index 49b88e9a..c556addc 100644 --- a/Core/LabelManager.cpp +++ b/Core/LabelManager.cpp @@ -10,10 +10,11 @@ LabelManager::LabelManager(shared_ptr mapper) void LabelManager::SetLabel(uint32_t address, AddressType addressType, string label, string comment) { switch(addressType) { - case AddressType::InternalRam: address |= 0x40000000; break; - case AddressType::PrgRom: address |= 0x20000000; break; - case AddressType::WorkRam: address |= 0x10000000; break; - case AddressType::SaveRam: address |= 0x08000000; break; + case AddressType::InternalRam: address |= 0x70000000; break; + case AddressType::PrgRom: address |= 0x60000000; break; + case AddressType::WorkRam: address |= 0x50000000; break; + case AddressType::SaveRam: address |= 0x40000000; break; + case AddressType::Register: address |= 0x30000000; break; } auto existingLabel = _codeLabels.find(address); @@ -33,36 +34,41 @@ void LabelManager::SetLabel(uint32_t address, AddressType addressType, string la } } -int32_t LabelManager::GetLabelAddress(uint16_t relativeAddr) +int32_t LabelManager::GetLabelAddress(uint16_t relativeAddr, bool checkRegisters) { if(relativeAddr < 0x2000) { - return relativeAddr | 0x40000000; + return relativeAddr | 0x70000000; } else { int32_t addr = _mapper->ToAbsoluteAddress(relativeAddr); if(addr >= 0) { //PRG ROM - return addr | 0x20000000; + return addr | 0x60000000; } addr = _mapper->ToAbsoluteWorkRamAddress(relativeAddr); if(addr >= 0) { //Work RAM - return addr | 0x10000000; + return addr | 0x50000000; } addr = _mapper->ToAbsoluteSaveRamAddress(relativeAddr); if(addr >= 0) { //Save RAM - return addr | 0x08000000; + return addr | 0x40000000; + } + + //Register + if(checkRegisters) { + return relativeAddr | 0x30000000; } } return -1; } -string LabelManager::GetLabel(uint16_t relativeAddr) +string LabelManager::GetLabel(uint16_t relativeAddr, bool checkRegisters) { - uint32_t labelAddr = GetLabelAddress(relativeAddr); + uint32_t labelAddr = GetLabelAddress(relativeAddr, checkRegisters); if(labelAddr >= 0) { auto result = _codeLabels.find(labelAddr); @@ -76,7 +82,7 @@ string LabelManager::GetLabel(uint16_t relativeAddr) string LabelManager::GetComment(uint16_t relativeAddr) { - uint32_t labelAddr = GetLabelAddress(relativeAddr); + uint32_t labelAddr = GetLabelAddress(relativeAddr, false); if(labelAddr >= 0) { auto result = _codeComments.find(labelAddr); @@ -94,18 +100,20 @@ int32_t LabelManager::GetLabelRelativeAddress(string label) if(result != _codeLabelReverseLookup.end()) { uint32_t address = result->second; AddressType type = AddressType::InternalRam; - if(address & 0x40000000) { + if((address & 0x70000000) == 0x70000000) { type = AddressType::InternalRam; - } else if(address & 0x20000000) { + } else if((address & 0x60000000) == 0x60000000) { type = AddressType::PrgRom; - } else if(address & 0x10000000) { + } else if((address & 0x50000000) == 0x50000000) { type = AddressType::WorkRam; - } else if(address & 0x08000000) { + } else if((address & 0x40000000) == 0x40000000) { type = AddressType::SaveRam; - } else { + }/* else if((address & 0x30000000) == 0x30000000) { + type = AddressType::Register; + }*/ else { return -1; } - return _mapper->FromAbsoluteAddress(address & 0x07FFFFFF, type); + return _mapper->FromAbsoluteAddress(address & 0x0FFFFFFF, type); } return -1; } \ No newline at end of file diff --git a/Core/LabelManager.h b/Core/LabelManager.h index 48a52de0..e9d914b1 100644 --- a/Core/LabelManager.h +++ b/Core/LabelManager.h @@ -15,7 +15,7 @@ private: shared_ptr _mapper; - int32_t GetLabelAddress(uint16_t relativeAddr); + int32_t GetLabelAddress(uint16_t relativeAddr, bool checkRegisters); public: LabelManager(shared_ptr mapper); @@ -24,6 +24,6 @@ public: int32_t GetLabelRelativeAddress(string label); - string GetLabel(uint16_t relativeAddr); + string GetLabel(uint16_t relativeAddr, bool checkRegisters); string GetComment(uint16_t relativeAddr); }; diff --git a/GUI.NET/InteropEmu.cs b/GUI.NET/InteropEmu.cs index 5ec75d86..6b267a9f 100644 --- a/GUI.NET/InteropEmu.cs +++ b/GUI.NET/InteropEmu.cs @@ -1037,6 +1037,7 @@ namespace Mesen.GUI PrgRom = 1, WorkRam = 2, SaveRam = 3, + Register = 4 } public struct AddressTypeInfo