diff --git a/Core/Debugger/Debugger.cpp b/Core/Debugger/Debugger.cpp index fcc70f26..1ff25ea6 100644 --- a/Core/Debugger/Debugger.cpp +++ b/Core/Debugger/Debugger.cpp @@ -152,6 +152,11 @@ DebuggerType* Debugger::GetDebugger() return (DebuggerType*)_debuggers[(int)type].Debugger.get(); } +IDebugger* Debugger::GetMainDebugger() +{ + return _debuggers[(int)_mainCpuType].Debugger.get(); +} + template uint64_t Debugger::GetCpuCycleCount() { diff --git a/Core/Debugger/Debugger.h b/Core/Debugger/Debugger.h index d72865e6..53f060f6 100644 --- a/Core/Debugger/Debugger.h +++ b/Core/Debugger/Debugger.h @@ -178,6 +178,7 @@ public: uint32_t GetExecutionTrace(TraceRow output[], uint32_t startOffset, uint32_t maxLineCount); CpuType GetMainCpuType() { return _mainCpuType; } + IDebugger* GetMainDebugger(); TraceLogFileSaver* GetTraceLogFileSaver() { return _traceLogSaver.get(); } MemoryDumper* GetMemoryDumper() { return _memoryDumper.get(); } diff --git a/Core/Debugger/IDebugger.h b/Core/Debugger/IDebugger.h index 554eddec..de72191f 100644 --- a/Core/Debugger/IDebugger.h +++ b/Core/Debugger/IDebugger.h @@ -72,6 +72,8 @@ public: virtual ITraceLogger* GetTraceLogger() = 0; virtual PpuTools* GetPpuTools() { return nullptr; } + virtual void GetRomHeader(uint8_t* headerData, uint32_t& size) {} + virtual BaseState& GetState() = 0; virtual void GetPpuState(BaseState& state) {}; virtual void SetPpuState(BaseState& state) {}; diff --git a/Core/GBA/Cart/GbaRtc.cpp b/Core/GBA/Cart/GbaRtc.cpp index 6e450ff5..d3bbb673 100644 --- a/Core/GBA/Cart/GbaRtc.cpp +++ b/Core/GBA/Cart/GbaRtc.cpp @@ -61,6 +61,7 @@ uint64_t GbaRtc::ToDateTime() uint8_t GbaRtc::GetCommandLength(Command cmd) { switch(cmd) { + default: case Command::Reset: return 0; case Command::Status: return 8; case Command::DateTime: return 8 * 7; diff --git a/Core/NES/Debugger/NesDebugger.cpp b/Core/NES/Debugger/NesDebugger.cpp index f1efd60d..c09049a0 100644 --- a/Core/NES/Debugger/NesDebugger.cpp +++ b/Core/NES/Debugger/NesDebugger.cpp @@ -502,6 +502,17 @@ bool NesDebugger::SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption return false; } +void NesDebugger::GetRomHeader(uint8_t* headerData, uint32_t& size) +{ + if(size < sizeof(NesHeader) || _console->GetRomFormat() != RomFormat::iNes) { + size = 0; + return; + } + + NesHeader header = _mapper->GetRomInfo().Header; + memcpy(headerData, &header, sizeof(NesHeader)); +} + void NesDebugger::ProcessInputOverrides(DebugControllerState inputOverrides[8]) { BaseControlManager* controlManager = _console->GetControlManager(); diff --git a/Core/NES/Debugger/NesDebugger.h b/Core/NES/Debugger/NesDebugger.h index e82f7be8..fbaa2e10 100644 --- a/Core/NES/Debugger/NesDebugger.h +++ b/Core/NES/Debugger/NesDebugger.h @@ -91,6 +91,7 @@ public: ITraceLogger* GetTraceLogger() override; PpuTools* GetPpuTools() override; bool SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption); + void GetRomHeader(uint8_t* headerData, uint32_t& size) override; CallstackManager* GetCallstackManager() override; IAssembler* GetAssembler() override; BaseEventManager* GetEventManager() override; diff --git a/InteropDLL/DebugApiWrapper.cpp b/InteropDLL/DebugApiWrapper.cpp index 3f0a1c8e..c9040350 100644 --- a/InteropDLL/DebugApiWrapper.cpp +++ b/InteropDLL/DebugApiWrapper.cpp @@ -2,6 +2,7 @@ #include "Core/Shared/Emulator.h" #include "Core/Shared/DebuggerRequest.h" #include "Core/Debugger/Debugger.h" +#include "Core/Debugger/IDebugger.h" #include "Core/Debugger/MemoryDumper.h" #include "Core/Debugger/MemoryAccessCounter.h" #include "Core/Debugger/CdlManager.h" @@ -191,5 +192,6 @@ extern "C" DllExport uint32_t __stdcall AssembleCode(CpuType cpuType, char* code, uint32_t startAddress, int16_t* assembledOutput) { return WithTool(uint32_t, GetAssembler(cpuType), AssembleCode(code, startAddress, assembledOutput)); } + DllExport void __stdcall GetRomHeader(uint8_t* headerData, uint32_t& size) { WithToolVoid(GetMainDebugger(), GetRomHeader(headerData, size)); } DllExport bool __stdcall SaveRomToDisk(char* filename, bool saveIpsFile, CdlStripOption cdlStripOption) { return WithDebugger(bool, SaveRomToDisk(filename, saveIpsFile, cdlStripOption)); } }; \ No newline at end of file diff --git a/UI/Debugger/ViewModels/NesHeaderEditViewModel.cs b/UI/Debugger/ViewModels/NesHeaderEditViewModel.cs index f2cfee94..e5f270e5 100644 --- a/UI/Debugger/ViewModels/NesHeaderEditViewModel.cs +++ b/UI/Debugger/ViewModels/NesHeaderEditViewModel.cs @@ -32,18 +32,12 @@ public class NesHeaderEditViewModel : DisposableViewModel public NesHeaderEditViewModel() { - byte[] headerBytes = new byte[16]; - _romInfo = EmuApi.GetRomInfo(); - string romPath = _romInfo.RomPath; - try { - //TODOv2, get header from core (to support for patches, etc.) - using(FileStream? fileStream = FileHelper.OpenRead(romPath)) { - if(fileStream != null) { - fileStream.Read(headerBytes, 0, 16); - } - } - } catch { } + byte[] headerBytes = DebugApi.GetRomHeader(); + if(headerBytes.Length < 16) { + Array.Resize(ref headerBytes, 16); + } + _romInfo = EmuApi.GetRomInfo(); Header = NesHeader.FromBytes(headerBytes); AddDisposable(this.WhenAnyValue(x => x.Header.SaveRam, x => x.Header.ChrRamBattery).Subscribe(x => { diff --git a/UI/Interop/DebugApi.cs b/UI/Interop/DebugApi.cs index 54850836..e8cb5eb6 100644 --- a/UI/Interop/DebugApi.cs +++ b/UI/Interop/DebugApi.cs @@ -253,6 +253,16 @@ namespace Mesen.Interop return indexes; } + [DllImport(DllPath, EntryPoint = "GetRomHeader")] private static extern void GetRomHeaderWrapper([In, Out] byte[] headerData, ref UInt32 size); + public static byte[] GetRomHeader() + { + UInt32 size = 0x1000; + byte[] headerData = new byte[size]; + DebugApi.GetRomHeaderWrapper(headerData, ref size); + Array.Resize(ref headerData, (Int32)size); + return headerData; + } + [DllImport(DllPath)][return: MarshalAs(UnmanagedType.I1)] public static extern bool SaveRomToDisk([MarshalAs(UnmanagedType.LPUTF8Str)] string filename, [MarshalAs(UnmanagedType.I1)] bool saveAsIps, CdlStripOption cdlStripOption); [DllImport(DllPath, EntryPoint = "GetMemoryValues")] private static extern void GetMemoryValuesWrapper(MemoryType type, UInt32 start, UInt32 end, [In, Out] byte[] buffer);