Debugger: GBA - Added option to configure whether unidentified code/data is disassembled as arm/thumb

This commit is contained in:
Sour 2025-03-30 23:25:28 +09:00
parent 02180abed1
commit 7267e28e21
7 changed files with 70 additions and 19 deletions

View file

@ -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;
}

View file

@ -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()

View file

@ -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;

View file

@ -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;

View file

@ -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
}

View file

@ -29,7 +29,7 @@
<StackPanel Margin="3 0">
<c:OptionSection Header="{l:Translate lblDisassemblyOptions}" Margin="0">
<Grid ColumnDefinitions="Auto,Auto,*" RowDefinitions="Auto,Auto,Auto">
<Grid ColumnDefinitions="Auto,Auto,*" RowDefinitions="Auto,Auto,Auto,Auto">
<TextBlock VerticalAlignment="Center" Text="{l:Translate lblVerifiedData}" />
<c:EnumComboBox
Grid.Column="1"
@ -43,8 +43,34 @@
Width="105"
SelectedItem="{Binding Config.UnidentifiedBlockDisplay}"
/>
<TextBlock
IsVisible="{Binding IsGba}"
Grid.Row="2"
VerticalAlignment="Center"
Text="{l:Translate lblDisassemblyMode}"
/>
<DockPanel Grid.Row="2" Grid.Column="1" IsVisible="{Binding IsGba}">
<Image
Source="/Assets/Help.png"
Stretch="None"
Margin="4 4"
DockPanel.Dock="Right"
VerticalAlignment="Top"
HorizontalAlignment="Right"
ToolTip.Tip="{l:Translate lblDisassemblyModeHint}"
ToolTip.ShowDelay="0"
ToolTip.HorizontalOffset="10"
ToolTip.Placement="Bottom"
/>
<c:EnumComboBox
Grid.Row="2"
Grid.Column="1"
SelectedItem="{Binding Config.Gba.DisassemblyMode}"
/>
</DockPanel>
<DockPanel Grid.Row="2" Grid.ColumnSpan="2">
<DockPanel Grid.Row="3" Grid.ColumnSpan="2">
<TextBlock VerticalAlignment="Center" Text="{l:Translate lblAddressDisplay}" />
<c:EnumComboBox SelectedItem="{Binding Config.AddressDisplayType}" />
</DockPanel>

View file

@ -1343,7 +1343,9 @@
<Control ID="chkUseLowerCaseDisassembly">Use lower case</Control>
<Control ID="chkShowJumpLabels">Show jump/sub labels</Control>
<Control ID="chkSnesUseAltSpcOpNames">Use 6502-like mnemonics</Control>
<Control ID="lblDisassemblyMode">CPU mode:</Control>
<Control ID="lblDisassemblyModeHint">Controls whether unidentified code is disassembled as ARM or Thumb.</Control>
<Control ID="lblBreakOptions">Break on...</Control>
<Control ID="chkBreakOnBrk">BRK</Control>
<Control ID="chkBreakOnCop">COP</Control>
@ -2555,6 +2557,11 @@ E
<Value ID="Enabled">Enabled</Value>
<Value ID="Disabled">Disabled</Value>
</Enum>
<Enum ID="GbaDisassemblyMode">
<Value ID="Default">Auto</Value>
<Value ID="Arm">ARM</Value>
<Value ID="Thumb">Thumb</Value>
</Enum>
<Enum ID="MemorySizes">
<Value ID="None">None</Value>