2011-03-06 15:03:17 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Windows.Forms;
|
2011-03-08 13:33:46 +00:00
|
|
|
|
using System.Globalization;
|
2011-08-07 19:30:01 +00:00
|
|
|
|
using System.IO;
|
2011-03-06 15:03:17 +00:00
|
|
|
|
|
|
|
|
|
namespace BizHawk.MultiClient
|
|
|
|
|
{
|
2011-06-19 23:39:25 +00:00
|
|
|
|
public partial class HexEditor : Form
|
|
|
|
|
{
|
|
|
|
|
//TODO:
|
|
|
|
|
//Find text box - autohighlights matches, and shows total matches
|
|
|
|
|
//Users can customize background, & text colors
|
|
|
|
|
//Tool strip
|
|
|
|
|
int defaultWidth;
|
|
|
|
|
int defaultHeight;
|
|
|
|
|
List<ToolStripMenuItem> domainMenuItems = new List<ToolStripMenuItem>();
|
2011-08-22 02:48:12 +00:00
|
|
|
|
int RowsVisible = 0;
|
|
|
|
|
string Header = "";
|
|
|
|
|
int NumDigits = 4;
|
2011-08-25 23:49:13 +00:00
|
|
|
|
string NumDigitsStr = "{0:X4} ";
|
2011-08-27 04:32:54 +00:00
|
|
|
|
string DigitFormatString = "{0:X2} ";
|
2011-08-25 01:49:22 +00:00
|
|
|
|
char[] nibbles = { 'G', 'G', 'G', 'G' , 'G', 'G', 'G', 'G'}; //G = off 0-9 & A-F are acceptable values
|
2011-08-22 02:48:12 +00:00
|
|
|
|
int addressHighlighted = -1;
|
|
|
|
|
int addressOver = -1;
|
|
|
|
|
int addrOffset = 0; //If addresses are > 4 digits, this offset is how much the columns are moved to the right
|
|
|
|
|
int maxRow = 0;
|
|
|
|
|
MemoryDomain Domain = new MemoryDomain("NULL", 1024, Endian.Little, addr => { return 0; }, (a, v) => { v = 0; });
|
|
|
|
|
string info = "";
|
|
|
|
|
int row = 0;
|
|
|
|
|
int addr = 0;
|
2011-08-23 22:22:24 +00:00
|
|
|
|
private int Pointedx = 0;
|
|
|
|
|
private int Pointedy = 0;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
const int rowX = 1;
|
|
|
|
|
const int rowY = 4;
|
|
|
|
|
const int rowYoffset = 20;
|
2011-08-23 22:44:23 +00:00
|
|
|
|
const int fontHeight = 14;
|
2011-08-24 02:31:45 +00:00
|
|
|
|
const int fontWidth = 7; //Width of 1 digits
|
2011-06-19 23:39:25 +00:00
|
|
|
|
|
|
|
|
|
public HexEditor()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2011-08-23 01:43:19 +00:00
|
|
|
|
AddressesLabel.BackColor = Color.Transparent;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetHeader();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
Closing += (o, e) => SaveConfigSettings();
|
2011-08-25 02:23:12 +00:00
|
|
|
|
AddressesLabel.Font = new Font("Courier New", 8); ;
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SaveConfigSettings()
|
|
|
|
|
{
|
|
|
|
|
if (Global.Config.HexEditorSaveWindowPosition)
|
|
|
|
|
{
|
|
|
|
|
Global.Config.HexEditorWndx = this.Location.X;
|
|
|
|
|
Global.Config.HexEditorWndy = this.Location.Y;
|
|
|
|
|
Global.Config.HexEditorWidth = this.Right - this.Left;
|
|
|
|
|
Global.Config.HexEditorHeight = this.Bottom - this.Top;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void HexEditor_Load(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
defaultWidth = this.Size.Width; //Save these first so that the user can restore to its original size
|
|
|
|
|
defaultHeight = this.Size.Height;
|
|
|
|
|
if (Global.Config.HexEditorSaveWindowPosition)
|
|
|
|
|
{
|
|
|
|
|
if (Global.Config.HexEditorSaveWindowPosition && Global.Config.HexEditorWndx >= 0 && Global.Config.HexEditorWndy >= 0)
|
|
|
|
|
this.Location = new Point(Global.Config.HexEditorWndx, Global.Config.HexEditorWndy);
|
|
|
|
|
|
|
|
|
|
if (Global.Config.HexEditorWidth >= 0 && Global.Config.HexEditorHeight >= 0)
|
|
|
|
|
{
|
|
|
|
|
this.Size = new System.Drawing.Size(Global.Config.HexEditorWidth, Global.Config.HexEditorHeight);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
SetMemoryDomainMenu();
|
2011-08-27 04:36:45 +00:00
|
|
|
|
SetDataSize(Global.Config.HexEditorDataSize);
|
2011-08-25 02:23:12 +00:00
|
|
|
|
UpdateValues();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.Close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UpdateValues()
|
|
|
|
|
{
|
|
|
|
|
if (!this.IsHandleCreated || this.IsDisposed) return;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
|
2011-08-22 16:34:47 +00:00
|
|
|
|
AddressesLabel.Text = GenerateMemoryViewString();
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 16:42:32 +00:00
|
|
|
|
public string GenerateMemoryViewString()
|
2011-08-22 02:48:12 +00:00
|
|
|
|
{
|
2011-08-27 04:32:54 +00:00
|
|
|
|
StringBuilder rowStr = new StringBuilder("");
|
|
|
|
|
addrOffset = (NumDigits % 4) * 9;
|
2011-08-24 02:48:52 +00:00
|
|
|
|
|
2011-08-27 04:32:54 +00:00
|
|
|
|
rowStr.Append(Header + '\n');
|
2011-08-24 02:48:52 +00:00
|
|
|
|
|
2011-08-27 04:32:54 +00:00
|
|
|
|
for (int i = 0; i < RowsVisible; i++)
|
|
|
|
|
{
|
|
|
|
|
row = i + vScrollBar1.Value;
|
|
|
|
|
addr = (row * 16);
|
|
|
|
|
if (addr >= Domain.Size)
|
|
|
|
|
break;
|
|
|
|
|
rowStr.AppendFormat(NumDigitsStr, addr);
|
2011-08-25 17:05:51 +00:00
|
|
|
|
|
2011-08-27 04:32:54 +00:00
|
|
|
|
for (int j = 0; j < 16; j += Global.Config.HexEditorDataSize)
|
|
|
|
|
{
|
|
|
|
|
if (addr + j < Domain.Size)
|
|
|
|
|
rowStr.AppendFormat(DigitFormatString, MakeValue(addr + j));
|
|
|
|
|
}
|
|
|
|
|
rowStr.Append(" | ");
|
|
|
|
|
for (int k = 0; k < 16; k++)
|
|
|
|
|
{
|
|
|
|
|
rowStr.Append(Remap(Domain.PeekByte(addr + k)));
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
2011-08-27 04:32:54 +00:00
|
|
|
|
rowStr.AppendLine();
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
2011-08-27 04:32:54 +00:00
|
|
|
|
return rowStr.ToString();
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static char Remap(byte val)
|
|
|
|
|
{
|
2011-08-27 14:49:13 +00:00
|
|
|
|
if (val < ' ') return '.';
|
|
|
|
|
else if (val >= 0x80) return '.';
|
|
|
|
|
else return (char)val;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-24 02:31:45 +00:00
|
|
|
|
private int MakeValue(int addr)
|
2011-08-22 02:48:12 +00:00
|
|
|
|
{
|
2011-08-27 04:32:54 +00:00
|
|
|
|
|
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-08-22 02:48:12 +00:00
|
|
|
|
{
|
2011-08-27 04:32:54 +00:00
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
return Domain.PeekByte(addr);
|
|
|
|
|
case 2:
|
|
|
|
|
if (Global.Config.HexEditorBigEndian)
|
|
|
|
|
return MakeWordBig(addr);
|
|
|
|
|
else
|
|
|
|
|
return MakeWordLittle(addr);
|
|
|
|
|
case 4:
|
|
|
|
|
if (Global.Config.HexEditorBigEndian)
|
|
|
|
|
return (MakeWordBig(addr) * 65536) + MakeWordBig(addr + 2);
|
|
|
|
|
else
|
|
|
|
|
return (MakeWordLittle(addr) * 65536) + MakeWordLittle(addr);
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-27 04:32:54 +00:00
|
|
|
|
private int MakeWordBig(int addr)
|
2011-08-22 02:48:12 +00:00
|
|
|
|
{
|
2011-08-27 04:32:54 +00:00
|
|
|
|
return (Domain.PeekByte(addr) * 256) + Domain.PeekByte(addr + 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int MakeWordLittle(int addr)
|
|
|
|
|
{
|
|
|
|
|
return Domain.PeekByte(addr) + (Domain.PeekByte(addr + 1) * 256);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Restart()
|
|
|
|
|
{
|
|
|
|
|
if (!this.IsHandleCreated || this.IsDisposed) return;
|
|
|
|
|
SetMemoryDomainMenu(); //Calls update routines
|
2011-08-22 02:48:12 +00:00
|
|
|
|
ResetScrollBar();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void restoreWindowSizeToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.Size = new System.Drawing.Size(defaultWidth, defaultHeight);
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetUpScrollBar();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void autoloadToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Global.Config.AutoLoadHexEditor ^= true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void optionsToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
enToolStripMenuItem.Checked = Global.Config.HexEditorBigEndian;
|
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
byteToolStripMenuItem.Checked = true;
|
|
|
|
|
byteToolStripMenuItem1.Checked = false;
|
|
|
|
|
byteToolStripMenuItem2.Checked = false;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
byteToolStripMenuItem.Checked = false;
|
|
|
|
|
byteToolStripMenuItem1.Checked = true;
|
|
|
|
|
byteToolStripMenuItem2.Checked = false;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
byteToolStripMenuItem.Checked = false;
|
|
|
|
|
byteToolStripMenuItem1.Checked = false;
|
|
|
|
|
byteToolStripMenuItem2.Checked = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
if (GetHighlightedAddress() >= 0)
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
|
|
|
|
addToRamWatchToolStripMenuItem1.Enabled = true;
|
|
|
|
|
freezeAddressToolStripMenuItem.Enabled = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
addToRamWatchToolStripMenuItem1.Enabled = false;
|
|
|
|
|
freezeAddressToolStripMenuItem.Enabled = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
public void SetMemoryDomain(MemoryDomain d)
|
|
|
|
|
{
|
|
|
|
|
Domain = d;
|
|
|
|
|
maxRow = Domain.Size / 2;
|
|
|
|
|
SetUpScrollBar();
|
|
|
|
|
vScrollBar1.Value = 0;
|
|
|
|
|
Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-19 23:39:25 +00:00
|
|
|
|
private void SetMemoryDomain(int pos)
|
|
|
|
|
{
|
|
|
|
|
if (pos < Global.Emulator.MemoryDomains.Count) //Sanity check
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetMemoryDomain(Global.Emulator.MemoryDomains[pos]);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
2011-08-23 23:48:22 +00:00
|
|
|
|
UpdateGroupBoxTitle();
|
2011-08-22 02:48:12 +00:00
|
|
|
|
ResetScrollBar();
|
2011-09-17 16:39:43 +00:00
|
|
|
|
MemoryViewerBox.Refresh();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-23 23:48:22 +00:00
|
|
|
|
private void UpdateGroupBoxTitle()
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
string memoryDomain = Domain.ToString();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
string systemID = Global.Emulator.SystemId;
|
2011-08-25 00:55:46 +00:00
|
|
|
|
MemoryViewerBox.Text = systemID + " " + memoryDomain + " - " + (Domain.Size / Global.Config.HexEditorDataSize).ToString() + " addresses";
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SetMemoryDomainMenu()
|
|
|
|
|
{
|
|
|
|
|
memoryDomainsToolStripMenuItem.DropDownItems.Clear();
|
|
|
|
|
if (Global.Emulator.MemoryDomains.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
for (int x = 0; x < Global.Emulator.MemoryDomains.Count; x++)
|
|
|
|
|
{
|
|
|
|
|
string str = Global.Emulator.MemoryDomains[x].ToString();
|
|
|
|
|
var item = new ToolStripMenuItem();
|
|
|
|
|
item.Text = str;
|
|
|
|
|
{
|
|
|
|
|
int z = x;
|
|
|
|
|
item.Click += (o, ev) => SetMemoryDomain(z);
|
|
|
|
|
}
|
|
|
|
|
if (x == 0)
|
|
|
|
|
{
|
|
|
|
|
SetMemoryDomain(x);
|
|
|
|
|
}
|
|
|
|
|
memoryDomainsToolStripMenuItem.DropDownItems.Add(item);
|
|
|
|
|
domainMenuItems.Add(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
memoryDomainsToolStripMenuItem.Enabled = false;
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-24 02:48:52 +00:00
|
|
|
|
|
2011-06-19 23:39:25 +00:00
|
|
|
|
|
|
|
|
|
private void goToAddressToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
GoToSpecifiedAddress();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int GetNumDigits(Int32 i)
|
|
|
|
|
{
|
2011-08-27 14:49:13 +00:00
|
|
|
|
if (i <= 0x10000) return 4;
|
|
|
|
|
if (i <= 0x1000000) return 6;
|
|
|
|
|
else return 8;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void GoToSpecifiedAddress()
|
|
|
|
|
{
|
|
|
|
|
InputPrompt i = new InputPrompt();
|
|
|
|
|
i.Text = "Go to Address";
|
|
|
|
|
i.SetMessage("Enter a hexadecimal value");
|
|
|
|
|
Global.Sound.StopSound();
|
|
|
|
|
i.ShowDialog();
|
|
|
|
|
Global.Sound.StartSound();
|
|
|
|
|
|
|
|
|
|
if (i.UserOK)
|
|
|
|
|
{
|
|
|
|
|
if (InputValidate.IsValidHexNumber(i.UserText))
|
|
|
|
|
{
|
|
|
|
|
GoToAddress(int.Parse(i.UserText, NumberStyles.HexNumber));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ClearNibbles()
|
|
|
|
|
{
|
2011-08-25 01:49:22 +00:00
|
|
|
|
for (int x = 0; x < 8; x++)
|
2011-08-22 02:48:12 +00:00
|
|
|
|
nibbles[x] = 'G';
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-07 19:53:52 +00:00
|
|
|
|
public void GoToAddress(int address)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
if (address < 0)
|
|
|
|
|
address = 0;
|
|
|
|
|
|
|
|
|
|
if (address >= Domain.Size)
|
|
|
|
|
address = Domain.Size - 1;
|
|
|
|
|
|
|
|
|
|
SetHighlighted(address);
|
|
|
|
|
ClearNibbles();
|
2011-08-23 22:22:24 +00:00
|
|
|
|
UpdateValues();
|
|
|
|
|
MemoryViewerBox.Refresh();
|
2011-08-07 19:53:52 +00:00
|
|
|
|
}
|
2011-06-19 23:39:25 +00:00
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
public void SetHighlighted(int addr)
|
|
|
|
|
{
|
|
|
|
|
if (addr < 0)
|
|
|
|
|
addr = 0;
|
|
|
|
|
if (addr >= Domain.Size)
|
|
|
|
|
addr = Domain.Size - 1;
|
|
|
|
|
|
|
|
|
|
if (!IsVisible(addr))
|
|
|
|
|
{
|
|
|
|
|
int v = (addr / 16) - RowsVisible + 1;
|
|
|
|
|
if (v < 0)
|
|
|
|
|
v = 0;
|
2011-08-22 16:42:32 +00:00
|
|
|
|
vScrollBar1.Value = v;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
addressHighlighted = addr;
|
|
|
|
|
addressOver = addr;
|
2011-08-25 23:58:16 +00:00
|
|
|
|
ClearNibbles();
|
2011-08-25 23:49:13 +00:00
|
|
|
|
info = String.Format(NumDigitsStr, addressOver);
|
|
|
|
|
UpdateFormText();
|
2011-08-22 02:48:12 +00:00
|
|
|
|
Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-25 23:49:13 +00:00
|
|
|
|
private void UpdateFormText()
|
|
|
|
|
{
|
|
|
|
|
if (addressHighlighted >= 0)
|
|
|
|
|
Text = "Hex Editor - Editing Address 0x" + String.Format(NumDigitsStr, addressHighlighted);
|
|
|
|
|
else
|
|
|
|
|
Text = "Hex Editor";
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
public bool IsVisible(int addr)
|
|
|
|
|
{
|
2011-08-27 14:49:13 +00:00
|
|
|
|
int row = addr >> 4;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
|
2011-08-27 14:49:13 +00:00
|
|
|
|
if (row >= vScrollBar1.Value && row < (RowsVisible + vScrollBar1.Value))
|
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
2011-06-19 23:39:25 +00:00
|
|
|
|
|
|
|
|
|
private void HexEditor_Resize(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-22 16:34:47 +00:00
|
|
|
|
SetUpScrollBar();
|
2011-08-23 22:22:24 +00:00
|
|
|
|
UpdateValues();
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SetHeader()
|
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-08-22 02:48:12 +00:00
|
|
|
|
{
|
|
|
|
|
case 1:
|
|
|
|
|
Header = " 0 1 2 3 4 5 6 7 8 9 A B C D E F";
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
Header = " 0 2 4 6 8 A C E";
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
Header = " 0 4 8 C";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
NumDigits = GetNumDigits(Domain.Size);
|
2011-08-25 17:05:51 +00:00
|
|
|
|
NumDigitsStr = "{0:X" + NumDigits.ToString() + "} ";
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetDataSize(int size)
|
|
|
|
|
{
|
|
|
|
|
if (size == 1 || size == 2 || size == 4)
|
2011-08-25 00:55:46 +00:00
|
|
|
|
Global.Config.HexEditorDataSize = size;
|
2011-08-27 04:32:54 +00:00
|
|
|
|
DigitFormatString = "{0:X" + (Global.Config.HexEditorDataSize * 2).ToString() + "} ";
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetHeader();
|
2011-08-23 23:48:22 +00:00
|
|
|
|
UpdateGroupBoxTitle();
|
|
|
|
|
UpdateValues();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void byteToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetDataSize(1);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void byteToolStripMenuItem1_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetDataSize(2);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void byteToolStripMenuItem2_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
SetDataSize(4);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void enToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
Global.Config.HexEditorBigEndian ^= true;
|
|
|
|
|
UpdateValues();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddToRamWatch()
|
|
|
|
|
{
|
|
|
|
|
//Add to RAM Watch
|
2011-08-22 02:48:12 +00:00
|
|
|
|
int address = GetHighlightedAddress();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
if (address >= 0)
|
|
|
|
|
{
|
|
|
|
|
Watch w = new Watch();
|
|
|
|
|
w.address = address;
|
2011-08-25 01:22:03 +00:00
|
|
|
|
w.bigendian = Global.Config.HexEditorBigEndian;
|
|
|
|
|
w.signed = asigned.HEX;
|
2011-06-19 23:39:25 +00:00
|
|
|
|
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
w.type = atype.BYTE;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
w.type = atype.WORD;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
w.type = atype.DWORD;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Global.MainForm.LoadRamWatch();
|
|
|
|
|
Global.MainForm.RamWatch1.AddWatch(w);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void MemoryViewer_MouseDoubleClick(object sender, MouseEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
AddToRamWatch();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void pokeToolStripMenuItem_Click(object sender, EventArgs e)
|
2011-09-12 23:21:39 +00:00
|
|
|
|
{
|
|
|
|
|
PokeAddress();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PokeAddress()
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
2011-08-24 22:26:17 +00:00
|
|
|
|
int p = GetHighlightedAddress();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
if (p >= 0)
|
|
|
|
|
{
|
2011-09-17 15:35:39 +00:00
|
|
|
|
Watch w = new Watch();
|
|
|
|
|
w.address = p;
|
|
|
|
|
w.value = MakeValue(p);
|
|
|
|
|
w.bigendian = Global.Config.HexEditorBigEndian;
|
|
|
|
|
w.signed = asigned.HEX;
|
2011-06-19 23:39:25 +00:00
|
|
|
|
|
2011-09-17 15:35:39 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
2011-09-17 15:35:39 +00:00
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
w.type = atype.BYTE;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
w.type = atype.WORD;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
w.type = atype.DWORD;
|
|
|
|
|
break;
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
2011-09-17 15:35:39 +00:00
|
|
|
|
|
|
|
|
|
RamPoke poke = new RamPoke();
|
|
|
|
|
poke.SetWatchObject(w, Domain);
|
|
|
|
|
poke.location = GetAddressCoordinates(p);
|
|
|
|
|
Global.Sound.StopSound();
|
|
|
|
|
poke.ShowDialog();
|
|
|
|
|
Global.Sound.StartSound();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
public int GetPointedAddress()
|
|
|
|
|
{
|
|
|
|
|
if (addressOver >= 0)
|
|
|
|
|
return addressOver;
|
|
|
|
|
else
|
|
|
|
|
return -1; //Negative = no address pointed
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void PokeHighlighted(int value)
|
|
|
|
|
{
|
2011-08-24 22:26:17 +00:00
|
|
|
|
//TODO: 4 byte
|
2011-08-22 02:48:12 +00:00
|
|
|
|
if (addressHighlighted >= 0)
|
2011-08-24 22:26:17 +00:00
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-08-24 22:26:17 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
Domain.PokeByte(addressHighlighted, (byte)value);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
PokeWord(addressHighlighted, (byte)(value % 256), (byte)value);
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-06-19 23:39:25 +00:00
|
|
|
|
private void addToRamWatchToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
AddToRamWatch();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void addToRamWatchToolStripMenuItem1_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
AddToRamWatch();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void saveWindowsSettingsToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Global.Config.HexEditorSaveWindowPosition ^= true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void settingsToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
autoloadToolStripMenuItem.Checked = Global.Config.AutoLoadHexEditor;
|
|
|
|
|
saveWindowsSettingsToolStripMenuItem.Checked = Global.Config.HexEditorSaveWindowPosition;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void freezeToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
FreezeAddress();
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
public int GetHighlightedAddress()
|
|
|
|
|
{
|
|
|
|
|
if (addressHighlighted >= 0)
|
|
|
|
|
return addressHighlighted;
|
|
|
|
|
else
|
|
|
|
|
return -1; //Negative = no address highlighted
|
|
|
|
|
}
|
|
|
|
|
|
2011-06-19 23:39:25 +00:00
|
|
|
|
private void FreezeAddress()
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
int address = GetHighlightedAddress();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
if (address >= 0)
|
|
|
|
|
{
|
|
|
|
|
Cheat c = new Cheat();
|
|
|
|
|
c.address = address;
|
2011-08-25 01:22:03 +00:00
|
|
|
|
c.value = Domain.PeekByte(address);
|
2011-08-22 02:48:12 +00:00
|
|
|
|
c.domain = Domain;
|
2011-08-25 01:22:03 +00:00
|
|
|
|
c.Enable();
|
|
|
|
|
Global.MainForm.Cheats1.AddCheat(c);
|
|
|
|
|
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-06-19 23:39:25 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
2011-08-25 01:22:03 +00:00
|
|
|
|
Cheat c2 = new Cheat();
|
|
|
|
|
c2.address = address + 1;
|
|
|
|
|
c2.domain = Domain;
|
|
|
|
|
c2.value = Domain.PeekByte(address + 1);
|
|
|
|
|
c2.Enable();
|
|
|
|
|
Global.MainForm.Cheats1.AddCheat(c2);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
break;
|
|
|
|
|
case 4:
|
2011-08-25 01:22:03 +00:00
|
|
|
|
Cheat c42 = new Cheat();
|
|
|
|
|
c42.address = address + 1;
|
|
|
|
|
c42.domain = Domain;
|
|
|
|
|
c42.value = Domain.PeekByte(address + 1);
|
|
|
|
|
c42.Enable();
|
|
|
|
|
Global.MainForm.Cheats1.AddCheat(c42);
|
|
|
|
|
Cheat c43 = new Cheat();
|
|
|
|
|
c43.address = address + 2;
|
|
|
|
|
c43.domain = Domain;
|
|
|
|
|
c43.value = Domain.PeekByte(address + 2);
|
|
|
|
|
c43.Enable();
|
|
|
|
|
Global.MainForm.Cheats1.AddCheat(c43);
|
|
|
|
|
Cheat c44 = new Cheat();
|
|
|
|
|
c44.address = address + 3;
|
|
|
|
|
c44.domain = Domain;
|
|
|
|
|
c44.value = Domain.PeekByte(address + 3);
|
|
|
|
|
c44.Enable();
|
|
|
|
|
Global.MainForm.Cheats1.AddCheat(c44);
|
2011-06-19 23:39:25 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-08-25 02:08:05 +00:00
|
|
|
|
MemoryViewerBox.Refresh();
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void freezeAddressToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
FreezeAddress();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CheckDomainMenuItems()
|
|
|
|
|
{
|
|
|
|
|
for (int x = 0; x < domainMenuItems.Count; x++)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
if (Domain.Name == domainMenuItems[x].Text)
|
2011-06-19 23:39:25 +00:00
|
|
|
|
domainMenuItems[x].Checked = true;
|
|
|
|
|
else
|
|
|
|
|
domainMenuItems[x].Checked = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void memoryDomainsToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
CheckDomainMenuItems();
|
|
|
|
|
}
|
2011-06-26 00:06:50 +00:00
|
|
|
|
|
|
|
|
|
private void dumpToFileToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
2011-08-07 19:30:01 +00:00
|
|
|
|
SaveAs();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SaveAs()
|
|
|
|
|
{
|
|
|
|
|
var file = GetSaveFileFromUser();
|
|
|
|
|
if (file != null)
|
|
|
|
|
{
|
|
|
|
|
using (StreamWriter sw = new StreamWriter(file.FullName))
|
|
|
|
|
{
|
|
|
|
|
string str = "";
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
for (int x = 0; x < Domain.Size / 16; x++)
|
2011-08-07 19:30:01 +00:00
|
|
|
|
{
|
|
|
|
|
for (int y = 0; y < 16; y++)
|
|
|
|
|
{
|
2011-08-22 02:48:12 +00:00
|
|
|
|
str += String.Format("{0:X2} ", Domain.PeekByte((x * 16) + y));
|
2011-08-07 19:30:01 +00:00
|
|
|
|
}
|
|
|
|
|
str += "\r\n";
|
|
|
|
|
}
|
2011-06-26 00:06:50 +00:00
|
|
|
|
|
2011-08-07 19:30:01 +00:00
|
|
|
|
sw.WriteLine(str);
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-06-26 00:06:50 +00:00
|
|
|
|
}
|
2011-08-07 19:30:01 +00:00
|
|
|
|
|
|
|
|
|
private FileInfo GetSaveFileFromUser()
|
|
|
|
|
{
|
|
|
|
|
var sfd = new SaveFileDialog();
|
2011-08-24 02:48:52 +00:00
|
|
|
|
|
2011-08-07 19:30:01 +00:00
|
|
|
|
if (!(Global.Emulator is NullEmulator))
|
2011-09-10 13:51:26 +00:00
|
|
|
|
sfd.FileName = PathManager.FilesystemSafeName(Global.Game);
|
2011-08-07 19:30:01 +00:00
|
|
|
|
else
|
|
|
|
|
sfd.FileName = "MemoryDump";
|
|
|
|
|
|
2011-08-24 02:48:52 +00:00
|
|
|
|
|
|
|
|
|
sfd.InitialDirectory = PathManager.GetPlatformBase(Global.Emulator.SystemId);
|
|
|
|
|
|
2011-08-07 19:30:01 +00:00
|
|
|
|
sfd.Filter = "Text (*.txt)|*.txt|All Files|*.*";
|
|
|
|
|
sfd.RestoreDirectory = true;
|
|
|
|
|
Global.Sound.StopSound();
|
|
|
|
|
var result = sfd.ShowDialog();
|
|
|
|
|
Global.Sound.StartSound();
|
|
|
|
|
if (result != DialogResult.OK)
|
|
|
|
|
return null;
|
|
|
|
|
var file = new FileInfo(sfd.FileName);
|
|
|
|
|
return file;
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-22 02:48:12 +00:00
|
|
|
|
public void ResetScrollBar()
|
|
|
|
|
{
|
|
|
|
|
vScrollBar1.Value = 0;
|
|
|
|
|
SetUpScrollBar();
|
|
|
|
|
Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetUpScrollBar()
|
|
|
|
|
{
|
2011-08-23 22:44:23 +00:00
|
|
|
|
RowsVisible = ((MemoryViewerBox.Height - (fontHeight * 2) - (fontHeight / 2)) / fontHeight);
|
2011-08-22 02:48:12 +00:00
|
|
|
|
int totalRows = Domain.Size / 16;
|
|
|
|
|
int MaxRows = (totalRows - RowsVisible) + 16;
|
|
|
|
|
|
|
|
|
|
if (MaxRows > 0)
|
|
|
|
|
{
|
|
|
|
|
vScrollBar1.Visible = true;
|
|
|
|
|
if (vScrollBar1.Value > MaxRows)
|
|
|
|
|
vScrollBar1.Value = MaxRows;
|
|
|
|
|
vScrollBar1.Maximum = MaxRows;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
vScrollBar1.Visible = false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
this.SetUpScrollBar();
|
|
|
|
|
UpdateValues();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SetAddressOver(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
//Scroll value determines the first row
|
|
|
|
|
int row = vScrollBar1.Value;
|
2011-08-24 02:48:52 +00:00
|
|
|
|
int rowoffset = ((y - 16) / fontHeight);
|
2011-08-23 22:22:24 +00:00
|
|
|
|
row += rowoffset;
|
2011-08-24 02:31:45 +00:00
|
|
|
|
int colWidth = 0;
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-08-24 02:31:45 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
colWidth = 3;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
colWidth = 5;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
colWidth = 9;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
int column = (x - 43) / (fontWidth * colWidth);
|
2011-08-22 02:48:12 +00:00
|
|
|
|
|
2011-08-25 00:55:46 +00:00
|
|
|
|
if (row >= 0 && row <= maxRow && column >= 0 && column < (16 / Global.Config.HexEditorDataSize))
|
2011-08-22 02:48:12 +00:00
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
addressOver = row * 16 + (column * Global.Config.HexEditorDataSize);
|
2011-08-27 14:49:13 +00:00
|
|
|
|
info = String.Format(NumDigitsStr, addressOver);
|
2011-08-22 02:48:12 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
addressOver = -1;
|
|
|
|
|
info = "";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void HexEditor_ResizeEnd(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
SetUpScrollBar();
|
|
|
|
|
}
|
2011-08-23 01:43:19 +00:00
|
|
|
|
|
|
|
|
|
private void AddressesLabel_MouseMove(object sender, MouseEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
SetAddressOver(e.X, e.Y);
|
|
|
|
|
Pointedx = e.X;
|
|
|
|
|
Pointedy = e.Y;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddressesLabel_MouseClick(object sender, MouseEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
SetAddressOver(e.X, e.Y);
|
|
|
|
|
if (addressOver == addressHighlighted && addressOver >= 0)
|
|
|
|
|
{
|
2011-08-25 23:58:16 +00:00
|
|
|
|
ClearHighlighted();
|
2011-08-23 01:43:19 +00:00
|
|
|
|
}
|
2011-08-25 23:58:16 +00:00
|
|
|
|
else if (addressOver >= 0)
|
|
|
|
|
SetHighlighted(addressOver);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ClearHighlighted()
|
|
|
|
|
{
|
|
|
|
|
addressHighlighted = -1;
|
|
|
|
|
UpdateFormText();
|
|
|
|
|
MemoryViewerBox.Refresh();
|
2011-08-23 01:43:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-23 22:22:24 +00:00
|
|
|
|
private Point GetAddressCoordinates(int address)
|
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-08-24 02:31:45 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
return new Point(((address % 16) * (fontWidth * 3)) + 50 + addrOffset, (((address / 16) - vScrollBar1.Value) * fontHeight) + 30);
|
|
|
|
|
case 2:
|
2011-08-25 00:55:46 +00:00
|
|
|
|
return new Point((((address % 16) / Global.Config.HexEditorDataSize) * (fontWidth * 5)) + 50 + addrOffset, (((address / 16) - vScrollBar1.Value) * fontHeight) + 30);
|
2011-08-24 02:31:45 +00:00
|
|
|
|
case 4:
|
2011-08-25 00:55:46 +00:00
|
|
|
|
return new Point((((address % 16) / Global.Config.HexEditorDataSize) * (fontWidth * 9)) + 50 + addrOffset, (((address / 16) - vScrollBar1.Value) * fontHeight) + 30);
|
2011-08-24 02:31:45 +00:00
|
|
|
|
}
|
2011-08-23 22:22:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-08-23 01:43:19 +00:00
|
|
|
|
private void MemoryViewerBox_Paint(object sender, PaintEventArgs e)
|
|
|
|
|
{
|
2011-08-25 02:08:05 +00:00
|
|
|
|
for (int x = 0; x < Global.CheatList.Count; x++)
|
|
|
|
|
{
|
|
|
|
|
if (IsVisible(Global.CheatList.cheatList[x].address))
|
|
|
|
|
{
|
2011-09-17 16:39:43 +00:00
|
|
|
|
if (Domain.ToString() == Global.CheatList.cheatList[x].domain.ToString())
|
|
|
|
|
{
|
|
|
|
|
Rectangle rect = new Rectangle(GetAddressCoordinates(Global.CheatList.cheatList[x].address), new Size(15 * Global.Config.HexEditorDataSize, fontHeight));
|
|
|
|
|
e.Graphics.DrawRectangle(new Pen(Brushes.Black), rect);
|
|
|
|
|
e.Graphics.FillRectangle(Brushes.LightBlue, rect);
|
|
|
|
|
}
|
2011-08-25 02:08:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-08-23 01:43:19 +00:00
|
|
|
|
if (addressHighlighted >= 0 && IsVisible(addressHighlighted))
|
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
Rectangle rect = new Rectangle(GetAddressCoordinates(addressHighlighted), new Size(15 * Global.Config.HexEditorDataSize, fontHeight));
|
2011-08-24 02:31:45 +00:00
|
|
|
|
e.Graphics.DrawRectangle(new Pen(Brushes.Black), rect);
|
2011-08-25 02:08:05 +00:00
|
|
|
|
if (Global.CheatList.IsActiveCheat(Domain, addressHighlighted))
|
|
|
|
|
e.Graphics.FillRectangle(Brushes.Violet, rect);
|
|
|
|
|
else
|
|
|
|
|
e.Graphics.FillRectangle(Brushes.Pink, rect);
|
2011-08-23 01:43:19 +00:00
|
|
|
|
}
|
2011-08-25 02:23:12 +00:00
|
|
|
|
if (HasNibbles())
|
|
|
|
|
{
|
|
|
|
|
e.Graphics.DrawString(MakeNibbles(), new Font("Courier New", 8, FontStyle.Italic), Brushes.Black, new Point(8,8));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool HasNibbles()
|
|
|
|
|
{
|
|
|
|
|
for (int x = 0; x < (Global.Config.HexEditorDataSize * 2); x++)
|
|
|
|
|
{
|
|
|
|
|
if (nibbles[x] != 'G')
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string MakeNibbles()
|
|
|
|
|
{
|
|
|
|
|
string str = "";
|
|
|
|
|
for (int x = 0; x < (Global.Config.HexEditorDataSize * 2); x++)
|
|
|
|
|
{
|
|
|
|
|
if (nibbles[x] != 'G')
|
|
|
|
|
str += nibbles[x];
|
|
|
|
|
else
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return str;
|
2011-08-23 01:43:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void AddressesLabel_MouseLeave(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Pointedx = 0;
|
|
|
|
|
Pointedy = 0;
|
2011-08-24 02:31:45 +00:00
|
|
|
|
addressOver = -1;
|
2011-08-23 01:43:19 +00:00
|
|
|
|
MemoryViewerBox.Refresh();
|
|
|
|
|
}
|
2011-08-23 22:22:24 +00:00
|
|
|
|
|
|
|
|
|
private void HexEditor_KeyDown(object sender, KeyEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
switch (e.KeyCode)
|
|
|
|
|
{
|
|
|
|
|
case Keys.Up:
|
|
|
|
|
GoToAddress(addressHighlighted - 16);
|
|
|
|
|
break;
|
|
|
|
|
case Keys.Down:
|
|
|
|
|
GoToAddress(addressHighlighted + 16);
|
|
|
|
|
break;
|
|
|
|
|
case Keys.Left:
|
2011-08-25 00:55:46 +00:00
|
|
|
|
GoToAddress(addressHighlighted - (1 * Global.Config.HexEditorDataSize));
|
2011-08-23 22:22:24 +00:00
|
|
|
|
break;
|
|
|
|
|
case Keys.Right:
|
2011-08-25 00:55:46 +00:00
|
|
|
|
GoToAddress(addressHighlighted + (1 * Global.Config.HexEditorDataSize));
|
2011-08-23 22:22:24 +00:00
|
|
|
|
break;
|
|
|
|
|
case Keys.PageUp:
|
|
|
|
|
GoToAddress(addressHighlighted - (RowsVisible * 16));
|
|
|
|
|
break;
|
|
|
|
|
case Keys.PageDown:
|
|
|
|
|
GoToAddress(addressHighlighted + (RowsVisible * 16));
|
|
|
|
|
break;
|
|
|
|
|
case Keys.Tab:
|
|
|
|
|
if (e.Modifiers == Keys.Shift)
|
|
|
|
|
GoToAddress(addressHighlighted - 8);
|
|
|
|
|
else
|
|
|
|
|
GoToAddress(addressHighlighted + 8);
|
|
|
|
|
break;
|
|
|
|
|
case Keys.Home:
|
|
|
|
|
GoToAddress(0);
|
|
|
|
|
break;
|
|
|
|
|
case Keys.End:
|
2011-08-25 00:55:46 +00:00
|
|
|
|
GoToAddress(Domain.Size - (Global.Config.HexEditorDataSize));
|
2011-08-23 22:22:24 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2011-08-24 02:31:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void HexEditor_KeyUp(object sender, KeyEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (!InputValidate.IsValidHexNumber(((char)e.KeyCode).ToString()))
|
|
|
|
|
{
|
|
|
|
|
if (e.Control && e.KeyCode == Keys.G)
|
|
|
|
|
GoToSpecifiedAddress();
|
2011-09-13 00:35:40 +00:00
|
|
|
|
if (e.Control && e.KeyCode == Keys.P)
|
|
|
|
|
PokeAddress();
|
2011-08-24 02:31:45 +00:00
|
|
|
|
e.Handled = true;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2011-08-25 00:55:46 +00:00
|
|
|
|
switch (Global.Config.HexEditorDataSize)
|
2011-08-24 02:48:52 +00:00
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 1:
|
|
|
|
|
if (nibbles[0] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[0] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[0].ToString();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
string temp = nibbles[0].ToString() + ((char)e.KeyCode).ToString();
|
|
|
|
|
byte x = byte.Parse(temp, NumberStyles.HexNumber);
|
|
|
|
|
Domain.PokeByte(addressHighlighted, x);
|
|
|
|
|
ClearNibbles();
|
|
|
|
|
SetHighlighted(addressHighlighted + 1);
|
|
|
|
|
UpdateValues();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
if (nibbles[0] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[0] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[0].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[1] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[1] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[1].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[2] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[2] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[2].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[3] == 'G')
|
|
|
|
|
{
|
|
|
|
|
string temp = nibbles[0].ToString() + nibbles[1].ToString();
|
|
|
|
|
byte x1 = byte.Parse(temp, NumberStyles.HexNumber);
|
|
|
|
|
|
|
|
|
|
string temp2 = nibbles[2].ToString() + ((char)e.KeyCode).ToString();
|
|
|
|
|
byte x2 = byte.Parse(temp2, NumberStyles.HexNumber);
|
|
|
|
|
|
|
|
|
|
PokeWord(addressHighlighted, x1, x2);
|
|
|
|
|
ClearNibbles();
|
2011-08-25 02:23:12 +00:00
|
|
|
|
SetHighlighted(addressHighlighted + 2);
|
2011-08-24 02:48:52 +00:00
|
|
|
|
UpdateValues();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
2011-08-25 01:49:22 +00:00
|
|
|
|
if (nibbles[0] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[0] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[0].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[1] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[1] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[1].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[2] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[2] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[2].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[3] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[3] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[3].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[4] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[4] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[4].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[5] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[5] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[5].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[6] == 'G')
|
|
|
|
|
{
|
|
|
|
|
nibbles[6] = (char)e.KeyCode;
|
|
|
|
|
info = nibbles[6].ToString();
|
|
|
|
|
}
|
|
|
|
|
else if (nibbles[7] == 'G')
|
|
|
|
|
{
|
|
|
|
|
string temp = nibbles[0].ToString() + nibbles[1].ToString();
|
|
|
|
|
byte x1 = byte.Parse(temp, NumberStyles.HexNumber);
|
|
|
|
|
|
|
|
|
|
string temp2 = nibbles[2].ToString() + nibbles[3].ToString();
|
|
|
|
|
byte x2 = byte.Parse(temp2, NumberStyles.HexNumber);
|
2011-08-24 02:48:52 +00:00
|
|
|
|
|
2011-08-25 01:49:22 +00:00
|
|
|
|
string temp3 = nibbles[4].ToString() + nibbles[5].ToString();
|
|
|
|
|
byte x3 = byte.Parse(temp3, NumberStyles.HexNumber);
|
|
|
|
|
|
|
|
|
|
string temp4 = nibbles[6].ToString() + ((char)e.KeyCode).ToString();
|
|
|
|
|
byte x4 = byte.Parse(temp4, NumberStyles.HexNumber);
|
|
|
|
|
|
|
|
|
|
PokeWord(addressHighlighted, x1, x2);
|
|
|
|
|
PokeWord(addressHighlighted + 2, x3, x4);
|
|
|
|
|
ClearNibbles();
|
|
|
|
|
SetHighlighted(addressHighlighted + 4);
|
|
|
|
|
UpdateValues();
|
|
|
|
|
}
|
2011-08-24 02:48:52 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2011-08-25 02:23:12 +00:00
|
|
|
|
MemoryViewerBox.Refresh();
|
2011-08-24 02:48:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PokeWord(int addr, byte _1, byte _2)
|
|
|
|
|
{
|
2011-08-25 00:55:46 +00:00
|
|
|
|
if (Global.Config.HexEditorBigEndian)
|
2011-08-24 02:31:45 +00:00
|
|
|
|
{
|
2011-08-24 02:48:52 +00:00
|
|
|
|
Domain.PokeByte(addr, _2);
|
|
|
|
|
Domain.PokeByte(addr + 1, _1);
|
2011-08-24 02:31:45 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2011-08-24 02:48:52 +00:00
|
|
|
|
Domain.PokeByte(addr, _1);
|
|
|
|
|
Domain.PokeByte(addr + 1, _2);
|
2011-08-24 02:31:45 +00:00
|
|
|
|
}
|
2011-08-23 22:22:24 +00:00
|
|
|
|
}
|
2011-08-25 01:49:22 +00:00
|
|
|
|
|
|
|
|
|
private void RemoveAllCheats()
|
|
|
|
|
{
|
|
|
|
|
Global.MainForm.Cheats1.RemoveAllCheats();
|
|
|
|
|
MemoryViewerBox.Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void unfreezeAllToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
RemoveAllCheats();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void unfreezeAllToolStripMenuItem1_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
RemoveAllCheats();
|
|
|
|
|
}
|
2011-08-26 00:20:42 +00:00
|
|
|
|
|
|
|
|
|
private void HexEditor_MouseWheel(object sender, MouseEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (e.Delta > 0)
|
|
|
|
|
{
|
|
|
|
|
if (vScrollBar1.Value > vScrollBar1.Minimum)
|
|
|
|
|
{
|
|
|
|
|
vScrollBar1.Value--;
|
|
|
|
|
MemoryViewerBox.Refresh();
|
|
|
|
|
UpdateValues();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (e.Delta < 0)
|
|
|
|
|
{
|
|
|
|
|
if (vScrollBar1.Value < vScrollBar1.Maximum)
|
|
|
|
|
{
|
|
|
|
|
vScrollBar1.Value++;
|
|
|
|
|
MemoryViewerBox.Refresh();
|
|
|
|
|
UpdateValues();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2011-06-19 23:39:25 +00:00
|
|
|
|
}
|
2011-03-06 15:03:17 +00:00
|
|
|
|
}
|