diff --git a/BizHawk.MultiClient/tools/Watch/RamSearch.cs b/BizHawk.MultiClient/tools/Watch/RamSearch.cs index 197d0cf861..1c9f6705f6 100644 --- a/BizHawk.MultiClient/tools/Watch/RamSearch.cs +++ b/BizHawk.MultiClient/tools/Watch/RamSearch.cs @@ -64,6 +64,8 @@ namespace BizHawk.MultiClient TopMost = Global.Config.RamSearchAlwaysOnTop; SetReboot(false); + + } private void RamSearch_Load(object sender, EventArgs e) @@ -72,6 +74,7 @@ namespace BizHawk.MultiClient SpecificValueBox.ByteSize = Settings.Size; SpecificValueBox.Type = Settings.Type; MessageLabel.Text = String.Empty; + SpecificAddressBox.MaxLength = IntHelpers.GetNumDigits(Global.Emulator.MainMemory.Size); NewSearch(); } @@ -336,6 +339,7 @@ namespace BizHawk.MultiClient Settings.Domain = Global.Emulator.MemoryDomains[pos]; SetDomainLabel(); SetReboot(true); + SpecificAddressBox.MaxLength = IntHelpers.GetNumDigits(Settings.Domain.Size); } } @@ -431,6 +435,10 @@ namespace BizHawk.MultiClient private void DoDisplayTypeClick(Watch.DisplayType type) { + if (Settings.Type != type && !String.IsNullOrEmpty(SpecificValueBox.Text)) + { + SpecificValueBox.Text = "0"; + } SpecificValueBox.Type = Settings.Type = type; Searches.SetType(type); } @@ -444,6 +452,16 @@ namespace BizHawk.MultiClient private void SetSize(Watch.WatchSize size) { SpecificValueBox.ByteSize = Settings.Size = size; + if (!String.IsNullOrEmpty(SpecificAddressBox.Text)) + { + SpecificAddressBox.Text = "0"; + } + + if (!String.IsNullOrEmpty(SpecificValueBox.Text)) + { + SpecificValueBox.Text = "0"; + } + SetReboot(true); } diff --git a/BizHawk.MultiClient/tools/Watch/WatchValueBox.cs b/BizHawk.MultiClient/tools/Watch/WatchValueBox.cs index de93ce4674..02a00ad9c4 100644 --- a/BizHawk.MultiClient/tools/Watch/WatchValueBox.cs +++ b/BizHawk.MultiClient/tools/Watch/WatchValueBox.cs @@ -97,10 +97,14 @@ namespace BizHawk.MultiClient break; } break; - case Watch.DisplayType.Float: case Watch.DisplayType.FixedPoint_12_4: + MaxLength = 9; + break; + case Watch.DisplayType.Float: + MaxLength = 21; + break; case Watch.DisplayType.FixedPoint_20_12: - MaxLength = 32; + MaxLength = 64; break; } } @@ -177,37 +181,187 @@ namespace BizHawk.MultiClient { if (e.KeyCode == Keys.Up) { - int val = ToRawInt(); - val++; - switch (_type) { default: + case Watch.DisplayType.Signed: + int val = ToRawInt(); + if (val == MaxSignedInt) + { + val = 0; + } + else + { + val++; + } Text = val.ToString(); break; + case Watch.DisplayType.Unsigned: + uint uval = (uint)ToRawInt(); + if (uval == MaxUnsignedInt) + { + uval = 0; + } + else + { + uval++; + } + Text = uval.ToString(); + break; case Watch.DisplayType.Binary: - throw new NotImplementedException(); + uint bval = (uint)ToRawInt(); + if (bval == MaxUnsignedInt) + { + bval = 0; + } + else + { + bval++; + } + int numBits = ((int)ByteSize) * 8; + Text = Convert.ToString(bval, 2).PadLeft(numBits, '0'); + break; case Watch.DisplayType.Hex: + uint hexVal = (uint)ToRawInt(); + if (hexVal == MaxUnsignedInt) + { + hexVal = 0; + } + else + { + hexVal++; + } string formatstr = "{0:X" + MaxLength.ToString() + "}"; - Text = String.Format(formatstr, val); + Text = String.Format(formatstr, hexVal); + break; + case Watch.DisplayType.FixedPoint_12_4: + double f12val = double.Parse(Text); + if (f12val > Max12_4 - _12_4_Unit) + { + f12val = 0; + } + else + { + f12val += _12_4_Unit; + } + Text = f12val.ToString(); + break; + case Watch.DisplayType.FixedPoint_20_12: + double f24val = double.Parse(Text); + if (f24val >= Max20_12 - _20_12_Unit) + { + f24val = 0; + } + else + { + f24val += _20_12_Unit; + } + Text = f24val.ToString(); + break; + case Watch.DisplayType.Float: + double dval = double.Parse(Text); + if (dval > double.MaxValue - 1) + { + dval = 0; + } + else + { + dval++; + } + Text = dval.ToString(); break; } } else if (e.KeyCode == Keys.Down) { - int val = ToRawInt(); - val--; - switch (_type) { default: + case Watch.DisplayType.Signed: + int val = ToRawInt(); + if (val == 0) + { + val = MaxSignedInt; + } + else + { + val--; + } Text = val.ToString(); break; + case Watch.DisplayType.Unsigned: + uint uval = (uint)ToRawInt(); + if (uval == 0) + { + uval = MaxUnsignedInt; + } + else + { + uval--; + } + Text = uval.ToString(); + break; case Watch.DisplayType.Binary: - throw new NotImplementedException(); + uint bval = (uint)ToRawInt(); + if (bval == 0) + { + bval = MaxUnsignedInt; + } + else + { + bval--; + } + int numBits = ((int)ByteSize) * 8; + Text = Convert.ToString(bval, 2).PadLeft(numBits, '0'); + break; case Watch.DisplayType.Hex: + uint hexVal = (uint)ToRawInt(); + if (hexVal == 0) + { + hexVal = MaxUnsignedInt; + } + else + { + hexVal++; + } string formatstr = "{0:X" + MaxLength.ToString() + "}"; - Text = String.Format(formatstr, val); + Text = String.Format(formatstr, hexVal); + break; + case Watch.DisplayType.FixedPoint_12_4: + double f12val = double.Parse(Text); + if (f12val < 0 + _12_4_Unit) + { + f12val = Max12_4; + } + else + { + f12val -= _12_4_Unit; + } + Text = f12val.ToString(); + break; + case Watch.DisplayType.FixedPoint_20_12: + double f24val = double.Parse(Text); + if (f24val < 0 + _20_12_Unit) + { + f24val = Max20_12; + } + else + { + f24val -= _20_12_Unit; + } + Text = f24val.ToString(); + break; + case Watch.DisplayType.Float: + double dval = double.Parse(Text); + if (dval > double.MaxValue - 1) + { + dval = 0; + } + else + { + dval--; + } + Text = dval.ToString(); break; } } @@ -217,6 +371,60 @@ namespace BizHawk.MultiClient } } + uint MaxUnsignedInt + { + get + { + switch (ByteSize) + { + default: + case Watch.WatchSize.Byte: + return byte.MaxValue; + case Watch.WatchSize.Word: + return ushort.MaxValue; + case Watch.WatchSize.DWord: + return uint.MaxValue; + } + } + } + + int MaxSignedInt + { + get + { + switch (ByteSize) + { + default: + case Watch.WatchSize.Byte: + return sbyte.MaxValue; + case Watch.WatchSize.Word: + return short.MaxValue; + case Watch.WatchSize.DWord: + return int.MaxValue; + } + } + } + + double Max12_4 + { + get + { + return MaxUnsignedInt / 16.0; + } + } + + double Max20_12 + { + get + { + return MaxUnsignedInt / 4096.0; + } + } + + double _12_4_Unit { get { return 1 / 16.0; } } + double _20_12_Unit { get { return 1 / 4096.0; } } + + protected override void OnTextChanged(EventArgs e) { if (String.IsNullOrWhiteSpace(Text)) diff --git a/BizHawk.Util/HexTextBox.cs b/BizHawk.Util/HexTextBox.cs index 7ed0a7dc07..c769a4baf8 100644 --- a/BizHawk.Util/HexTextBox.cs +++ b/BizHawk.Util/HexTextBox.cs @@ -34,8 +34,16 @@ namespace BizHawk { if (InputValidate.IsValidHexNumber(Text)) { - int val = ToRawInt(); - val++; + uint val = (uint)ToRawInt(); + + if (val == IntHelpers.MaxHexValueFromMaxDigits(MaxLength)) + { + val = 0; + } + else + { + val++; + } string formatstr = "{0:X" + MaxLength.ToString() + "}"; Text = String.Format(formatstr, val); } @@ -44,8 +52,16 @@ namespace BizHawk { if (InputValidate.IsValidHexNumber(Text)) { - int val = ToRawInt(); - val--; + uint val = (uint)ToRawInt(); + if (val == 0) + { + val = IntHelpers.MaxHexValueFromMaxDigits(MaxLength); + } + else + { + val--; + } + string formatstr = "{0:X" + MaxLength.ToString() + "}"; Text = String.Format(formatstr, val); } @@ -102,8 +118,15 @@ namespace BizHawk { if (InputValidate.IsValidUnsignedNumber(Text)) { - int val = ToRawInt(); - val++; + uint val = (uint)ToRawInt(); + if (val == uint.MaxValue) + { + val = 0; + } + else + { + val++; + } Text = val.ToString(); } } @@ -111,8 +134,17 @@ namespace BizHawk { if (InputValidate.IsValidUnsignedNumber(Text)) { - int val = ToRawInt(); - val--; + uint val = (uint)ToRawInt(); + + if (val == 0) + { + val = uint.MaxValue; + } + else + { + val--; + } + Text = val.ToString(); } } @@ -138,7 +170,7 @@ namespace BizHawk } else { - return int.Parse(Text); + return (int)uint.Parse(Text); } } } diff --git a/BizHawk.Util/StringHelpers.cs b/BizHawk.Util/StringHelpers.cs index 481f487d5d..e03bd26601 100644 --- a/BizHawk.Util/StringHelpers.cs +++ b/BizHawk.Util/StringHelpers.cs @@ -42,5 +42,32 @@ namespace BizHawk if (i < 0x1000000) return 6; else return 8; } + + public static uint MaxHexValueFromMaxDigits(Int32 i) + { + switch (i) + { + case 0: + return 0; + case 1: + return 0xF; + case 2: + return 0xFF; + case 3: + return 0xFFF; + case 4: + return 0xFFFF; + case 5: + return 0xFFFFF; + case 6: + return 0xFFFFFF; + case 7: + return 0xFFFFFFF; + case 8: + return 0xFFFFFFFF; + } + + return int.MaxValue; + } } }