Debugger: Allow adding labels to registers

This commit is contained in:
Souryo 2016-11-23 18:48:29 -05:00
parent 672dbca4dd
commit 5bef5bdd1a
7 changed files with 35 additions and 24 deletions

View file

@ -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:

View file

@ -13,6 +13,7 @@ enum class AddressType
PrgRom = 1,
WorkRam = 2,
SaveRam = 3,
Register = 4
};
struct AddressTypeInfo

View file

@ -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;

View file

@ -26,7 +26,7 @@ string DisassemblyInfo::ToString(uint32_t memoryAddr, shared_ptr<MemoryManager>
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<MemoryManager>
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_ptr<Me
} else {
bool empty = true;
if(labelManager) {
string label = labelManager->GetLabel(effectiveAddress);
string label = labelManager->GetLabel(effectiveAddress, true);
if(!label.empty()) {
return " @ " + label;
}

View file

@ -10,10 +10,11 @@ LabelManager::LabelManager(shared_ptr<BaseMapper> 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;
}

View file

@ -15,7 +15,7 @@ private:
shared_ptr<BaseMapper> _mapper;
int32_t GetLabelAddress(uint16_t relativeAddr);
int32_t GetLabelAddress(uint16_t relativeAddr, bool checkRegisters);
public:
LabelManager(shared_ptr<BaseMapper> 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);
};

View file

@ -1037,6 +1037,7 @@ namespace Mesen.GUI
PrgRom = 1,
WorkRam = 2,
SaveRam = 3,
Register = 4
}
public struct AddressTypeInfo