using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; using Mesen.Debugger; using Mesen.Interop; namespace Mesen.Config { public class DebugConfig { public DebuggerShortcutsConfig Shortcuts { get; set; } = new(); public TraceLoggerConfig TraceLogger { get; set; } = new(); public HexEditorConfig HexEditor { get; set; } = new(); public EventViewerConfig EventViewer { get; set; } = new(); public DebuggerConfig Debugger { get; set; } = new(); public TilemapViewerConfig TilemapViewer { get; set; } = new(); public TileViewerConfig TileViewer { get; set; } = new(); public PaletteViewerConfig PaletteViewer { get; set; } = new(); public TileEditorConfig TileEditor { get; set; } = new(); public RegisterViewerConfig RegisterViewer { get; set; } = new(); public SpriteViewerConfig SpriteViewer { get; set; } = new(); public IntegrationConfig Integration { get; set; } = new(); public ScriptWindowConfig ScriptWindow { get; set; } = new(); public ProfilerConfig Profiler { get; set; } = new(); public MemorySearchConfig MemorySearch { get; set; } = new(); public WatchWindowConfig WatchWindow { get; set; } = new(); public AssemblerConfig Assembler { get; set; } = new(); public DebugLogConfig DebugLog { get; set; } = new(); public DebuggerFontConfig Fonts { get; set; } = new(); public DebugConfig() { } public void ApplyConfig() { ConfigApi.SetDebugConfig(new InteropDebugConfig() { BreakOnUninitRead = Debugger.BreakOnUninitRead, ShowJumpLabels = Debugger.ShowJumpLabels, DrawPartialFrame = Debugger.DrawPartialFrame, ShowVerifiedData = Debugger.VerifiedDataDisplay == CodeDisplayMode.Show, DisassembleVerifiedData = Debugger.VerifiedDataDisplay == CodeDisplayMode.Disassemble, ShowUnidentifiedData = Debugger.UnidentifiedBlockDisplay == CodeDisplayMode.Show, DisassembleUnidentifiedData = Debugger.UnidentifiedBlockDisplay == CodeDisplayMode.Disassemble, UseLowerCaseDisassembly = Debugger.UseLowerCaseDisassembly, ShowMemoryValues = Debugger.ShowMemoryValues, AutoResetCdl = Debugger.AutoResetCdl, UsePredictiveBreakpoints = Debugger.UsePredictiveBreakpoints, SingleBreakpointPerInstruction = Debugger.SingleBreakpointPerInstruction, SnesBreakOnBrk = Debugger.Snes.BreakOnBrk, SnesBreakOnCop = Debugger.Snes.BreakOnCop, SnesBreakOnWdm = Debugger.Snes.BreakOnWdm, SnesBreakOnStp = Debugger.Snes.BreakOnStp, SnesBreakOnInvalidPpuAccess = Debugger.Snes.BreakOnInvalidPpuAccess, SnesBreakOnReadDuringAutoJoy = Debugger.Snes.BreakOnReadDuringAutoJoy, SnesUseAltSpcOpNames = Debugger.Snes.UseAltSpcOpNames, SnesIgnoreDspReadWrites = Debugger.Snes.IgnoreDspReadWrites, SpcBreakOnBrk = Debugger.Snes.SpcBreakOnBrk, SpcBreakOnStpSleep = Debugger.Snes.SpcBreakOnStpSleep, GbBreakOnInvalidOamAccess = Debugger.Gameboy.GbBreakOnInvalidOamAccess, GbBreakOnInvalidVramAccess = Debugger.Gameboy.GbBreakOnInvalidVramAccess, GbBreakOnDisableLcdOutsideVblank = Debugger.Gameboy.GbBreakOnDisableLcdOutsideVblank, GbBreakOnInvalidOpCode = Debugger.Gameboy.GbBreakOnInvalidOpCode, GbBreakOnNopLoad = Debugger.Gameboy.GbBreakOnNopLoad, GbBreakOnOamCorruption = Debugger.Gameboy.GbBreakOnOamCorruption, NesBreakOnBrk = Debugger.Nes.BreakOnBrk, NesBreakOnUnofficialOpCode = Debugger.Nes.BreakOnUnofficialOpCode, NesBreakOnUnstableOpCode = Debugger.Nes.BreakOnUnstableOpCode, NesBreakOnCpuCrash = Debugger.Nes.BreakOnCpuCrash, NesBreakOnBusConflict = Debugger.Nes.BreakOnBusConflict, NesBreakOnDecayedOamRead = Debugger.Nes.BreakOnDecayedOamRead, NesBreakOnPpuScrollGlitch = Debugger.Nes.BreakOnPpuScrollGlitch, NesBreakOnExtOutputMode = Debugger.Nes.BreakOnExtOutputMode, NesBreakOnInvalidVramAccess = Debugger.Nes.BreakOnInvalidVramAccess, NesBreakOnInvalidOamWrite = Debugger.Nes.BreakOnInvalidOamWrite, NesBreakOnDmaInputRead = Debugger.Nes.BreakOnDmaInputRead, PceBreakOnBrk = Debugger.Pce.BreakOnBrk, PceBreakOnUnofficialOpCode = Debugger.Pce.BreakOnUnofficialOpCode, PceBreakOnInvalidVramAddress = Debugger.Pce.BreakOnInvalidVramAddress, SmsBreakOnNopLoad = Debugger.Sms.BreakOnNopLoad, GbaBreakOnInvalidOpCode = Debugger.Gba.BreakOnInvalidOpCode, GbaBreakOnNopLoad = Debugger.Gba.BreakOnNopLoad, GbaBreakOnUnalignedMemAccess = Debugger.Gba.BreakOnUnalignedMemAccess, GbaDisMode = Debugger.Gba.DisassemblyMode, WsBreakOnUndefinedOpCode = Debugger.Ws.BreakOnUndefinedOpCode, ScriptAllowIoOsAccess = ScriptWindow.AllowIoOsAccess, ScriptAllowNetworkAccess = ScriptWindow.AllowNetworkAccess, ScriptTimeout = ScriptWindow.ScriptTimeout }); } } public struct InteropDebugConfig { [MarshalAs(UnmanagedType.I1)] public bool BreakOnUninitRead; [MarshalAs(UnmanagedType.I1)] public bool ShowJumpLabels; [MarshalAs(UnmanagedType.I1)] public bool DrawPartialFrame; [MarshalAs(UnmanagedType.I1)] public bool ShowVerifiedData; [MarshalAs(UnmanagedType.I1)] public bool DisassembleVerifiedData; [MarshalAs(UnmanagedType.I1)] public bool ShowUnidentifiedData; [MarshalAs(UnmanagedType.I1)] public bool DisassembleUnidentifiedData; [MarshalAs(UnmanagedType.I1)] public bool UseLowerCaseDisassembly; [MarshalAs(UnmanagedType.I1)] public bool ShowMemoryValues; [MarshalAs(UnmanagedType.I1)] public bool AutoResetCdl; [MarshalAs(UnmanagedType.I1)] public bool UsePredictiveBreakpoints; [MarshalAs(UnmanagedType.I1)] public bool SingleBreakpointPerInstruction; [MarshalAs(UnmanagedType.I1)] public bool SnesBreakOnBrk; [MarshalAs(UnmanagedType.I1)] public bool SnesBreakOnCop; [MarshalAs(UnmanagedType.I1)] public bool SnesBreakOnWdm; [MarshalAs(UnmanagedType.I1)] public bool SnesBreakOnStp; [MarshalAs(UnmanagedType.I1)] public bool SnesBreakOnInvalidPpuAccess; [MarshalAs(UnmanagedType.I1)] public bool SnesBreakOnReadDuringAutoJoy; [MarshalAs(UnmanagedType.I1)] public bool SnesUseAltSpcOpNames; [MarshalAs(UnmanagedType.I1)] public bool SnesIgnoreDspReadWrites; [MarshalAs(UnmanagedType.I1)] public bool SpcBreakOnBrk; [MarshalAs(UnmanagedType.I1)] public bool SpcBreakOnStpSleep; [MarshalAs(UnmanagedType.I1)] public bool GbBreakOnInvalidOamAccess; [MarshalAs(UnmanagedType.I1)] public bool GbBreakOnInvalidVramAccess; [MarshalAs(UnmanagedType.I1)] public bool GbBreakOnDisableLcdOutsideVblank; [MarshalAs(UnmanagedType.I1)] public bool GbBreakOnInvalidOpCode; [MarshalAs(UnmanagedType.I1)] public bool GbBreakOnNopLoad; [MarshalAs(UnmanagedType.I1)] public bool GbBreakOnOamCorruption; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnBrk; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnUnofficialOpCode; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnUnstableOpCode; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnCpuCrash; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnBusConflict; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnDecayedOamRead; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnPpuScrollGlitch; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnExtOutputMode; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnInvalidVramAccess; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnInvalidOamWrite; [MarshalAs(UnmanagedType.I1)] public bool NesBreakOnDmaInputRead; [MarshalAs(UnmanagedType.I1)] public bool PceBreakOnBrk; [MarshalAs(UnmanagedType.I1)] public bool PceBreakOnUnofficialOpCode; [MarshalAs(UnmanagedType.I1)] public bool PceBreakOnInvalidVramAddress; [MarshalAs(UnmanagedType.I1)] public bool SmsBreakOnNopLoad; [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; [MarshalAs(UnmanagedType.I1)] public bool ScriptAllowIoOsAccess; [MarshalAs(UnmanagedType.I1)] public bool ScriptAllowNetworkAccess; public UInt32 ScriptTimeout; } public enum RefreshSpeed { Off = 0, Low = 1, Normal = 2, High = 3 } }