using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Mesen.GUI.Debugger { class WatchManager { public static event EventHandler WatchChanged; private static List _watchEntries = new List(); private static List _previousValues = new List(); private static Regex _arrayWatchRegex = new Regex(@"\[((\$[0-9A-Fa-f]+)|(\d+)|([@_a-zA-Z0-9]+))\s*,\s*(\d+)\]", RegexOptions.Compiled); public static List WatchEntries { get { return _watchEntries; } set { _watchEntries = new List(value); WatchChanged?.Invoke(null, EventArgs.Empty); } } public static List GetWatchContent(bool useHex) { var list = new List(); for(int i = 0; i < _watchEntries.Count; i++) { string expression = _watchEntries[i].Trim(); string newValue = ""; EvalResultType resultType; bool forceHasChanged = false; Match match = _arrayWatchRegex.Match(expression); if(match.Success) { //Watch expression matches the array display syntax (e.g: [$300,10] = display 10 bytes starting from $300) newValue = ProcessArrayDisplaySyntax(useHex, ref forceHasChanged, match); } else { Int32 result = InteropEmu.DebugEvaluateExpression(expression, out resultType, true); switch(resultType) { case EvalResultType.Numeric: //When using {$00} syntax to show the value of a word, always display 4 hex characters. bool displayAsWord = expression.StartsWith("{") && expression.EndsWith("}"); newValue = useHex ? ("$" + result.ToString(displayAsWord ? "X4" : "X2")) : result.ToString(); break; case EvalResultType.Boolean: newValue = result == 0 ? "false" : "true"; break; case EvalResultType.Invalid: newValue = ""; forceHasChanged = true; break; case EvalResultType.DivideBy0: newValue = ""; forceHasChanged = true; break; case EvalResultType.OutOfScope: newValue = "