From 7267e28e212b1573ebe7e47af5ef254277cf7328 Mon Sep 17 00:00:00 2001 From: Sour Date: Sun, 30 Mar 2025 23:25:28 +0900 Subject: [PATCH] Debugger: GBA - Added option to configure whether unidentified code/data is disassembled as arm/thumb --- Core/Debugger/Disassembler.cpp | 3 ++- Core/GBA/Debugger/GbaDebugger.cpp | 7 ++++- Core/Shared/SettingTypes.h | 8 ++++++ UI/Config/Debugger/DebugConfig.cs | 2 ++ UI/Config/Debugger/GbaDebuggerConfig.cs | 30 +++++++++++---------- UI/Debugger/Views/DebuggerOptionsView.axaml | 30 +++++++++++++++++++-- UI/Localization/resources.en.xml | 9 ++++++- 7 files changed, 70 insertions(+), 19 deletions(-) diff --git a/Core/Debugger/Disassembler.cpp b/Core/Debugger/Disassembler.cpp index a65af64b..a7c2e45d 100644 --- a/Core/Debugger/Disassembler.cpp +++ b/Core/Debugger/Disassembler.cpp @@ -9,6 +9,7 @@ #include "Debugger/CodeDataLogger.h" #include "Debugger/DebugBreakHelper.h" #include "Debugger/DebugUtilities.h" +#include "Debugger/IDebugger.h" #include "SNES/SnesCpuTypes.h" #include "SNES/SpcTypes.h" #include "SNES/Coprocessors/GSU/GsuTypes.h" @@ -571,7 +572,7 @@ void Disassembler::GetLineData(DisassemblyResult& row, CpuType type, MemoryType CodeDataLogger* cdl = cdlManager->GetCodeDataLogger(row.Address.Type); if(!disInfo.IsInitialized()) { - disInfo = DisassemblyInfo(row.Address.Address, state.CPSR.ToInt32(), CpuType::Gba, row.Address.Type, _memoryDumper); + disInfo = DisassemblyInfo(row.Address.Address, _debugger->GetMainDebugger()->GetCpuFlags(), CpuType::Gba, row.Address.Type, _memoryDumper); } else { data.Flags |= (!cdl || cdl->IsCode(data.AbsoluteAddress.Address)) ? LineFlags::VerifiedCode : LineFlags::UnexecutedCode; } diff --git a/Core/GBA/Debugger/GbaDebugger.cpp b/Core/GBA/Debugger/GbaDebugger.cpp index 674659eb..92c1ec85 100644 --- a/Core/GBA/Debugger/GbaDebugger.cpp +++ b/Core/GBA/Debugger/GbaDebugger.cpp @@ -366,7 +366,12 @@ void GbaDebugger::ResetPrevOpCode() uint8_t GbaDebugger::GetCpuFlags() { - return _cpu->GetState().CPSR.Thumb ? GbaCdlFlags::Thumb : 0; + switch(_settings->GetDebugConfig().GbaDisMode) { + case GbaDisassemblyMode::Default: return _cpu->GetState().CPSR.Thumb ? GbaCdlFlags::Thumb : 0; + case GbaDisassemblyMode::Arm: return 0; + case GbaDisassemblyMode::Thumb: return GbaCdlFlags::Thumb; + } + return 0; } BaseEventManager* GbaDebugger::GetEventManager() diff --git a/Core/Shared/SettingTypes.h b/Core/Shared/SettingTypes.h index fd18c57c..9d4ac615 100644 --- a/Core/Shared/SettingTypes.h +++ b/Core/Shared/SettingTypes.h @@ -775,6 +775,13 @@ struct AudioPlayerConfig bool Shuffle = false; }; +enum class GbaDisassemblyMode : uint8_t +{ + Default, + Arm, + Thumb +}; + struct DebugConfig { bool BreakOnUninitRead = false; @@ -836,6 +843,7 @@ struct DebugConfig bool GbaBreakOnNopLoad = false; bool GbaBreakOnInvalidOpCode = false; bool GbaBreakOnUnalignedMemAccess = false; + GbaDisassemblyMode GbaDisMode; bool WsBreakOnInvalidOpCode = false; diff --git a/UI/Config/Debugger/DebugConfig.cs b/UI/Config/Debugger/DebugConfig.cs index 9e4e0f5d..13bdc9c2 100644 --- a/UI/Config/Debugger/DebugConfig.cs +++ b/UI/Config/Debugger/DebugConfig.cs @@ -97,6 +97,7 @@ namespace Mesen.Config GbaBreakOnInvalidOpCode = Debugger.Gba.BreakOnInvalidOpCode, GbaBreakOnNopLoad = Debugger.Gba.BreakOnNopLoad, GbaBreakOnUnalignedMemAccess = Debugger.Gba.BreakOnUnalignedMemAccess, + GbaDisMode = Debugger.Gba.DisassemblyMode, WsBreakOnUndefinedOpCode = Debugger.Ws.BreakOnUndefinedOpCode, @@ -168,6 +169,7 @@ namespace Mesen.Config [MarshalAs(UnmanagedType.I1)] public bool GbaBreakOnNopLoad; [MarshalAs(UnmanagedType.I1)] public bool GbaBreakOnInvalidOpCode; [MarshalAs(UnmanagedType.I1)] public bool GbaBreakOnUnalignedMemAccess; + public GbaDisassemblyMode GbaDisMode; [MarshalAs(UnmanagedType.I1)] public bool WsBreakOnUndefinedOpCode; diff --git a/UI/Config/Debugger/GbaDebuggerConfig.cs b/UI/Config/Debugger/GbaDebuggerConfig.cs index 60398b9d..40e254d1 100644 --- a/UI/Config/Debugger/GbaDebuggerConfig.cs +++ b/UI/Config/Debugger/GbaDebuggerConfig.cs @@ -1,18 +1,20 @@ -using Avalonia; -using Avalonia.Media; -using Mesen.Debugger; -using Mesen.Interop; -using ReactiveUI.Fody.Helpers; -using System.Reactive.Linq; -using System.Reactive; +using ReactiveUI.Fody.Helpers; using Mesen.ViewModels; -namespace Mesen.Config +namespace Mesen.Config; + +public class GbaDebuggerConfig : ViewModelBase { - public class GbaDebuggerConfig : ViewModelBase - { - [Reactive] public bool BreakOnInvalidOpCode { get; set; } = false; - [Reactive] public bool BreakOnNopLoad { get; set; } = false; - [Reactive] public bool BreakOnUnalignedMemAccess { get; set; } = false; - } + [Reactive] public bool BreakOnInvalidOpCode { get; set; } = false; + [Reactive] public bool BreakOnNopLoad { get; set; } = false; + [Reactive] public bool BreakOnUnalignedMemAccess { get; set; } = false; + + [Reactive] public GbaDisassemblyMode DisassemblyMode { get; set; } = GbaDisassemblyMode.Default; } + +public enum GbaDisassemblyMode : byte +{ + Default, + Arm, + Thumb +} \ No newline at end of file diff --git a/UI/Debugger/Views/DebuggerOptionsView.axaml b/UI/Debugger/Views/DebuggerOptionsView.axaml index 4467aaca..2a5e6075 100644 --- a/UI/Debugger/Views/DebuggerOptionsView.axaml +++ b/UI/Debugger/Views/DebuggerOptionsView.axaml @@ -29,7 +29,7 @@ - + + + + + + + - + diff --git a/UI/Localization/resources.en.xml b/UI/Localization/resources.en.xml index 74aaf6db..066f1c95 100644 --- a/UI/Localization/resources.en.xml +++ b/UI/Localization/resources.en.xml @@ -1343,7 +1343,9 @@ Use lower case Show jump/sub labels Use 6502-like mnemonics - + CPU mode: + Controls whether unidentified code is disassembled as ARM or Thumb. + Break on... BRK COP @@ -2555,6 +2557,11 @@ E Enabled Disabled + + Auto + ARM + Thumb + None