void Custom_WatchMemory(Request request, string id, string address, string length) { _session.VSCode.Ack(request); var watch = new MemWatch() { ID = id, Address = Convert.Parse(address), Length = Convert.Parse(length) }; _memWatches[id] = watch; Check_MemoryWatch(watch); }
void Check_MemoryWatch(MemWatch watch) { var bytes = new byte[watch.Length]; _session.Machine.Memory.Read(watch.Address, bytes); bool changed = false; if (watch.Data == null) { changed = true; } else { for (int i = 0; i < bytes.Length; i++) { if (watch.Data[i] != bytes[i]) { changed = true; break; } } } if (!changed) { return; } var s = new StringBuilder(); if (watch.Data != null) { s.Append(watch.Address.ToHex()); s.Append(": "); bool inChange = false; for (int i = 0; i < bytes.Length; i++) { var prechanged = i > 0 && bytes[i - 1] != watch.Data[i - 1]; var thischanged = bytes[i] != watch.Data[i]; var postchanged = i < bytes.Length - 1 && bytes[i + 1] != watch.Data[i + 1]; if (!prechanged && thischanged) { s.Append("<"); } else if (!prechanged && !thischanged) { s.Append(" "); } s.Append($"{bytes[i]:X2}"); if (thischanged && postchanged) { s.Append("-"); } else if (thischanged && !postchanged) { s.Append(">"); } } s.Append("\n"); } else { s.Append(watch.Address.ToHex()); s.Append(": "); s.Append(Convert.ToHex(bytes, " ")); s.Append("\n"); } watch.Data = bytes; _session.VSCode.Send( new Event("memoryWatchUpdated", new { id = watch.ID, data = s.ToString() }) ); }