From 0c9cbe4da0a0edfc10b596c73844db68abd49efb Mon Sep 17 00:00:00 2001 From: Sour Date: Tue, 2 Jan 2018 12:06:20 -0500 Subject: [PATCH] Debugger: Improve CPU memory mapping display (vs work ram and save ram regions) --- Core/BaseMapper.cpp | 24 +++++++++++++ Core/Types.h | 7 +++- .../Debugger/Controls/ctrlMemoryMapping.cs | 34 +++++++++++++++++-- GUI.NET/InteropEmu.cs | 5 +++ 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/Core/BaseMapper.cpp b/Core/BaseMapper.cpp index c5adfd35..bf8d9895 100644 --- a/Core/BaseMapper.cpp +++ b/Core/BaseMapper.cpp @@ -1067,6 +1067,30 @@ CartridgeState BaseMapper::GetState() for(int i = 0; i < 4; i++) { state.Nametables[i] = _nametableIndexes[i]; } + + state.WorkRamStart = -1; + state.WorkRamEnd = -1; + state.SaveRamStart = -1; + state.SaveRamEnd = -1; + for(int i = 0x40; i < 0x100; i++) { + int32_t address = ToAbsoluteWorkRamAddress(i << 8); + if(address >= 0) { + if(state.WorkRamStart < 0) { + state.WorkRamStart = i << 8; + } else { + state.WorkRamEnd = (i << 8) + 0x100; + } + } else { + address = ToAbsoluteSaveRamAddress(i << 8); + if(address >= 0) { + if(state.SaveRamStart < 0) { + state.SaveRamStart = i << 8; + } else { + state.SaveRamEnd = (i << 8) + 0x100; + } + } + } + } return state; } diff --git a/Core/Types.h b/Core/Types.h index 1530318b..629991b0 100644 --- a/Core/Types.h +++ b/Core/Types.h @@ -69,7 +69,7 @@ struct CartridgeState uint32_t PrgRomSize; uint32_t ChrRomSize; uint32_t ChrRamSize; - + uint32_t PrgPageCount; uint32_t PrgPageSize; uint32_t PrgSelectedPages[64]; @@ -77,6 +77,11 @@ struct CartridgeState uint32_t ChrPageSize; uint32_t ChrSelectedPages[64]; uint32_t Nametables[8]; + + int32_t WorkRamStart; + int32_t WorkRamEnd; + int32_t SaveRamStart; + int32_t SaveRamEnd; }; struct PPUControlFlags diff --git a/GUI.NET/Debugger/Controls/ctrlMemoryMapping.cs b/GUI.NET/Debugger/Controls/ctrlMemoryMapping.cs index f3d8876e..eac0417a 100644 --- a/GUI.NET/Debugger/Controls/ctrlMemoryMapping.cs +++ b/GUI.NET/Debugger/Controls/ctrlMemoryMapping.cs @@ -47,10 +47,38 @@ namespace Mesen.GUI.Debugger.Controls regions.Add(new MemoryRegionInfo() { Name = "Internal RAM", Size = 0x2000, Color = Color.FromArgb(222, 222, 222) }); regions.Add(new MemoryRegionInfo() { Name = "CPU Registers", Size = 0x2020, Color = Color.FromArgb(222, 222, 222) }); - regions.Add(new MemoryRegionInfo() { Name = "N/A", Size = 0x1FE0, Color = Color.FromArgb(222, 222, 222) }); - regions.Add(new MemoryRegionInfo() { Name = "Work RAM", Size = 0x2000, Color = Color.FromArgb(0xCD, 0xDC, 0xFA) }); - for(int i = 0; i < 0x8000 / state.PrgPageSize; i++) { + Action addEmpty = (int size) => { regions.Add(new MemoryRegionInfo() { Name = "N/A", Size = size, Color = Color.FromArgb(222, 222, 222) }); }; + Action addWorkRam = () => { regions.Add(new MemoryRegionInfo() { Name = "Work RAM", Size = state.WorkRamEnd - state.WorkRamStart, Color = Color.FromArgb(0xCD, 0xDC, 0xFA) }); }; + Action addSaveRam = () => { regions.Add(new MemoryRegionInfo() { Name = "Save RAM", Size = state.SaveRamEnd - state.SaveRamStart, Color = Color.FromArgb(0xFA, 0xDC, 0xCD) }); }; + + if(state.SaveRamStart > 0 && state.WorkRamStart > 0) { + if(state.SaveRamStart > state.WorkRamStart) { + addEmpty(state.WorkRamStart - 0x4020); + addWorkRam(); + addEmpty(state.SaveRamStart - state.WorkRamEnd); + addSaveRam(); + } else { + addEmpty(state.SaveRamStart - 0x4020); + addSaveRam(); + addEmpty(state.WorkRamStart - state.SaveRamEnd); + addWorkRam(); + } + } else if(state.WorkRamStart > 0) { + addEmpty(state.WorkRamStart - 0x4020); + addWorkRam(); + } else if(state.SaveRamStart > 0) { + addEmpty(state.WorkRamStart - 0x4020); + addSaveRam(); + } + + int currentAddress = regions.Sum((MemoryRegionInfo region) => region.Size); + if(currentAddress < 0x8000) { + addEmpty(0x8000 - currentAddress); + currentAddress = 0x8000; + } + + for(int i = (currentAddress - 0x8000) / (int)state.PrgPageSize; i < 0x8000 / state.PrgPageSize; i++) { string text = state.PrgSelectedPages[i] == 0xEEEEEEEE ? "N/A" : ("$" + state.PrgSelectedPages[i].ToString("X2")); regions.Add(new MemoryRegionInfo() { Name = text, Size = (int)state.PrgPageSize, Color = i % 2 == 0 ? Color.FromArgb(0xC4, 0xE7, 0xD4) : Color.FromArgb(0xA4, 0xD7, 0xB4) }); } diff --git a/GUI.NET/InteropEmu.cs b/GUI.NET/InteropEmu.cs index bff8a397..ce831701 100644 --- a/GUI.NET/InteropEmu.cs +++ b/GUI.NET/InteropEmu.cs @@ -1075,6 +1075,11 @@ namespace Mesen.GUI [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public UInt32[] Nametables; + + public Int32 WorkRamStart; + public Int32 WorkRamEnd; + public Int32 SaveRamStart; + public Int32 SaveRamEnd; } public struct PPUDebugState