diff --git a/BizHawk.MultiClient/tools/HexEditor.Designer.cs b/BizHawk.MultiClient/tools/HexEditor.Designer.cs
index 14bd8f8f79..08f6aeaab3 100644
--- a/BizHawk.MultiClient/tools/HexEditor.Designer.cs
+++ b/BizHawk.MultiClient/tools/HexEditor.Designer.cs
@@ -35,6 +35,10 @@
this.dumpToFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.findToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.memoryDomainsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.dataSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -47,7 +51,6 @@
this.addToRamWatchToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.freezeAddressToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.unfreezeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.findToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.autoloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveWindowsSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -65,6 +68,7 @@
this.MemoryViewerBox = new System.Windows.Forms.GroupBox();
this.vScrollBar1 = new System.Windows.Forms.VScrollBar();
this.AddressesLabel = new System.Windows.Forms.Label();
+ this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.menuStrip1.SuspendLayout();
this.ViewerContextMenuStrip.SuspendLayout();
this.MemoryViewerBox.SuspendLayout();
@@ -74,6 +78,7 @@
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
+ this.editToolStripMenuItem,
this.optionsToolStripMenuItem,
this.settingsToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
@@ -113,6 +118,41 @@
this.exitToolStripMenuItem.Text = "E&xit";
this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
+ // editToolStripMenuItem
+ //
+ this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.copyToolStripMenuItem,
+ this.pasteToolStripMenuItem,
+ this.toolStripSeparator6,
+ this.findToolStripMenuItem1});
+ this.editToolStripMenuItem.Name = "editToolStripMenuItem";
+ this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
+ this.editToolStripMenuItem.Text = "&Edit";
+ //
+ // copyToolStripMenuItem
+ //
+ this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";
+ this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
+ this.copyToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.copyToolStripMenuItem.Text = "&Copy";
+ this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click);
+ //
+ // pasteToolStripMenuItem
+ //
+ this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem";
+ this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));
+ this.pasteToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.pasteToolStripMenuItem.Text = "&Paste";
+ this.pasteToolStripMenuItem.Click += new System.EventHandler(this.pasteToolStripMenuItem_Click);
+ //
+ // findToolStripMenuItem1
+ //
+ this.findToolStripMenuItem1.Name = "findToolStripMenuItem1";
+ this.findToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
+ this.findToolStripMenuItem1.Size = new System.Drawing.Size(152, 22);
+ this.findToolStripMenuItem1.Text = "&Find...";
+ this.findToolStripMenuItem1.Click += new System.EventHandler(this.findToolStripMenuItem1_Click);
+ //
// optionsToolStripMenuItem
//
this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -121,7 +161,6 @@
this.enToolStripMenuItem,
this.toolStripSeparator2,
this.goToAddressToolStripMenuItem,
- this.findToolStripMenuItem,
this.addToRamWatchToolStripMenuItem1,
this.freezeAddressToolStripMenuItem,
this.unfreezeAllToolStripMenuItem});
@@ -215,14 +254,6 @@
this.unfreezeAllToolStripMenuItem.Text = "Unfreeze All";
this.unfreezeAllToolStripMenuItem.Click += new System.EventHandler(this.unfreezeAllToolStripMenuItem_Click);
//
- // findToolStripMenuItem
- //
- this.findToolStripMenuItem.Name = "findToolStripMenuItem";
- this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
- this.findToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
- this.findToolStripMenuItem.Text = "&Find...";
- this.findToolStripMenuItem.Click += new System.EventHandler(this.findToolStripMenuItem_Click);
- //
// settingsToolStripMenuItem
//
this.settingsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -380,6 +411,11 @@
this.AddressesLabel.MouseLeave += new System.EventHandler(this.AddressesLabel_MouseLeave);
this.AddressesLabel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.AddressesLabel_MouseMove);
//
+ // toolStripSeparator6
+ //
+ this.toolStripSeparator6.Name = "toolStripSeparator6";
+ this.toolStripSeparator6.Size = new System.Drawing.Size(149, 6);
+ //
// HexEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -444,6 +480,10 @@
private System.Windows.Forms.ToolStripMenuItem decrementToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem gotoAddressToolStripMenuItem1;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
- private System.Windows.Forms.ToolStripMenuItem findToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem findToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
}
}
\ No newline at end of file
diff --git a/BizHawk.MultiClient/tools/HexEditor.cs b/BizHawk.MultiClient/tools/HexEditor.cs
index 83969c3048..28f873773d 100644
--- a/BizHawk.MultiClient/tools/HexEditor.cs
+++ b/BizHawk.MultiClient/tools/HexEditor.cs
@@ -44,7 +44,8 @@ namespace BizHawk.MultiClient
const int fontWidth = 7; //Width of 1 digits
bool loaded = false;
- // Configurations
+
+ // Configurations
bool AutoLoad;
bool SaveWindowPosition;
int Wndx = -1;
@@ -1037,6 +1038,11 @@ namespace BizHawk.MultiClient
return;
}
+ if (e.Control || e.Shift || e.Alt) //If user is pressing one of these, don't type into the hex editor
+ {
+ return;
+ }
+
switch (DataSize)
{
default:
@@ -1279,7 +1285,19 @@ namespace BizHawk.MultiClient
GoToSpecifiedAddress();
}
- private void findToolStripMenuItem_Click(object sender, EventArgs e)
+ private string GetHighlightedValue()
+ {
+ if (addressHighlighted != -1)
+ {
+ return String.Format(DigitFormatString, (int)MakeValue(addressHighlighted)).Trim();
+ }
+ else
+ {
+ return "";
+ }
+ }
+
+ private void Find()
{
InputPrompt prompt = new InputPrompt();
prompt.SetMessage("Enter a set of hex values to search for");
@@ -1287,13 +1305,11 @@ namespace BizHawk.MultiClient
prompt.HexOnly = true;
if (addressHighlighted > 0)
{
- string initial = String.Format(DigitFormatString, (int)MakeValue(addressHighlighted));
- initial = initial.Trim();
- prompt.SetInitialValue(initial);
+ prompt.SetInitialValue(GetHighlightedValue());
}
prompt.ShowDialog();
-
+
if (prompt.UserOK)
{
int found = 0;
@@ -1303,7 +1319,7 @@ namespace BizHawk.MultiClient
return;
int numByte = search.Length / 2;
-
+
int startByte = 0;
if (addressHighlighted == -1)
{
@@ -1336,7 +1352,7 @@ namespace BizHawk.MultiClient
if (found > 0)
{
GoToAddress(found);
-
+
}
else
{
@@ -1344,5 +1360,46 @@ namespace BizHawk.MultiClient
}
}
}
+
+ private void copyToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ string value = GetHighlightedValue();
+ if (!String.IsNullOrWhiteSpace(value))
+ {
+ Clipboard.SetDataObject(value);
+ }
+ }
+
+ private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ IDataObject iData = Clipboard.GetDataObject();
+
+ if (iData.GetDataPresent(DataFormats.Text))
+ {
+ string clipboardRaw = (String)iData.GetData(DataFormats.Text);
+ string hex = InputValidate.DoHexString(clipboardRaw);
+
+ int numBytes = hex.Length / 2;
+ for (int i = 0; i < numBytes; i++)
+ {
+ int value = int.Parse(hex.Substring(i * 2, 2), NumberStyles.HexNumber);
+ int address = addressHighlighted + i;
+ Domain.PokeByte(address, (byte)value);
+ }
+ UpdateValues();
+
+ }
+ else
+ {
+ //Do nothing
+ }
+ }
+
+ private void findToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ Find();
+ }
+
+
}
}
diff --git a/BizHawk.Util/InputValidate.cs b/BizHawk.Util/InputValidate.cs
index 8c02ae82b0..0c25faff98 100644
--- a/BizHawk.Util/InputValidate.cs
+++ b/BizHawk.Util/InputValidate.cs
@@ -5,127 +5,150 @@ using System.Text;
namespace BizHawk
{
- ///
- /// Includes helper functions to validate user input
- ///
- public static class InputValidate
- {
- public static bool IsValidUnsignedNumber(string Str)
- {
- char[] input = (Str.ToCharArray());
- ASCIIEncoding AE = new ASCIIEncoding();
- // Check each character in the new label to determine if it is a number.
- for (int x = 0; x < input.Length; x++)
- {
- // Encode the character from the character array to its ASCII code.
- byte[] bc = AE.GetBytes(input[x].ToString());
+ ///
+ /// Includes helper functions to validate user input
+ ///
+ public static class InputValidate
+ {
+ public static bool IsValidUnsignedNumber(string Str)
+ {
+ char[] input = (Str.ToCharArray());
+ ASCIIEncoding AE = new ASCIIEncoding();
+ // Check each character in the new label to determine if it is a number.
+ for (int x = 0; x < input.Length; x++)
+ {
+ // Encode the character from the character array to its ASCII code.
+ byte[] bc = AE.GetBytes(input[x].ToString());
- // Determine if the ASCII code is within the valid range of numerical values.
- if (bc[0] < 47 || bc[0] > 58)
- return false;
- }
- return true;
- }
+ // Determine if the ASCII code is within the valid range of numerical values.
+ if (bc[0] < 47 || bc[0] > 58)
+ return false;
+ }
+ return true;
+ }
- public static bool IsValidUnsignedNumber(char c)
- {
- if (c < 47 || c > 58)
- return false;
+ public static bool IsValidUnsignedNumber(char c)
+ {
+ if (c < 47 || c > 58)
+ return false;
- return true;
- }
+ return true;
+ }
- ///
- /// Validates all chars are 0-9 or a dash as the first value
- ///
- ///
- ///
- public static bool IsValidSignedNumber(string Str)
- {
- char[] input = (Str.ToCharArray());
- ASCIIEncoding AE = new ASCIIEncoding();
- // Check each character in the new label to determine if it is a number.
- for (int x = 0; x < input.Length; x++)
- {
- // Encode the character from the character array to its ASCII code.
- byte[] bc = AE.GetBytes(input[x].ToString());
+ ///
+ /// Validates all chars are 0-9 or a dash as the first value
+ ///
+ ///
+ ///
+ public static bool IsValidSignedNumber(string Str)
+ {
+ char[] input = (Str.ToCharArray());
+ ASCIIEncoding AE = new ASCIIEncoding();
+ // Check each character in the new label to determine if it is a number.
+ for (int x = 0; x < input.Length; x++)
+ {
+ // Encode the character from the character array to its ASCII code.
+ byte[] bc = AE.GetBytes(input[x].ToString());
- // Determine if the ASCII code is within the valid range of numerical values.
- if (bc[0] > 58)
- return false;
+ // Determine if the ASCII code is within the valid range of numerical values.
+ if (bc[0] > 58)
+ return false;
- if (bc[0] < 47)
- {
- if (bc[0] == 45 && x == 0)
- continue;
- else
- return false;
- }
-
- }
- return true;
- }
+ if (bc[0] < 47)
+ {
+ if (bc[0] == 45 && x == 0)
+ continue;
+ else
+ return false;
+ }
- public static bool IsValidSignedNumber(char c)
- {
- if (c == 45) return true;
+ }
+ return true;
+ }
- if (c < 47 || c > 58)
- return false;
+ public static bool IsValidSignedNumber(char c)
+ {
+ if (c == 45) return true;
- return true;
- }
+ if (c < 47 || c > 58)
+ return false;
+
+ return true;
+ }
- ///
- /// validates is a Hex number 0-9, A-F (must be capital letters)
- ///
- ///
- ///
- public static bool IsValidHexNumber(string Str)
- {
- char[] input = (Str.ToCharArray());
- ASCIIEncoding AE = new ASCIIEncoding();
- // Check each character in the new label to determine if it is a number.
- for (int x = 0; x < input.Length; x++)
- {
- // Encode the character from the character array to its ASCII code.
- byte[] bc = AE.GetBytes(input[x].ToString());
+ ///
+ /// validates is a Hex number 0-9, A-F (must be capital letters)
+ ///
+ ///
+ ///
+ public static bool IsValidHexNumber(string Str)
+ {
+ char[] input = (Str.ToCharArray());
+ ASCIIEncoding AE = new ASCIIEncoding();
+ // Check each character in the new label to determine if it is a number.
+ for (int x = 0; x < input.Length; x++)
+ {
+ // Encode the character from the character array to its ASCII code.
+ byte[] bc = AE.GetBytes(input[x].ToString());
- // Determine if the ASCII code is within the valid range of numerical values.
- if (bc[0] < 47) //0
- return false;
- if (bc[0] > 58) //9
- {
- if (bc[0] < 65) //A
- return false;
+ // Determine if the ASCII code is within the valid range of numerical values.
+ if (bc[0] < 47) //0
+ return false;
+ if (bc[0] > 58) //9
+ {
+ if (bc[0] < 65) //A
+ return false;
- if (bc[0] > 70) //F
- {
- if (bc[0] < 97 || bc[0] > 102) //a-f
- return false;
- }
- }
- }
- return true;
- }
+ if (bc[0] > 70) //F
+ {
+ if (bc[0] < 97 || bc[0] > 102) //a-f
+ return false;
+ }
+ }
+ }
+ return true;
+ }
- public static bool IsValidHexNumber(char c)
- {
- if (c < 47) return false; //0
+ public static bool IsValidHexNumber(char c)
+ {
+ if (c < 47) return false; //0
- if (c > 58) //9
- {
- if (c < 65) //A
- return false;
+ if (c > 58) //9
+ {
+ if (c < 65) //A
+ return false;
- if (c > 70) //F
- {
- if (c < 97 || c > 102) //a-f
- return false;
- }
- }
- return true;
- }
- }
+ if (c > 70) //F
+ {
+ if (c < 97 || c > 102) //a-f
+ return false;
+ }
+ }
+ return true;
+ }
+
+ ///
+ /// Takes any string and removes any value that is not a valid hex value (0-9, a-f, A-F), returns the remaining characters in uppercase
+ ///
+ ///
+ ///
+ public static string DoHexString(string raw)
+ {
+ raw = raw.ToUpper();
+ StringBuilder output = new StringBuilder();
+ foreach (char x in raw)
+ {
+ if (x >= 'A' && x <= 'F')
+ {
+ output.Append(x);
+ }
+ else if (x >= '0' && x <= '9')
+ {
+ output.Append(x);
+ }
+ }
+ return output.ToString();
+ }
+ }
}