Debugger: GB - Added support for register labels + added default labels for GB registers
This commit is contained in:
parent
8324da37d2
commit
6ed9ed094a
9 changed files with 102 additions and 11 deletions
|
@ -61,6 +61,7 @@ int64_t LabelManager::GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType)
|
||||||
case SnesMemoryType::GbCartRam: return absoluteAddr | ((uint64_t)14 << 32);
|
case SnesMemoryType::GbCartRam: return absoluteAddr | ((uint64_t)14 << 32);
|
||||||
case SnesMemoryType::GbHighRam: return absoluteAddr | ((uint64_t)15 << 32);
|
case SnesMemoryType::GbHighRam: return absoluteAddr | ((uint64_t)15 << 32);
|
||||||
case SnesMemoryType::GbBootRom: return absoluteAddr | ((uint64_t)16 << 32);
|
case SnesMemoryType::GbBootRom: return absoluteAddr | ((uint64_t)16 << 32);
|
||||||
|
case SnesMemoryType::GameboyMemory: return absoluteAddr | ((uint64_t)17 << 32);
|
||||||
default: return -1;
|
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)14 << 32): return SnesMemoryType::GbCartRam; break;
|
||||||
case ((uint64_t)15 << 32): return SnesMemoryType::GbHighRam; break;
|
case ((uint64_t)15 << 32): return SnesMemoryType::GbHighRam; break;
|
||||||
case ((uint64_t)16 << 32): return SnesMemoryType::GbBootRom; 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");
|
throw std::runtime_error("Invalid label key");
|
||||||
|
@ -91,21 +93,35 @@ SnesMemoryType LabelManager::GetKeyMemoryType(uint64_t key)
|
||||||
|
|
||||||
string LabelManager::GetLabel(AddressInfo address)
|
string LabelManager::GetLabel(AddressInfo address)
|
||||||
{
|
{
|
||||||
|
string label ;
|
||||||
if(address.Type <= DebugUtilities::GetLastCpuMemoryType()) {
|
if(address.Type <= DebugUtilities::GetLastCpuMemoryType()) {
|
||||||
|
if(address.Type == SnesMemoryType::GameboyMemory) {
|
||||||
|
//Labels for GB registers
|
||||||
|
if(InternalGetLabel(address, label)) {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
}
|
||||||
address = _debugger->GetAbsoluteAddress(address);
|
address = _debugger->GetAbsoluteAddress(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(address.Address >= 0) {
|
if(address.Address >= 0) {
|
||||||
int64_t key = GetLabelKey(address.Address, address.Type);
|
InternalGetLabel(address, label);
|
||||||
if(key >= 0) {
|
|
||||||
auto result = _codeLabels.find(key);
|
|
||||||
if(result != _codeLabels.end()) {
|
|
||||||
return result->second.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)
|
string LabelManager::GetComment(AddressInfo absAddress)
|
||||||
|
|
|
@ -32,6 +32,7 @@ private:
|
||||||
|
|
||||||
int64_t GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType);
|
int64_t GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType);
|
||||||
SnesMemoryType GetKeyMemoryType(uint64_t key);
|
SnesMemoryType GetKeyMemoryType(uint64_t key);
|
||||||
|
bool InternalGetLabel(AddressInfo address, string& label);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LabelManager(Debugger *debugger);
|
LabelManager(Debugger *debugger);
|
||||||
|
|
|
@ -155,7 +155,7 @@ namespace Mesen.GUI.Debugger.Code
|
||||||
if(absIndexedAddress.Address > absAddress.Address) {
|
if(absIndexedAddress.Address > absAddress.Address) {
|
||||||
location.ArrayIndex = 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;
|
relativeAddress = absAddress.Address;
|
||||||
} else {
|
} else {
|
||||||
relativeAddress = location.Label.GetRelativeAddress(this.CpuType).Address + (location.ArrayIndex ?? 0);
|
relativeAddress = location.Label.GetRelativeAddress(this.CpuType).Address + (location.ArrayIndex ?? 0);
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace Mesen.GUI.Debugger.Labels
|
||||||
case SnesMemoryType.GbCartRam: sb.Append("GBSRAM:"); break;
|
case SnesMemoryType.GbCartRam: sb.Append("GBSRAM:"); break;
|
||||||
case SnesMemoryType.GbHighRam: sb.Append("GBHRAM:"); break;
|
case SnesMemoryType.GbHighRam: sb.Append("GBHRAM:"); break;
|
||||||
case SnesMemoryType.GbBootRom: sb.Append("GBBOOT:"); break;
|
case SnesMemoryType.GbBootRom: sb.Append("GBBOOT:"); break;
|
||||||
|
case SnesMemoryType.GameboyMemory: sb.Append("GBREG:"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.Append(Address.ToString("X4"));
|
sb.Append(Address.ToString("X4"));
|
||||||
|
@ -76,6 +77,7 @@ namespace Mesen.GUI.Debugger.Labels
|
||||||
case "GBSRAM": type = SnesMemoryType.GbCartRam; break;
|
case "GBSRAM": type = SnesMemoryType.GbCartRam; break;
|
||||||
case "GBHRAM": type = SnesMemoryType.GbHighRam; break;
|
case "GBHRAM": type = SnesMemoryType.GbHighRam; break;
|
||||||
case "GBBOOT": type = SnesMemoryType.GbBootRom; break;
|
case "GBBOOT": type = SnesMemoryType.GbBootRom; break;
|
||||||
|
case "GBREG": type = SnesMemoryType.GameboyMemory; break;
|
||||||
default: return null;
|
default: return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,7 @@ namespace Mesen.GUI.Debugger.Labels
|
||||||
case SnesMemoryType.GbCartRam: return address | ((ulong)14 << 32);
|
case SnesMemoryType.GbCartRam: return address | ((ulong)14 << 32);
|
||||||
case SnesMemoryType.GbHighRam: return address | ((ulong)15 << 32);
|
case SnesMemoryType.GbHighRam: return address | ((ulong)15 << 32);
|
||||||
case SnesMemoryType.GbBootRom: return address | ((ulong)16 << 32);
|
case SnesMemoryType.GbBootRom: return address | ((ulong)16 << 32);
|
||||||
|
case SnesMemoryType.GameboyMemory: return address | ((ulong)17 << 32);
|
||||||
}
|
}
|
||||||
throw new Exception("Invalid type");
|
throw new Exception("Invalid type");
|
||||||
}
|
}
|
||||||
|
@ -247,6 +248,15 @@ namespace Mesen.GUI.Debugger.Labels
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetDefaultLabels()
|
public static void SetDefaultLabels()
|
||||||
|
{
|
||||||
|
if(EmuApi.GetRomInfo().CoprocessorType == CoprocessorType.Gameboy) {
|
||||||
|
SetGameboyDefaultLabels();
|
||||||
|
} else {
|
||||||
|
SetSnesDefaultLabels();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetSnesDefaultLabels()
|
||||||
{
|
{
|
||||||
//B-Bus registers
|
//B-Bus registers
|
||||||
LabelManager.SetLabel(0x2100, SnesMemoryType.Register, "INIDISP", "Screen Display Register");
|
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(0xFE, SnesMemoryType.SpcRam, "T1OUT", "Timer 1 output");
|
||||||
LabelManager.SetLabel(0xFF, SnesMemoryType.SpcRam, "T2OUT", "Timer 2 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]
|
[Flags]
|
||||||
|
|
|
@ -142,6 +142,7 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
case SnesMemoryType.GbCartRam: prefix = "SRAM: $"; break;
|
case SnesMemoryType.GbCartRam: prefix = "SRAM: $"; break;
|
||||||
case SnesMemoryType.GbHighRam: prefix = "HRAM: $"; break;
|
case SnesMemoryType.GbHighRam: prefix = "HRAM: $"; break;
|
||||||
case SnesMemoryType.GbBootRom: prefix = "BOOT: $"; break;
|
case SnesMemoryType.GbBootRom: prefix = "BOOT: $"; break;
|
||||||
|
case SnesMemoryType.GameboyMemory: prefix = "REG: $"; break;
|
||||||
default: throw new Exception("Unsupported type");
|
default: throw new Exception("Unsupported type");
|
||||||
}
|
}
|
||||||
int relAddress = label.GetRelativeAddress(_cpuType).Address;
|
int relAddress = label.GetRelativeAddress(_cpuType).Address;
|
||||||
|
|
|
@ -67,6 +67,7 @@ namespace Mesen.GUI.Debugger
|
||||||
if(DebugApi.GetMemorySize(SnesMemoryType.GbBootRom) > 0) {
|
if(DebugApi.GetMemorySize(SnesMemoryType.GbBootRom) > 0) {
|
||||||
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GbBootRom));
|
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GbBootRom));
|
||||||
}
|
}
|
||||||
|
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GameboyMemory));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -497,7 +497,7 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
mnuEditBreakpoint.Text = $"Edit Breakpoint ({addressRange})";
|
mnuEditBreakpoint.Text = $"Edit Breakpoint ({addressRange})";
|
||||||
mnuAddToWatch.Text = $"Add to Watch ({addressRange})";
|
mnuAddToWatch.Text = $"Add to Watch ({addressRange})";
|
||||||
|
|
||||||
if(_memoryType == SnesMemoryType.CpuMemory || _memoryType == SnesMemoryType.SpcMemory) {
|
if(_memoryType.IsRelativeMemory()) {
|
||||||
AddressInfo relAddress = new AddressInfo() {
|
AddressInfo relAddress = new AddressInfo() {
|
||||||
Address = (int)startAddress,
|
Address = (int)startAddress,
|
||||||
Type = _memoryType
|
Type = _memoryType
|
||||||
|
@ -511,7 +511,6 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
mnuAddToWatch.Enabled = false;
|
mnuAddToWatch.Enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(_memoryType == SnesMemoryType.CpuMemory || _memoryType == SnesMemoryType.GameboyMemory) {
|
if(_memoryType == SnesMemoryType.CpuMemory || _memoryType == SnesMemoryType.GameboyMemory) {
|
||||||
AddressInfo start = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = (int)startAddress, Type = _memoryType });
|
AddressInfo start = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = (int)startAddress, Type = _memoryType });
|
||||||
AddressInfo end = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = (int)endAddress, Type = _memoryType });
|
AddressInfo end = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = (int)endAddress, Type = _memoryType });
|
||||||
|
|
|
@ -250,6 +250,7 @@ namespace Mesen.GUI
|
||||||
case SnesMemoryType.GbCartRam:
|
case SnesMemoryType.GbCartRam:
|
||||||
case SnesMemoryType.GbHighRam:
|
case SnesMemoryType.GbHighRam:
|
||||||
case SnesMemoryType.GbBootRom:
|
case SnesMemoryType.GbBootRom:
|
||||||
|
case SnesMemoryType.GameboyMemory:
|
||||||
return CpuType.Gameboy;
|
return CpuType.Gameboy;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Reference in a new issue