Debugger: GB - Added support for register labels + added default labels for GB registers

This commit is contained in:
Sour 2020-06-06 21:38:29 -04:00
parent 8324da37d2
commit 6ed9ed094a
9 changed files with 102 additions and 11 deletions

View file

@ -61,6 +61,7 @@ int64_t LabelManager::GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType)
case SnesMemoryType::GbCartRam: return absoluteAddr | ((uint64_t)14 << 32);
case SnesMemoryType::GbHighRam: return absoluteAddr | ((uint64_t)15 << 32);
case SnesMemoryType::GbBootRom: return absoluteAddr | ((uint64_t)16 << 32);
case SnesMemoryType::GameboyMemory: return absoluteAddr | ((uint64_t)17 << 32);
default: return -1;
}
}
@ -84,6 +85,7 @@ SnesMemoryType LabelManager::GetKeyMemoryType(uint64_t key)
case ((uint64_t)14 << 32): return SnesMemoryType::GbCartRam; break;
case ((uint64_t)15 << 32): return SnesMemoryType::GbHighRam; break;
case ((uint64_t)16 << 32): return SnesMemoryType::GbBootRom; break;
case ((uint64_t)17 << 32): return SnesMemoryType::GameboyMemory; break;
}
throw std::runtime_error("Invalid label key");
@ -91,21 +93,35 @@ SnesMemoryType LabelManager::GetKeyMemoryType(uint64_t key)
string LabelManager::GetLabel(AddressInfo address)
{
string label ;
if(address.Type <= DebugUtilities::GetLastCpuMemoryType()) {
if(address.Type == SnesMemoryType::GameboyMemory) {
//Labels for GB registers
if(InternalGetLabel(address, label)) {
return label;
}
}
address = _debugger->GetAbsoluteAddress(address);
}
if(address.Address >= 0) {
int64_t key = GetLabelKey(address.Address, address.Type);
if(key >= 0) {
auto result = _codeLabels.find(key);
if(result != _codeLabels.end()) {
return result->second.Label;
}
}
InternalGetLabel(address, label);
}
return "";
return label;
}
bool LabelManager::InternalGetLabel(AddressInfo address, string &label)
{
int64_t key = GetLabelKey(address.Address, address.Type);
if(key >= 0) {
auto result = _codeLabels.find(key);
if(result != _codeLabels.end()) {
label = result->second.Label;
return true;
}
}
return false;
}
string LabelManager::GetComment(AddressInfo absAddress)

View file

@ -32,6 +32,7 @@ private:
int64_t GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType);
SnesMemoryType GetKeyMemoryType(uint64_t key);
bool InternalGetLabel(AddressInfo address, string& label);
public:
LabelManager(Debugger *debugger);

View file

@ -155,7 +155,7 @@ namespace Mesen.GUI.Debugger.Code
if(absIndexedAddress.Address > absAddress.Address) {
location.ArrayIndex = absIndexedAddress.Address - absAddress.Address;
}
} else if(absAddress.Type == SnesMemoryType.Register) {
} else if(absAddress.Type.IsRelativeMemory() || absAddress.Type == SnesMemoryType.Register) {
relativeAddress = absAddress.Address;
} else {
relativeAddress = location.Label.GetRelativeAddress(this.CpuType).Address + (location.ArrayIndex ?? 0);

View file

@ -35,6 +35,7 @@ namespace Mesen.GUI.Debugger.Labels
case SnesMemoryType.GbCartRam: sb.Append("GBSRAM:"); break;
case SnesMemoryType.GbHighRam: sb.Append("GBHRAM:"); break;
case SnesMemoryType.GbBootRom: sb.Append("GBBOOT:"); break;
case SnesMemoryType.GameboyMemory: sb.Append("GBREG:"); break;
}
sb.Append(Address.ToString("X4"));
@ -76,6 +77,7 @@ namespace Mesen.GUI.Debugger.Labels
case "GBSRAM": type = SnesMemoryType.GbCartRam; break;
case "GBHRAM": type = SnesMemoryType.GbHighRam; break;
case "GBBOOT": type = SnesMemoryType.GbBootRom; break;
case "GBREG": type = SnesMemoryType.GameboyMemory; break;
default: return null;
}

View file

@ -93,6 +93,7 @@ namespace Mesen.GUI.Debugger.Labels
case SnesMemoryType.GbCartRam: return address | ((ulong)14 << 32);
case SnesMemoryType.GbHighRam: return address | ((ulong)15 << 32);
case SnesMemoryType.GbBootRom: return address | ((ulong)16 << 32);
case SnesMemoryType.GameboyMemory: return address | ((ulong)17 << 32);
}
throw new Exception("Invalid type");
}
@ -247,6 +248,15 @@ namespace Mesen.GUI.Debugger.Labels
}
public static void SetDefaultLabels()
{
if(EmuApi.GetRomInfo().CoprocessorType == CoprocessorType.Gameboy) {
SetGameboyDefaultLabels();
} else {
SetSnesDefaultLabels();
}
}
private static void SetSnesDefaultLabels()
{
//B-Bus registers
LabelManager.SetLabel(0x2100, SnesMemoryType.Register, "INIDISP", "Screen Display Register");
@ -390,6 +400,66 @@ namespace Mesen.GUI.Debugger.Labels
LabelManager.SetLabel(0xFE, SnesMemoryType.SpcRam, "T1OUT", "Timer 1 output");
LabelManager.SetLabel(0xFF, SnesMemoryType.SpcRam, "T2OUT", "Timer 2 output");
}
private static void SetGameboyDefaultLabels()
{
//LCD
LabelManager.SetLabel(0xFF40, SnesMemoryType.GameboyMemory, "LCDC_FF40", "LCD Control");
LabelManager.SetLabel(0xFF41, SnesMemoryType.GameboyMemory, "STAT_FF41", "LCD Status");
LabelManager.SetLabel(0xFF42, SnesMemoryType.GameboyMemory, "SCY_FF42", "Scroll Y");
LabelManager.SetLabel(0xFF43, SnesMemoryType.GameboyMemory, "SCX_FF43", "Scroll X");
LabelManager.SetLabel(0xFF44, SnesMemoryType.GameboyMemory, "LY_FF44", "LCD Y-Coordinate");
LabelManager.SetLabel(0xFF45, SnesMemoryType.GameboyMemory, "LYC_FF45", "LY Compare");
LabelManager.SetLabel(0xFF47, SnesMemoryType.GameboyMemory, "BGP_FF47", "BG Palette Data");
LabelManager.SetLabel(0xFF48, SnesMemoryType.GameboyMemory, "OBP0_FF48", "Object Palette 0 Data");
LabelManager.SetLabel(0xFF49, SnesMemoryType.GameboyMemory, "OBP1_FF49", "Object Palette 1 Data");
LabelManager.SetLabel(0xFF4A, SnesMemoryType.GameboyMemory, "WY_FF4A", "Window Y Position");
LabelManager.SetLabel(0xFF4B, SnesMemoryType.GameboyMemory, "WX_FF4B", "Window X Position");
//APU
LabelManager.SetLabel(0xFF10, SnesMemoryType.GameboyMemory, "NR10_FF10", "Channel 1 Sweep");
LabelManager.SetLabel(0xFF11, SnesMemoryType.GameboyMemory, "NR11_FF11", "Channel 1 Length/Wave Pattern Duty");
LabelManager.SetLabel(0xFF12, SnesMemoryType.GameboyMemory, "NR12_FF12", "Channel 1 Volume Envelope");
LabelManager.SetLabel(0xFF13, SnesMemoryType.GameboyMemory, "NR13_FF13", "Channel 1 Frequency Low");
LabelManager.SetLabel(0xFF14, SnesMemoryType.GameboyMemory, "NR14_FF14", "Channel 1 Frequency High");
LabelManager.SetLabel(0xFF16, SnesMemoryType.GameboyMemory, "NR21_FF16", "Channel 2 Length/Wave Pattern Duty");
LabelManager.SetLabel(0xFF17, SnesMemoryType.GameboyMemory, "NR22_FF17", "Channel 2 Volume Envelope");
LabelManager.SetLabel(0xFF18, SnesMemoryType.GameboyMemory, "NR23_FF18", "Channel 2 Frequency Low");
LabelManager.SetLabel(0xFF19, SnesMemoryType.GameboyMemory, "NR24_FF19", "Channel 2 Frequency High");
LabelManager.SetLabel(0xFF1A, SnesMemoryType.GameboyMemory, "NR30_FF1A", "Channel 3 On/Off ");
LabelManager.SetLabel(0xFF1B, SnesMemoryType.GameboyMemory, "NR31_FF1B", "Channel 3 Length");
LabelManager.SetLabel(0xFF1C, SnesMemoryType.GameboyMemory, "NR32_FF1C", "Channel 3 Output Level");
LabelManager.SetLabel(0xFF1D, SnesMemoryType.GameboyMemory, "NR33_FF1D", "Channel 3 Frequency Low");
LabelManager.SetLabel(0xFF1E, SnesMemoryType.GameboyMemory, "NR34_FF1E", "Channel 3 Frequency High");
LabelManager.SetLabel(0xFF20, SnesMemoryType.GameboyMemory, "NR41_FF20", "Channel 4 Length");
LabelManager.SetLabel(0xFF21, SnesMemoryType.GameboyMemory, "NR42_FF21", "Channel 4 Volume Envelope");
LabelManager.SetLabel(0xFF22, SnesMemoryType.GameboyMemory, "NR43_FF22", "Channel 4 Polynomial Counter");
LabelManager.SetLabel(0xFF23, SnesMemoryType.GameboyMemory, "NR44_FF23", "Channel 4 Loop");
LabelManager.SetLabel(0xFF24, SnesMemoryType.GameboyMemory, "NR50_FF24", "Channel Volume");
LabelManager.SetLabel(0xFF25, SnesMemoryType.GameboyMemory, "NR51_FF25", "Channel Left/Right");
LabelManager.SetLabel(0xFF26, SnesMemoryType.GameboyMemory, "NR52_FF26", "Channel On/Off");
//Others
LabelManager.SetLabel(0xFF00, SnesMemoryType.GameboyMemory, "JOYP_FF00", "Joypad");
LabelManager.SetLabel(0xFF01, SnesMemoryType.GameboyMemory, "SB_FF01", "Serial Data");
LabelManager.SetLabel(0xFF02, SnesMemoryType.GameboyMemory, "SC_FF02", "Serial Control");
LabelManager.SetLabel(0xFF04, SnesMemoryType.GameboyMemory, "DIV_FF04", "Divider");
LabelManager.SetLabel(0xFF05, SnesMemoryType.GameboyMemory, "TIMA_FF05", "Timer Counter");
LabelManager.SetLabel(0xFF06, SnesMemoryType.GameboyMemory, "TMA_FF06", "Timer Modulo");
LabelManager.SetLabel(0xFF07, SnesMemoryType.GameboyMemory, "TAC_FF07", "Timer Control");
LabelManager.SetLabel(0xFF0F, SnesMemoryType.GameboyMemory, "IF_FF0F", "Interrupt Flag");
LabelManager.SetLabel(0xFFFF, SnesMemoryType.GameboyMemory, "IE_FFFF", "Interrupt Enable");
LabelManager.SetLabel(0xFF46, SnesMemoryType.GameboyMemory, "DMA_FF46", "OAM DMA Start");
}
}
[Flags]

View file

@ -142,6 +142,7 @@ namespace Mesen.GUI.Debugger.Controls
case SnesMemoryType.GbCartRam: prefix = "SRAM: $"; break;
case SnesMemoryType.GbHighRam: prefix = "HRAM: $"; break;
case SnesMemoryType.GbBootRom: prefix = "BOOT: $"; break;
case SnesMemoryType.GameboyMemory: prefix = "REG: $"; break;
default: throw new Exception("Unsupported type");
}
int relAddress = label.GetRelativeAddress(_cpuType).Address;

View file

@ -67,6 +67,7 @@ namespace Mesen.GUI.Debugger
if(DebugApi.GetMemorySize(SnesMemoryType.GbBootRom) > 0) {
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GbBootRom));
}
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GameboyMemory));
}
}

View file

@ -497,7 +497,7 @@ namespace Mesen.GUI.Debugger.Controls
mnuEditBreakpoint.Text = $"Edit Breakpoint ({addressRange})";
mnuAddToWatch.Text = $"Add to Watch ({addressRange})";
if(_memoryType == SnesMemoryType.CpuMemory || _memoryType == SnesMemoryType.SpcMemory) {
if(_memoryType.IsRelativeMemory()) {
AddressInfo relAddress = new AddressInfo() {
Address = (int)startAddress,
Type = _memoryType
@ -511,7 +511,6 @@ namespace Mesen.GUI.Debugger.Controls
mnuAddToWatch.Enabled = false;
}
if(_memoryType == SnesMemoryType.CpuMemory || _memoryType == SnesMemoryType.GameboyMemory) {
AddressInfo start = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = (int)startAddress, Type = _memoryType });
AddressInfo end = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = (int)endAddress, Type = _memoryType });

View file

@ -250,6 +250,7 @@ namespace Mesen.GUI
case SnesMemoryType.GbCartRam:
case SnesMemoryType.GbHighRam:
case SnesMemoryType.GbBootRom:
case SnesMemoryType.GameboyMemory:
return CpuType.Gameboy;
default: