diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAMemoryCallbackSystem.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAMemoryCallbackSystem.cs index 482a480ae2..a4e57ec538 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAMemoryCallbackSystem.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAMemoryCallbackSystem.cs @@ -67,26 +67,29 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA _callbacks.Add(container); } + private void Remove(CallbackContainer cb) + { + if (MGBAHawk.ZZHacky.BizClearWatchpoint(_mgba.Core, cb.ID)) _callbacks.Remove(cb); + } + public void Remove(MemoryCallbackDelegate action) { var cbToRemove = _callbacks.SingleOrDefault(container => container.Callback.Callback == action); + if (cbToRemove == null) return; - if (cbToRemove != null) + if (cbToRemove.Callback.Type is MemoryCallbackType.Execute) { - if (cbToRemove.Callback.Type == MemoryCallbackType.Execute) + _callbacks.Remove(cbToRemove); + if (!_callbacks.Any(cb => cb.Callback.Type is MemoryCallbackType.Execute)) { - _callbacks.Remove(cbToRemove); - if (_callbacks.All(cb => cb.Callback.Type != MemoryCallbackType.Execute)) - { - _executeCallback = null; - MGBAHawk.ZZHacky.BizSetExecCallback(_mgba.Core, null); - } - } - else if (MGBAHawk.ZZHacky.BizClearWatchpoint(_mgba.Core, cbToRemove.ID)) - { - _callbacks.Remove(cbToRemove); + _executeCallback = null; + MGBAHawk.ZZHacky.BizSetExecCallback(_mgba.Core, null); } } + else + { + Remove(cbToRemove); + } } public void RemoveAll(IEnumerable actions) @@ -99,17 +102,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA public void Clear() { - foreach (var cb in _callbacks) - { - if (MGBAHawk.ZZHacky.BizClearWatchpoint(_mgba.Core, cb.ID)) - { - _callbacks.Remove(cb); - } - } + foreach (var cb in _callbacks) Remove(cb); } public IEnumerator GetEnumerator() => _callbacks.Select(c => c.Callback).GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() => _callbacks.Select(c => c.Callback).GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); public void CallMemoryCallbacks(uint addr, uint value, uint flags, string scope) {