Mesen-SX/UI/Debugger/Workspace/DebugWorkspaceManager.cs

163 lines
5.6 KiB
C#
Raw Normal View History

using Mesen.GUI.Config;
using Mesen.GUI.Debugger.Integration;
using Mesen.GUI.Debugger.Labels;
using Mesen.GUI.Forms;
using System;
2019-03-28 21:20:18 -04:00
using System.Collections.Generic;
using System.IO;
2019-03-28 21:20:18 -04:00
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mesen.GUI.Debugger.Workspace
{
public class DebugWorkspaceManager
{
public delegate void SymbolProviderChangedHandler(ISymbolProvider symbolProvider);
2019-05-04 09:33:28 -04:00
public static event SymbolProviderChangedHandler SymbolProviderChanged;
2019-03-28 21:20:18 -04:00
private static DebugWorkspace _workspace;
private static ISymbolProvider _symbolProvider;
2019-03-28 21:20:18 -04:00
private static string _romName;
private static object _lock = new object();
public static void SaveWorkspace()
{
if(_workspace != null) {
_workspace.WatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Cpu).WatchEntries);
_workspace.SpcWatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Spc).WatchEntries);
_workspace.Sa1WatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Sa1).WatchEntries);
2019-07-30 22:34:52 -04:00
_workspace.GsuWatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Gsu).WatchEntries);
2020-02-23 21:50:55 -05:00
_workspace.NecDspWatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.NecDsp).WatchEntries);
2019-03-28 21:20:18 -04:00
_workspace.Breakpoints = new List<Breakpoint>(BreakpointManager.Breakpoints);
_workspace.CpuLabels = new List<CodeLabel>(LabelManager.GetLabels(CpuType.Cpu));
_workspace.SpcLabels = new List<CodeLabel>(LabelManager.GetLabels(CpuType.Spc));
2020-02-23 21:50:55 -05:00
_workspace.NecDspLabels = new List<CodeLabel>(LabelManager.GetLabels(CpuType.NecDsp));
2019-03-28 21:20:18 -04:00
_workspace.Save();
}
}
public static void Clear()
{
_workspace = null;
_romName = null;
LabelManager.ResetLabels();
2019-03-28 21:20:18 -04:00
}
public static void ResetWorkspace()
{
if(_workspace != null) {
_workspace.Breakpoints = new List<Breakpoint>();
_workspace.WatchValues = new List<string>();
_workspace.SpcWatchValues = new List<string>();
_workspace.Sa1WatchValues = new List<string>();
2019-07-30 22:34:52 -04:00
_workspace.GsuWatchValues = new List<string>();
2020-02-23 21:50:55 -05:00
_workspace.NecDspWatchValues = new List<string>();
_workspace.CpuLabels = new List<CodeLabel>();
_workspace.SpcLabels = new List<CodeLabel>();
2020-02-23 21:50:55 -05:00
_workspace.NecDspLabels = new List<CodeLabel>();
WatchManager.GetWatchManager(CpuType.Cpu).WatchEntries = _workspace.WatchValues;
WatchManager.GetWatchManager(CpuType.Spc).WatchEntries = _workspace.SpcWatchValues;
WatchManager.GetWatchManager(CpuType.Sa1).WatchEntries = _workspace.Sa1WatchValues;
2019-07-30 22:34:52 -04:00
WatchManager.GetWatchManager(CpuType.Gsu).WatchEntries = _workspace.GsuWatchValues;
2020-02-23 21:50:55 -05:00
WatchManager.GetWatchManager(CpuType.NecDsp).WatchEntries = _workspace.NecDspWatchValues;
2019-03-28 21:20:18 -04:00
BreakpointManager.SetBreakpoints(_workspace.Breakpoints);
LabelManager.SetDefaultLabels();
LabelManager.RefreshLabels();
2019-03-28 21:20:18 -04:00
_workspace.Save();
Clear();
}
}
public static void ResetLabels()
{
if(_workspace != null) {
_workspace.CpuLabels = new List<CodeLabel>();
_workspace.SpcLabels = new List<CodeLabel>();
2020-02-23 21:50:55 -05:00
_workspace.NecDspLabels = new List<CodeLabel>();
LabelManager.ResetLabels();
LabelManager.SetDefaultLabels();
LabelManager.RefreshLabels();
}
}
2019-03-28 21:20:18 -04:00
public static DebugWorkspace GetWorkspace()
{
string romName = EmuApi.GetRomInfo().GetRomName();
if(_workspace != null) {
SaveWorkspace();
}
2019-03-28 21:20:18 -04:00
if(_workspace == null || _romName != romName) {
_romName = romName;
_workspace = DebugWorkspace.GetWorkspace();
//Load watch entries
WatchManager.GetWatchManager(CpuType.Cpu).WatchEntries = _workspace.WatchValues;
WatchManager.GetWatchManager(CpuType.Spc).WatchEntries = _workspace.SpcWatchValues;
WatchManager.GetWatchManager(CpuType.Sa1).WatchEntries = _workspace.Sa1WatchValues;
2019-07-30 22:34:52 -04:00
WatchManager.GetWatchManager(CpuType.Gsu).WatchEntries = _workspace.GsuWatchValues;
2020-02-23 21:50:55 -05:00
WatchManager.GetWatchManager(CpuType.NecDsp).WatchEntries = _workspace.NecDspWatchValues;
LabelManager.ResetLabels();
LabelManager.SetLabels(_workspace.CpuLabels);
LabelManager.SetLabels(_workspace.SpcLabels);
2020-02-23 21:50:55 -05:00
LabelManager.SetLabels(_workspace.NecDspLabels);
LabelManager.SetDefaultLabels();
ImportDbgFile();
2019-03-28 21:20:18 -04:00
}
//Send breakpoints & labels to emulation core (even if the same game is running)
LabelManager.RefreshLabels();
BreakpointManager.SetBreakpoints(_workspace.Breakpoints);
2019-03-28 21:20:18 -04:00
return _workspace;
}
2020-02-22 18:52:10 -05:00
public static void ImportMslFile(string mslPath, bool silent = false)
{
if(ConfigManager.Config.Debug.DbgIntegration.ResetLabelsOnImport) {
ResetLabels();
}
MslLabelFile.Import(mslPath, silent);
LabelManager.RefreshLabels();
}
public static void ImportSymFile(string symPath, bool silent = false)
{
if(ConfigManager.Config.Debug.DbgIntegration.ResetLabelsOnImport) {
ResetLabels();
}
new WlaDxImporter().Import(symPath, silent);
LabelManager.RefreshLabels();
}
2020-02-22 18:52:10 -05:00
public static void ImportDbgFile(string dbgPath = null)
{
2019-05-04 09:33:28 -04:00
_symbolProvider = null;
2020-02-22 18:52:10 -05:00
if(dbgPath != null || ConfigManager.Config.Debug.DbgIntegration.AutoImport) {
bool silent = dbgPath == null;
if(dbgPath == null) {
RomInfo romInfo = EmuApi.GetRomInfo();
dbgPath = Path.Combine(((ResourcePath)romInfo.RomPath).Folder, romInfo.GetRomName() + ".dbg");
}
2019-05-04 09:33:28 -04:00
if(File.Exists(dbgPath)) {
_symbolProvider = new DbgImporter();
2020-02-22 18:52:10 -05:00
(_symbolProvider as DbgImporter).Import(dbgPath, silent);
2019-05-04 09:33:28 -04:00
SymbolProviderChanged?.Invoke(_symbolProvider);
LabelManager.RefreshLabels();
}
}
2019-05-04 09:33:28 -04:00
SymbolProviderChanged?.Invoke(_symbolProvider);
}
public static ISymbolProvider GetSymbolProvider()
2019-05-04 09:33:28 -04:00
{
return _symbolProvider;
}
2019-03-28 21:20:18 -04:00
}
}