2015-08-02 19:27:02 -04:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Drawing;
|
2016-09-05 09:05:34 -04:00
|
|
|
|
using System.IO;
|
2015-08-02 19:27:02 -04:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
2016-06-04 14:43:13 -04:00
|
|
|
|
using Mesen.GUI.Config;
|
2015-08-02 19:27:02 -04:00
|
|
|
|
using Mesen.GUI.Forms;
|
2016-12-18 12:43:20 -05:00
|
|
|
|
using Mesen.GUI.Controls;
|
2017-02-26 18:58:48 -05:00
|
|
|
|
using Be.Windows.Forms;
|
2017-03-02 20:33:25 -05:00
|
|
|
|
using Mesen.GUI.Debugger.Controls;
|
2015-08-02 19:27:02 -04:00
|
|
|
|
|
|
|
|
|
namespace Mesen.GUI.Debugger
|
|
|
|
|
{
|
|
|
|
|
public partial class frmMemoryViewer : BaseForm
|
|
|
|
|
{
|
2015-08-05 20:40:10 -04:00
|
|
|
|
private InteropEmu.NotificationListener _notifListener;
|
2016-09-05 09:05:34 -04:00
|
|
|
|
private DebugMemoryType _memoryType = DebugMemoryType.CpuMemory;
|
2017-08-14 23:44:01 -04:00
|
|
|
|
private DebugWorkspace _previousWorkspace;
|
2018-01-14 14:03:43 -05:00
|
|
|
|
private bool _updating = false;
|
|
|
|
|
private DateTime _lastUpdate = DateTime.MinValue;
|
2018-02-20 18:20:52 -05:00
|
|
|
|
private TabPage _selectedTab;
|
2015-08-05 20:40:10 -04:00
|
|
|
|
|
2017-08-14 23:44:01 -04:00
|
|
|
|
public frmMemoryViewer()
|
2015-08-02 19:27:02 -04:00
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2018-02-20 18:20:52 -05:00
|
|
|
|
|
|
|
|
|
this._selectedTab = this.tabMain.SelectedTab;
|
2018-03-10 09:58:24 -05:00
|
|
|
|
this.InitShortcuts();
|
2015-08-09 18:24:24 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnLoad(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnLoad(e);
|
2015-08-05 20:40:10 -04:00
|
|
|
|
|
2018-03-03 10:41:59 -05:00
|
|
|
|
DebugInfo config = ConfigManager.Config.DebugInfo;
|
|
|
|
|
|
|
|
|
|
this.mnuAutoRefresh.Checked = config.RamAutoRefresh;
|
|
|
|
|
this.mnuHighDensityMode.Checked = config.RamHighDensityTextMode;
|
2018-03-10 13:41:01 -05:00
|
|
|
|
this.mnuByteEditingMode.Checked = config.RamByteEditingMode;
|
2018-03-03 10:41:59 -05:00
|
|
|
|
this.mnuEnablePerByteNavigation.Checked = config.RamEnablePerByteNavigation;
|
2018-01-14 14:03:43 -05:00
|
|
|
|
UpdateRefreshSpeedMenu();
|
|
|
|
|
|
2018-03-03 10:41:59 -05:00
|
|
|
|
this.mnuIgnoreRedundantWrites.Checked = config.RamIgnoreRedundantWrites;
|
2018-01-15 22:20:51 -05:00
|
|
|
|
this.UpdateFlags();
|
|
|
|
|
|
2018-03-03 10:41:59 -05:00
|
|
|
|
this.mnuShowCharacters.Checked = config.RamShowCharacters;
|
|
|
|
|
this.mnuShowLabelInfoOnMouseOver.Checked = config.RamShowLabelInfo;
|
|
|
|
|
|
|
|
|
|
this.ctrlHexViewer.TextZoom = config.RamTextZoom;
|
|
|
|
|
this.ctrlHexViewer.BaseFont = new Font(config.RamFontFamily, config.RamFontSize, config.RamFontStyle);
|
|
|
|
|
|
|
|
|
|
this.ctrlMemoryAccessCounters.BaseFont = new Font(config.RamFontFamily, config.RamFontSize, config.RamFontStyle);
|
|
|
|
|
this.ctrlMemoryAccessCounters.TextZoom = config.RamTextZoom;
|
|
|
|
|
|
|
|
|
|
this.mnuHighlightExecution.Checked = config.RamHighlightExecution;
|
|
|
|
|
this.mnuHightlightReads.Checked = config.RamHighlightReads;
|
|
|
|
|
this.mnuHighlightWrites.Checked = config.RamHighlightWrites;
|
|
|
|
|
this.mnuHideUnusedBytes.Checked = config.RamHideUnusedBytes;
|
|
|
|
|
this.mnuHideReadBytes.Checked = config.RamHideReadBytes;
|
|
|
|
|
this.mnuHideWrittenBytes.Checked = config.RamHideWrittenBytes;
|
|
|
|
|
this.mnuHideExecutedBytes.Checked = config.RamHideExecutedBytes;
|
|
|
|
|
|
|
|
|
|
this.mnuHighlightLabelledBytes.Checked = config.RamHighlightLabelledBytes;
|
|
|
|
|
this.mnuHighlightChrDrawnBytes.Checked = config.RamHighlightChrDrawnBytes;
|
|
|
|
|
this.mnuHighlightChrReadBytes.Checked = config.RamHighlightChrReadBytes;
|
|
|
|
|
this.mnuHighlightCodeBytes.Checked = config.RamHighlightCodeBytes;
|
|
|
|
|
this.mnuHighlightDataBytes.Checked = config.RamHighlightDataBytes;
|
|
|
|
|
this.mnuHighlightDmcDataBytes.Checked = config.RamHighlightDmcDataBytes;
|
2017-12-26 17:33:46 -05:00
|
|
|
|
|
2017-03-01 20:52:15 -05:00
|
|
|
|
this.UpdateFadeOptions();
|
|
|
|
|
|
2017-02-26 21:33:05 -05:00
|
|
|
|
this.InitTblMappings();
|
2017-03-01 20:52:15 -05:00
|
|
|
|
|
2017-02-26 18:58:48 -05:00
|
|
|
|
this.ctrlHexViewer.StringViewVisible = mnuShowCharacters.Checked;
|
|
|
|
|
|
2016-09-05 09:05:34 -04:00
|
|
|
|
UpdateImportButton();
|
2018-02-10 21:23:22 -05:00
|
|
|
|
InitMemoryTypeDropdown();
|
2015-08-05 20:40:10 -04:00
|
|
|
|
|
|
|
|
|
_notifListener = new InteropEmu.NotificationListener();
|
|
|
|
|
_notifListener.OnNotification += _notifListener_OnNotification;
|
2017-02-26 18:58:48 -05:00
|
|
|
|
|
2018-01-15 22:20:51 -05:00
|
|
|
|
this.mnuShowCharacters.CheckedChanged += this.mnuShowCharacters_CheckedChanged;
|
|
|
|
|
this.mnuIgnoreRedundantWrites.CheckedChanged += mnuIgnoreRedundantWrites_CheckedChanged;
|
2017-10-06 18:26:02 -04:00
|
|
|
|
|
|
|
|
|
if(!ConfigManager.Config.DebugInfo.MemoryViewerSize.IsEmpty) {
|
|
|
|
|
this.Size = ConfigManager.Config.DebugInfo.MemoryViewerSize;
|
|
|
|
|
}
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
|
2017-08-14 23:44:01 -04:00
|
|
|
|
protected override void OnFormClosing(FormClosingEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnFormClosing(e);
|
2017-10-06 18:26:02 -04:00
|
|
|
|
UpdateConfig();
|
2018-03-03 10:41:59 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontFamily = ctrlHexViewer.BaseFont.FontFamily.Name;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontStyle = ctrlHexViewer.BaseFont.Style;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontSize = ctrlHexViewer.BaseFont.Size;
|
2017-10-05 19:59:24 -04:00
|
|
|
|
ConfigManager.Config.DebugInfo.MemoryViewerSize = this.WindowState == FormWindowState.Maximized ? this.RestoreBounds.Size : this.Size;
|
2017-10-06 18:26:02 -04:00
|
|
|
|
ConfigManager.ApplyChanges();
|
2017-08-14 23:44:01 -04:00
|
|
|
|
DebugWorkspaceManager.SaveWorkspace();
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-10 09:58:24 -05:00
|
|
|
|
private void InitShortcuts()
|
|
|
|
|
{
|
|
|
|
|
mnuIncreaseFontSize.InitShortcut(this, nameof(DebuggerShortcutsConfig.IncreaseFontSize));
|
|
|
|
|
mnuDecreaseFontSize.InitShortcut(this, nameof(DebuggerShortcutsConfig.DecreaseFontSize));
|
|
|
|
|
mnuResetFontSize.InitShortcut(this, nameof(DebuggerShortcutsConfig.ResetFontSize));
|
|
|
|
|
|
|
|
|
|
mnuImport.InitShortcut(this, nameof(DebuggerShortcutsConfig.MemoryViewer_Import));
|
|
|
|
|
mnuExport.InitShortcut(this, nameof(DebuggerShortcutsConfig.MemoryViewer_Export));
|
|
|
|
|
|
|
|
|
|
mnuRefresh.InitShortcut(this, nameof(DebuggerShortcutsConfig.Refresh));
|
|
|
|
|
|
|
|
|
|
mnuGoTo.InitShortcut(this, nameof(DebuggerShortcutsConfig.GoTo));
|
|
|
|
|
mnuFind.InitShortcut(this, nameof(DebuggerShortcutsConfig.Find));
|
|
|
|
|
mnuFindNext.InitShortcut(this, nameof(DebuggerShortcutsConfig.FindNext));
|
|
|
|
|
mnuFindPrev.InitShortcut(this, nameof(DebuggerShortcutsConfig.FindPrev));
|
|
|
|
|
}
|
|
|
|
|
|
2018-02-10 21:23:22 -05:00
|
|
|
|
private void InitMemoryTypeDropdown()
|
|
|
|
|
{
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.CpuMemory));
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.PpuMemory));
|
|
|
|
|
cboMemoryType.Items.Add("-");
|
|
|
|
|
|
|
|
|
|
if(InteropEmu.DebugGetMemorySize(DebugMemoryType.PrgRom) > 0) {
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.PrgRom));
|
|
|
|
|
}
|
|
|
|
|
if(InteropEmu.DebugGetMemorySize(DebugMemoryType.WorkRam) > 0) {
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.WorkRam));
|
|
|
|
|
}
|
|
|
|
|
if(InteropEmu.DebugGetMemorySize(DebugMemoryType.SaveRam) > 0) {
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.SaveRam));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(cboMemoryType.Items.Count > 3) {
|
|
|
|
|
cboMemoryType.Items.Add("-");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(InteropEmu.DebugGetMemorySize(DebugMemoryType.ChrRom) > 0) {
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.ChrRom));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(InteropEmu.DebugGetMemorySize(DebugMemoryType.ChrRam) > 0) {
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.ChrRam));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.SpriteMemory));
|
|
|
|
|
cboMemoryType.Items.Add(ResourceHelper.GetEnumText(DebugMemoryType.SecondarySpriteMemory));
|
|
|
|
|
|
|
|
|
|
this.cboMemoryType.SelectedIndex = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-15 22:20:51 -05:00
|
|
|
|
private void UpdateFlags()
|
|
|
|
|
{
|
|
|
|
|
if(mnuIgnoreRedundantWrites.Checked) {
|
|
|
|
|
DebugWorkspaceManager.SetFlags(DebuggerFlags.IgnoreRedundantWrites);
|
|
|
|
|
} else {
|
|
|
|
|
DebugWorkspaceManager.ClearFlags(DebuggerFlags.IgnoreRedundantWrites);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-26 15:59:58 -05:00
|
|
|
|
public void ShowAddress(int address)
|
|
|
|
|
{
|
|
|
|
|
tabMain.SelectedTab = tpgMemoryViewer;
|
2018-01-03 18:48:16 -05:00
|
|
|
|
cboMemoryType.SelectedIndex = 0; //Select CPU Memory
|
2017-12-26 15:59:58 -05:00
|
|
|
|
ctrlHexViewer.GoToAddress(address);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void InitTblMappings()
|
2017-02-26 19:52:48 -05:00
|
|
|
|
{
|
2017-08-14 23:44:01 -04:00
|
|
|
|
DebugWorkspace workspace = DebugWorkspaceManager.GetWorkspace();
|
|
|
|
|
if(workspace.TblMappings != null && workspace.TblMappings.Count > 0) {
|
|
|
|
|
var tblDict = TblLoader.ToDictionary(workspace.TblMappings.ToArray());
|
2017-02-26 21:33:05 -05:00
|
|
|
|
if(tblDict != null) {
|
|
|
|
|
this.ctrlHexViewer.ByteCharConverter = new TblByteCharConverter(tblDict);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.ctrlHexViewer.ByteCharConverter = null;
|
2017-02-26 19:52:48 -05:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-26 15:59:58 -05:00
|
|
|
|
private void _notifListener_OnNotification(InteropEmu.NotificationEventArgs e)
|
2015-08-05 20:40:10 -04:00
|
|
|
|
{
|
2018-01-15 22:20:51 -05:00
|
|
|
|
switch(e.NotificationType) {
|
|
|
|
|
case InteropEmu.ConsoleNotificationType.CodeBreak:
|
|
|
|
|
this.BeginInvoke((MethodInvoker)(() => this.RefreshData()));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case InteropEmu.ConsoleNotificationType.GameReset:
|
|
|
|
|
case InteropEmu.ConsoleNotificationType.GameLoaded:
|
|
|
|
|
this.UpdateFlags();
|
|
|
|
|
break;
|
2018-01-14 14:03:43 -05:00
|
|
|
|
|
2018-01-15 22:20:51 -05:00
|
|
|
|
case InteropEmu.ConsoleNotificationType.PpuViewerDisplayFrame:
|
|
|
|
|
int refreshDelay = 90;
|
|
|
|
|
switch(ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed) {
|
|
|
|
|
case RefreshSpeed.Low: refreshDelay= 90; break;
|
|
|
|
|
case RefreshSpeed.Normal: refreshDelay = 32; break;
|
|
|
|
|
case RefreshSpeed.High: refreshDelay = 16; break;
|
|
|
|
|
}
|
|
|
|
|
|
2018-02-20 18:20:52 -05:00
|
|
|
|
if(_selectedTab == tpgProfiler) {
|
|
|
|
|
refreshDelay *= 10;
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-15 22:20:51 -05:00
|
|
|
|
DateTime now = DateTime.Now;
|
|
|
|
|
if(!_updating && ConfigManager.Config.DebugInfo.RamAutoRefresh && (now - _lastUpdate).Milliseconds >= refreshDelay) {
|
|
|
|
|
_lastUpdate = now;
|
|
|
|
|
_updating = true;
|
|
|
|
|
this.BeginInvoke((Action)(() => {
|
|
|
|
|
this.RefreshData();
|
|
|
|
|
_updating = false;
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
break;
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
2017-03-01 20:52:15 -05:00
|
|
|
|
|
2015-08-05 20:40:10 -04:00
|
|
|
|
private void cboMemoryType_SelectedIndexChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
2018-02-10 21:23:22 -05:00
|
|
|
|
this._memoryType = this.cboMemoryType.GetEnumValue<DebugMemoryType>();
|
2016-09-05 09:05:34 -04:00
|
|
|
|
this.UpdateImportButton();
|
2015-08-05 20:40:10 -04:00
|
|
|
|
this.RefreshData();
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-01 20:52:15 -05:00
|
|
|
|
private void UpdateByteColorProvider()
|
|
|
|
|
{
|
2018-02-10 21:23:22 -05:00
|
|
|
|
switch(this._memoryType) {
|
2017-03-01 20:52:15 -05:00
|
|
|
|
case DebugMemoryType.CpuMemory:
|
|
|
|
|
case DebugMemoryType.PrgRom:
|
|
|
|
|
case DebugMemoryType.WorkRam:
|
|
|
|
|
case DebugMemoryType.SaveRam:
|
|
|
|
|
case DebugMemoryType.InternalRam:
|
2017-03-04 23:15:50 -05:00
|
|
|
|
this.ctrlHexViewer.ByteColorProvider = new ByteColorProvider(
|
2018-02-10 21:23:22 -05:00
|
|
|
|
this._memoryType,
|
2017-03-04 23:15:50 -05:00
|
|
|
|
mnuHighlightExecution.Checked,
|
|
|
|
|
mnuHighlightWrites.Checked,
|
|
|
|
|
mnuHightlightReads.Checked,
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFadeSpeed,
|
|
|
|
|
mnuHideUnusedBytes.Checked,
|
|
|
|
|
mnuHideReadBytes.Checked,
|
|
|
|
|
mnuHideWrittenBytes.Checked,
|
2017-12-26 17:33:46 -05:00
|
|
|
|
mnuHideExecutedBytes.Checked,
|
2017-12-29 13:39:57 -05:00
|
|
|
|
mnuHighlightDmcDataBytes.Checked,
|
2017-12-26 17:33:46 -05:00
|
|
|
|
mnuHighlightDataBytes.Checked,
|
2017-12-27 12:03:35 -05:00
|
|
|
|
mnuHighlightCodeBytes.Checked,
|
|
|
|
|
mnuHighlightLabelledBytes.Checked
|
2017-12-26 17:33:46 -05:00
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DebugMemoryType.PpuMemory:
|
|
|
|
|
case DebugMemoryType.ChrRom:
|
|
|
|
|
this.ctrlHexViewer.ByteColorProvider = new ChrByteColorProvider(
|
2018-02-10 21:23:22 -05:00
|
|
|
|
this._memoryType,
|
2017-12-26 17:33:46 -05:00
|
|
|
|
mnuHighlightChrDrawnBytes.Checked,
|
|
|
|
|
mnuHighlightChrReadBytes.Checked
|
2017-03-04 23:15:50 -05:00
|
|
|
|
);
|
2017-03-01 20:52:15 -05:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
this.ctrlHexViewer.ByteColorProvider = null;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-05 20:40:10 -04:00
|
|
|
|
private void mnuRefresh_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.RefreshData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void RefreshData()
|
|
|
|
|
{
|
2017-08-14 23:44:01 -04:00
|
|
|
|
if(DebugWorkspaceManager.GetWorkspace() != this._previousWorkspace) {
|
2017-02-26 19:52:48 -05:00
|
|
|
|
this.InitTblMappings();
|
2017-08-14 23:44:01 -04:00
|
|
|
|
_previousWorkspace = DebugWorkspaceManager.GetWorkspace();
|
2017-02-26 19:52:48 -05:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-01 19:38:48 -05:00
|
|
|
|
if(this.tabMain.SelectedTab == this.tpgAccessCounters) {
|
|
|
|
|
this.ctrlMemoryAccessCounters.RefreshData();
|
2016-12-08 19:30:41 -05:00
|
|
|
|
} else if(this.tabMain.SelectedTab == this.tpgMemoryViewer) {
|
2017-03-01 20:52:15 -05:00
|
|
|
|
this.UpdateByteColorProvider();
|
2018-02-24 14:23:54 -05:00
|
|
|
|
this.ctrlHexViewer.RefreshData(_memoryType);
|
2018-02-20 18:20:52 -05:00
|
|
|
|
} else if(this.tabMain.SelectedTab == this.tpgProfiler) {
|
|
|
|
|
this.ctrlProfiler.RefreshData();
|
2016-12-01 19:38:48 -05:00
|
|
|
|
}
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuFind_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.ctrlHexViewer.OpenSearchBox();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuFindNext_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.ctrlHexViewer.FindNext();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuFindPrev_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.ctrlHexViewer.FindPrevious();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuGoTo_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.ctrlHexViewer.GoToAddress();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuIncreaseFontSize_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2018-03-03 10:41:59 -05:00
|
|
|
|
this.ctrlHexViewer.TextZoom += 10;
|
|
|
|
|
this.ctrlMemoryAccessCounters.TextZoom += 10;
|
2016-06-04 14:43:13 -04:00
|
|
|
|
this.UpdateConfig();
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuDecreaseFontSize_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2018-03-03 10:41:59 -05:00
|
|
|
|
this.ctrlHexViewer.TextZoom -= 10;
|
|
|
|
|
this.ctrlMemoryAccessCounters.TextZoom -= 10;
|
2016-06-04 14:43:13 -04:00
|
|
|
|
this.UpdateConfig();
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuResetFontSize_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2018-03-03 10:41:59 -05:00
|
|
|
|
this.ctrlHexViewer.TextZoom = 100;
|
|
|
|
|
this.ctrlMemoryAccessCounters.TextZoom = 100;
|
2016-06-04 14:43:13 -04:00
|
|
|
|
this.UpdateConfig();
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuClose_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.Close();
|
2015-08-02 19:27:02 -04:00
|
|
|
|
}
|
2016-06-04 14:43:13 -04:00
|
|
|
|
|
|
|
|
|
private void UpdateConfig()
|
|
|
|
|
{
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamAutoRefresh = this.mnuAutoRefresh.Checked;
|
2018-01-15 22:20:51 -05:00
|
|
|
|
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamIgnoreRedundantWrites = this.mnuIgnoreRedundantWrites.Checked;
|
|
|
|
|
|
2017-02-26 18:58:48 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamShowCharacters = this.mnuShowCharacters.Checked;
|
2017-12-26 18:29:47 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamShowLabelInfo = this.mnuShowLabelInfoOnMouseOver.Checked;
|
2018-03-03 10:41:59 -05:00
|
|
|
|
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamTextZoom = this.ctrlHexViewer.TextZoom;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontFamily = this.ctrlHexViewer.BaseFont.FontFamily.Name;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontSize = this.ctrlHexViewer.BaseFont.Size;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontStyle = this.ctrlHexViewer.BaseFont.Style;
|
2017-03-04 23:15:50 -05:00
|
|
|
|
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightExecution = this.mnuHighlightExecution.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightReads = this.mnuHightlightReads.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightWrites = this.mnuHighlightWrites.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHideUnusedBytes = this.mnuHideUnusedBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHideReadBytes = this.mnuHideReadBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHideWrittenBytes = this.mnuHideWrittenBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHideExecutedBytes = this.mnuHideExecutedBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHideExecutedBytes = this.mnuHideExecutedBytes.Checked;
|
|
|
|
|
|
2017-12-28 14:16:13 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightLabelledBytes = this.mnuHighlightLabelledBytes.Checked;
|
2017-12-26 17:33:46 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightChrDrawnBytes = this.mnuHighlightChrDrawnBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightChrReadBytes = this.mnuHighlightChrReadBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightCodeBytes = this.mnuHighlightCodeBytes.Checked;
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightDataBytes = this.mnuHighlightDataBytes.Checked;
|
2017-12-29 13:39:57 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighlightDmcDataBytes = this.mnuHighlightDmcDataBytes.Checked;
|
2017-12-26 17:33:46 -05:00
|
|
|
|
|
2016-06-04 14:43:13 -04:00
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuAutoRefresh_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.UpdateConfig();
|
|
|
|
|
}
|
2016-09-05 09:05:34 -04:00
|
|
|
|
|
|
|
|
|
private void UpdateImportButton()
|
|
|
|
|
{
|
|
|
|
|
switch(_memoryType) {
|
|
|
|
|
case DebugMemoryType.ChrRam:
|
|
|
|
|
case DebugMemoryType.InternalRam:
|
|
|
|
|
case DebugMemoryType.PaletteMemory:
|
|
|
|
|
case DebugMemoryType.SecondarySpriteMemory:
|
|
|
|
|
case DebugMemoryType.SpriteMemory:
|
|
|
|
|
case DebugMemoryType.WorkRam:
|
|
|
|
|
case DebugMemoryType.SaveRam:
|
2018-02-23 10:18:25 -05:00
|
|
|
|
mnuImport.Enabled = true;
|
2016-09-05 09:05:34 -04:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
2018-02-23 10:18:25 -05:00
|
|
|
|
mnuImport.Enabled = false;
|
2016-09-05 09:05:34 -04:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuImport_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
2016-12-12 23:25:20 -05:00
|
|
|
|
ofd.SetFilter("Memory dump files (*.dmp)|*.dmp|All files (*.*)|*.*");
|
2016-09-05 09:05:34 -04:00
|
|
|
|
ofd.InitialDirectory = ConfigManager.DebuggerFolder;
|
|
|
|
|
if(ofd.ShowDialog() == DialogResult.OK) {
|
|
|
|
|
InteropEmu.DebugSetMemoryState(_memoryType, File.ReadAllBytes(ofd.FileName));
|
|
|
|
|
RefreshData();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuExport_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
2016-12-12 23:25:20 -05:00
|
|
|
|
sfd.SetFilter("Memory dump files (*.dmp)|*.dmp|All files (*.*)|*.*");
|
2016-09-05 09:05:34 -04:00
|
|
|
|
sfd.InitialDirectory = ConfigManager.DebuggerFolder;
|
|
|
|
|
sfd.FileName = InteropEmu.GetRomInfo().GetRomName() + " - " + cboMemoryType.SelectedItem.ToString() + ".dmp";
|
|
|
|
|
if(sfd.ShowDialog() == DialogResult.OK) {
|
2017-02-26 13:46:57 -05:00
|
|
|
|
File.WriteAllBytes(sfd.FileName, this.ctrlHexViewer.GetData());
|
2016-09-05 09:05:34 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
2016-12-01 19:38:48 -05:00
|
|
|
|
|
|
|
|
|
private void tabMain_SelectedIndexChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
2018-02-20 18:20:52 -05:00
|
|
|
|
_selectedTab = this.tabMain.SelectedTab;
|
|
|
|
|
this.RefreshData();
|
2016-12-01 19:38:48 -05:00
|
|
|
|
}
|
2017-02-26 13:46:57 -05:00
|
|
|
|
|
|
|
|
|
private void ctrlHexViewer_RequiredWidthChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
2017-10-06 18:26:02 -04:00
|
|
|
|
this.Size = new Size(this.ctrlHexViewer.RequiredWidth + 20, this.Height);
|
2017-02-26 13:46:57 -05:00
|
|
|
|
}
|
2017-02-26 18:58:48 -05:00
|
|
|
|
|
|
|
|
|
private void mnuLoadTblFile_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
|
|
|
ofd.SetFilter("TBL files (*.tbl)|*.tbl");
|
|
|
|
|
if(ofd.ShowDialog() == DialogResult.OK) {
|
2017-02-26 19:18:01 -05:00
|
|
|
|
string[] fileContents = File.ReadAllLines(ofd.FileName);
|
|
|
|
|
var tblDict = TblLoader.ToDictionary(fileContents);
|
2017-02-26 18:58:48 -05:00
|
|
|
|
if(tblDict == null) {
|
|
|
|
|
MessageBox.Show("Could not load TBL file. The file selected file appears to be invalid.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
} else {
|
2017-08-14 23:44:01 -04:00
|
|
|
|
DebugWorkspaceManager.GetWorkspace().TblMappings = new List<string>(fileContents);
|
2017-02-26 18:58:48 -05:00
|
|
|
|
this.ctrlHexViewer.ByteCharConverter = new TblByteCharConverter(tblDict);
|
|
|
|
|
this.mnuShowCharacters.Checked = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-26 19:18:01 -05:00
|
|
|
|
private void mnuResetTblMappings_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2017-08-14 23:44:01 -04:00
|
|
|
|
DebugWorkspaceManager.GetWorkspace().TblMappings = null;
|
2017-02-26 19:18:01 -05:00
|
|
|
|
this.ctrlHexViewer.ByteCharConverter = null;
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-26 18:58:48 -05:00
|
|
|
|
private void mnuShowCharacters_CheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.ctrlHexViewer.StringViewVisible = mnuShowCharacters.Checked;
|
|
|
|
|
this.UpdateConfig();
|
|
|
|
|
}
|
2017-03-01 20:52:15 -05:00
|
|
|
|
|
2018-01-15 22:20:51 -05:00
|
|
|
|
private void mnuIgnoreRedundantWrites_CheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.UpdateFlags();
|
|
|
|
|
this.UpdateConfig();
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-01 20:52:15 -05:00
|
|
|
|
private void UpdateFadeOptions()
|
|
|
|
|
{
|
|
|
|
|
int fadeSpeed = ConfigManager.Config.DebugInfo.RamFadeSpeed;
|
|
|
|
|
mnuFadeSlow.Checked = fadeSpeed == 600;
|
|
|
|
|
mnuFadeNormal.Checked = fadeSpeed == 300;
|
|
|
|
|
mnuFadeFast.Checked = fadeSpeed == 120;
|
2017-03-04 23:15:50 -05:00
|
|
|
|
mnuFadeNever.Checked = fadeSpeed == 0;
|
|
|
|
|
mnuCustomFadeSpeed.Checked = !mnuFadeSlow.Checked && !mnuFadeNormal.Checked && !mnuFadeFast.Checked && !mnuFadeSlow.Checked;
|
2017-03-01 20:52:15 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuFadeSpeed_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(sender == mnuFadeSlow) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFadeSpeed = 600;
|
|
|
|
|
} else if(sender == mnuFadeNormal) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFadeSpeed = 300;
|
|
|
|
|
} else if(sender == mnuFadeFast) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFadeSpeed = 120;
|
2017-03-04 23:15:50 -05:00
|
|
|
|
} else if(sender == mnuFadeNever) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFadeSpeed = 0;
|
2017-03-01 20:52:15 -05:00
|
|
|
|
}
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
UpdateFadeOptions();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuCustomFadeSpeed_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(frmFadeSpeed frm = new frmFadeSpeed(ConfigManager.Config.DebugInfo.RamFadeSpeed)) {
|
|
|
|
|
if(frm.ShowDialog() == DialogResult.OK) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamFadeSpeed = frm.FadeSpeed;
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
UpdateFadeOptions();
|
|
|
|
|
}
|
2018-01-03 18:48:16 -05:00
|
|
|
|
}
|
2017-03-02 20:33:25 -05:00
|
|
|
|
}
|
2017-03-04 23:15:50 -05:00
|
|
|
|
|
|
|
|
|
private void mnuColorProviderOptions_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.UpdateConfig();
|
|
|
|
|
this.UpdateByteColorProvider();
|
|
|
|
|
}
|
2017-12-26 17:55:08 -05:00
|
|
|
|
|
|
|
|
|
private void mnuConfigureColors_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(frmMemoryViewerColors frm = new frmMemoryViewerColors()) {
|
|
|
|
|
if(frm.ShowDialog(this, this) == DialogResult.OK) {
|
|
|
|
|
this.RefreshData();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-12-26 18:29:47 -05:00
|
|
|
|
|
|
|
|
|
private frmCodeTooltip _tooltip = null;
|
|
|
|
|
private CodeLabel _lastLabelTooltip = null;
|
2017-12-28 21:53:32 -05:00
|
|
|
|
private int _lastTooltipAddress = -1;
|
2017-12-26 18:29:47 -05:00
|
|
|
|
private void ctrlHexViewer_ByteMouseHover(int address)
|
|
|
|
|
{
|
|
|
|
|
if(address < 0 || !mnuShowLabelInfoOnMouseOver.Checked) {
|
|
|
|
|
if(_tooltip != null) {
|
|
|
|
|
_tooltip.Close();
|
|
|
|
|
_lastLabelTooltip = null;
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-28 21:53:32 -05:00
|
|
|
|
if(_lastTooltipAddress == address) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_lastTooltipAddress = address;
|
|
|
|
|
|
2017-12-26 18:29:47 -05:00
|
|
|
|
CodeLabel label = null;
|
|
|
|
|
switch(_memoryType) {
|
|
|
|
|
case DebugMemoryType.CpuMemory:
|
|
|
|
|
AddressTypeInfo info = new AddressTypeInfo();
|
|
|
|
|
InteropEmu.DebugGetAbsoluteAddressAndType((UInt32)address, ref info);
|
|
|
|
|
if(info.Address >= 0) {
|
|
|
|
|
label = LabelManager.GetLabel((UInt32)info.Address, info.Type);
|
|
|
|
|
}
|
|
|
|
|
if(label == null) {
|
|
|
|
|
label = LabelManager.GetLabel((UInt32)address, AddressType.Register);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DebugMemoryType.InternalRam:
|
|
|
|
|
label = LabelManager.GetLabel((UInt32)address, AddressType.InternalRam);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DebugMemoryType.WorkRam:
|
|
|
|
|
label = LabelManager.GetLabel((UInt32)address, AddressType.WorkRam);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DebugMemoryType.SaveRam:
|
|
|
|
|
label = LabelManager.GetLabel((UInt32)address, AddressType.SaveRam);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case DebugMemoryType.PrgRom:
|
|
|
|
|
label = LabelManager.GetLabel((UInt32)address, AddressType.PrgRom);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(label != null) {
|
|
|
|
|
if(_lastLabelTooltip != label) {
|
|
|
|
|
if(_tooltip != null) {
|
|
|
|
|
_tooltip.Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Dictionary<string, string> values = new Dictionary<string, string>();
|
|
|
|
|
if(!string.IsNullOrWhiteSpace(label.Label)) {
|
|
|
|
|
values["Label"] = label.Label;
|
|
|
|
|
}
|
|
|
|
|
values["Address"] = "$" + label.Address.ToString("X4");
|
|
|
|
|
values["Address Type"] = label.AddressType.ToString();
|
|
|
|
|
if(!string.IsNullOrWhiteSpace(label.Comment)) {
|
|
|
|
|
values["Comment"] = label.Comment;
|
|
|
|
|
}
|
|
|
|
|
_tooltip = new frmCodeTooltip(values);
|
|
|
|
|
_tooltip.Left = Cursor.Position.X + 10;
|
|
|
|
|
_tooltip.Top = Cursor.Position.Y + 10;
|
|
|
|
|
_tooltip.Show(this);
|
|
|
|
|
|
|
|
|
|
_lastLabelTooltip = label;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if(_tooltip != null) {
|
|
|
|
|
_tooltip.Close();
|
|
|
|
|
_lastLabelTooltip = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-01-14 14:03:43 -05:00
|
|
|
|
|
|
|
|
|
private void mnuAutoRefreshSpeed_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(sender == mnuAutoRefreshLow) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed = RefreshSpeed.Low;
|
|
|
|
|
} else if(sender == mnuAutoRefreshNormal) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed = RefreshSpeed.Normal;
|
|
|
|
|
} else if(sender == mnuAutoRefreshHigh) {
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed = RefreshSpeed.High;
|
|
|
|
|
}
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
|
|
|
|
|
UpdateRefreshSpeedMenu();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateRefreshSpeedMenu()
|
|
|
|
|
{
|
|
|
|
|
mnuAutoRefreshLow.Checked = ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed == RefreshSpeed.Low;
|
|
|
|
|
mnuAutoRefreshNormal.Checked = ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed == RefreshSpeed.Normal;
|
|
|
|
|
mnuAutoRefreshHigh.Checked = ConfigManager.Config.DebugInfo.RamAutoRefreshSpeed == RefreshSpeed.High;
|
|
|
|
|
}
|
2018-02-23 10:18:25 -05:00
|
|
|
|
|
|
|
|
|
private void mnuHighDensityMode_CheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamHighDensityTextMode = mnuHighDensityMode.Checked;
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
ctrlHexViewer.HighDensityMode = ConfigManager.Config.DebugInfo.RamHighDensityTextMode;
|
|
|
|
|
}
|
2018-02-23 12:45:49 -05:00
|
|
|
|
|
|
|
|
|
private void mnuEnablePerByteNavigation_CheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamEnablePerByteNavigation = mnuEnablePerByteNavigation.Checked;
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
ctrlHexViewer.EnablePerByteNavigation = ConfigManager.Config.DebugInfo.RamEnablePerByteNavigation;
|
|
|
|
|
}
|
2018-03-03 10:41:59 -05:00
|
|
|
|
|
|
|
|
|
private void mnuSelectFont_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
ctrlHexViewer.BaseFont = FontDialogHelper.SelectFont(ctrlHexViewer.BaseFont);
|
|
|
|
|
ctrlMemoryAccessCounters.BaseFont = ctrlHexViewer.BaseFont;
|
|
|
|
|
}
|
2018-03-10 13:41:01 -05:00
|
|
|
|
|
|
|
|
|
private void mnuByteEditingMode_CheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
ConfigManager.Config.DebugInfo.RamByteEditingMode = mnuByteEditingMode.Checked;
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
ctrlHexViewer.ByteEditingMode = ConfigManager.Config.DebugInfo.RamByteEditingMode;
|
|
|
|
|
}
|
2015-08-02 19:27:02 -04:00
|
|
|
|
}
|
|
|
|
|
}
|