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;
|
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-02-26 19:18:01 -05:00
|
|
|
|
private Func<DebugWorkspace> _getWorkspace;
|
2015-08-05 20:40:10 -04:00
|
|
|
|
|
2017-02-26 19:18:01 -05:00
|
|
|
|
public frmMemoryViewer(Func<DebugWorkspace> getWorkspace)
|
2015-08-02 19:27:02 -04:00
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2017-02-26 19:18:01 -05:00
|
|
|
|
|
|
|
|
|
this._getWorkspace = getWorkspace;
|
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
|
|
|
|
|
2016-09-05 09:05:34 -04:00
|
|
|
|
this.mnuAutoRefresh.Checked = ConfigManager.Config.DebugInfo.RamAutoRefresh;
|
2017-02-26 18:58:48 -05:00
|
|
|
|
this.mnuShowCharacters.Checked = ConfigManager.Config.DebugInfo.RamShowCharacters;
|
2017-02-26 13:46:57 -05:00
|
|
|
|
this.ctrlHexViewer.SetFontSize((int)ConfigManager.Config.DebugInfo.RamFontSize);
|
2016-09-05 09:05:34 -04:00
|
|
|
|
|
2017-02-26 19:52:48 -05:00
|
|
|
|
if(this._getWorkspace().TblMappings != null && this._getWorkspace().TblMappings.Count > 0) {
|
|
|
|
|
this.InitTblMappings();
|
2017-02-26 19:18:01 -05:00
|
|
|
|
}
|
2017-02-26 18:58:48 -05:00
|
|
|
|
this.ctrlHexViewer.StringViewVisible = mnuShowCharacters.Checked;
|
|
|
|
|
|
2016-09-05 09:05:34 -04:00
|
|
|
|
UpdateImportButton();
|
|
|
|
|
|
2015-08-05 20:40:10 -04:00
|
|
|
|
this.cboMemoryType.SelectedIndex = 0;
|
|
|
|
|
|
|
|
|
|
_notifListener = new InteropEmu.NotificationListener();
|
|
|
|
|
_notifListener.OnNotification += _notifListener_OnNotification;
|
2017-02-26 18:58:48 -05:00
|
|
|
|
|
|
|
|
|
this.mnuShowCharacters.CheckedChanged += new EventHandler(this.mnuShowCharacters_CheckedChanged);
|
2015-08-05 20:40:10 -04:00
|
|
|
|
}
|
|
|
|
|
|
2017-02-26 19:52:48 -05:00
|
|
|
|
void InitTblMappings()
|
|
|
|
|
{
|
|
|
|
|
var tblDict = TblLoader.ToDictionary(this._getWorkspace().TblMappings.ToArray());
|
|
|
|
|
if(tblDict != null) {
|
|
|
|
|
this.ctrlHexViewer.ByteCharConverter = new TblByteCharConverter(tblDict);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-05 20:40:10 -04:00
|
|
|
|
void _notifListener_OnNotification(InteropEmu.NotificationEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(e.NotificationType == InteropEmu.ConsoleNotificationType.CodeBreak) {
|
|
|
|
|
this.BeginInvoke((MethodInvoker)(() => this.RefreshData()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void cboMemoryType_SelectedIndexChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
2016-09-05 09:05:34 -04:00
|
|
|
|
this._memoryType = (DebugMemoryType)this.cboMemoryType.SelectedIndex;
|
|
|
|
|
this.UpdateImportButton();
|
2015-08-05 20:40:10 -04:00
|
|
|
|
this.RefreshData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuRefresh_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.RefreshData();
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-26 13:46:57 -05:00
|
|
|
|
int _previousIndex = -1;
|
2017-02-26 19:52:48 -05:00
|
|
|
|
DebugWorkspace _previousWorkspace;
|
2015-08-05 20:40:10 -04:00
|
|
|
|
private void RefreshData()
|
|
|
|
|
{
|
2017-02-26 19:52:48 -05:00
|
|
|
|
if(this._getWorkspace() != this._previousWorkspace) {
|
|
|
|
|
this.InitTblMappings();
|
|
|
|
|
}
|
|
|
|
|
_previousWorkspace = this._getWorkspace();
|
|
|
|
|
|
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-02-26 13:46:57 -05:00
|
|
|
|
this.ctrlHexViewer.SetData(InteropEmu.DebugGetMemoryState((DebugMemoryType)this.cboMemoryType.SelectedIndex), this.cboMemoryType.SelectedIndex != _previousIndex);
|
|
|
|
|
this._previousIndex = this.cboMemoryType.SelectedIndex;
|
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)
|
|
|
|
|
{
|
2017-02-26 13:46:57 -05:00
|
|
|
|
this.ctrlHexViewer.IncreaseFontSize();
|
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)
|
|
|
|
|
{
|
2017-02-26 13:46:57 -05:00
|
|
|
|
this.ctrlHexViewer.DecreaseFontSize();
|
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)
|
|
|
|
|
{
|
2017-02-26 13:46:57 -05:00
|
|
|
|
this.ctrlHexViewer.ResetFontSize();
|
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;
|
2017-02-26 18:58:48 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamShowCharacters = this.mnuShowCharacters.Checked;
|
2017-02-26 13:46:57 -05:00
|
|
|
|
ConfigManager.Config.DebugInfo.RamFontSize = this.ctrlHexViewer.HexFont.Size;
|
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:
|
|
|
|
|
btnImport.Enabled = mnuImport.Enabled = true;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
btnImport.Enabled = mnuImport.Enabled = false;
|
|
|
|
|
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 tmrRefresh_Tick(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(this.mnuAutoRefresh.Checked) {
|
|
|
|
|
this.RefreshData();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void tabMain_SelectedIndexChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.tmrRefresh.Interval = this.tabMain.SelectedTab == this.tpgMemoryViewer ? 100 : 500;
|
2016-12-08 19:30:41 -05:00
|
|
|
|
|
|
|
|
|
if(this.tabMain.SelectedTab == this.tpgProfiler) {
|
|
|
|
|
this.ctrlProfiler.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)
|
|
|
|
|
{
|
|
|
|
|
this.Size = new Size(this.ctrlHexViewer.RequiredWidth + this.Width - this.ctrlHexViewer.Width + 30, this.Height);
|
|
|
|
|
}
|
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-02-26 19:18:01 -05:00
|
|
|
|
this._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)
|
|
|
|
|
{
|
|
|
|
|
this._getWorkspace().TblMappings = null;
|
|
|
|
|
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();
|
|
|
|
|
}
|
2015-08-02 19:27:02 -04:00
|
|
|
|
}
|
|
|
|
|
}
|