From 325551ecd0ee90ae29d957b7fade18560e4d3ea1 Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 21 Apr 2020 16:42:57 -0500 Subject: [PATCH] consistently check if callbacks exist before calling memory callbacks, across all cores --- .../CPUs/CP1610/CP1610.Execute.cs | 2 +- BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs | 4 +- .../Computers/AppleII/AppleII.cs | 21 +++++-- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 7 ++- .../Consoles/Atari/A7800Hawk/MemoryMap.cs | 15 +++-- .../Consoles/GCE/Vectrex/MemoryMap.cs | 14 +++-- .../Consoles/GCE/Vectrex/VectrexHawk.cs | 8 ++- .../Consoles/Magnavox/Odyssey2/MemoryMap.cs | 14 +++-- .../Consoles/Magnavox/Odyssey2/O2Hawk.cs | 8 ++- .../Consoles/Nintendo/GBA/VBANext.cs | 21 +++++-- .../Consoles/Nintendo/GBHawk/GBHawk.cs | 8 ++- .../Consoles/Nintendo/GBHawk/MemoryMap.cs | 16 +++-- .../Nintendo/Gameboy/Gambatte.IDebuggable.cs | 24 ++++++-- .../Consoles/Nintendo/NES/NES.Core.cs | 21 +++++-- .../Consoles/Nintendo/SNES/LibsnesCore.cs | 60 ++++++++++++------- .../Consoles/Sega/SMS/SMS.cs | 21 +++++-- .../Consoles/Sega/gpgx64/GPGX.IDebuggable.cs | 21 +++++-- .../Consoles/Sony/PSX/Octoshock.cs | 1 + .../Consoles/WonderSwan/WonderSwan.cs | 21 +++++-- 19 files changed, 217 insertions(+), 90 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs index 949c406206..aea67e8e05 100644 --- a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs @@ -183,7 +183,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 TraceCallback?.Invoke(CP1610State()); - if (MemoryCallbacks != null) + if (MemoryCallbacks != null && MemoryCallbacks.HasExecutes) { uint flags = (uint)(MemoryCallbackFlags.AccessExecute); MemoryCallbacks.CallMemoryCallbacks(RegisterPC, 0, flags, "System Bus"); diff --git a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs index 6fd6a59642..415069591d 100644 --- a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs +++ b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs @@ -34,7 +34,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 public ushort ReadMemoryWrapper(ushort addr, bool peek) { - if (MemoryCallbacks != null && !peek) + if (MemoryCallbacks != null && MemoryCallbacks.HasReads && !peek) { uint flags = (uint)(MemoryCallbackFlags.AccessRead); MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); @@ -45,7 +45,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 public void WriteMemoryWrapper(ushort addr, ushort value, bool poke) { - if (MemoryCallbacks != null && !poke) + if (MemoryCallbacks != null && MemoryCallbacks.HasWrites && !poke) { uint flags = (uint)(MemoryCallbackFlags.AccessWrite); MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); diff --git a/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.cs b/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.cs index 40837b6ea4..2d645ba698 100644 --- a/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.cs +++ b/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.cs @@ -205,18 +205,27 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII { _machine.Memory.ReadCallback = (addr) => { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } }; _machine.Memory.WriteCallback = (addr) => { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } }; _machine.Memory.ExecuteCallback = (addr) => { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } }; _machine.Memory.InputCallback = InputCallbacks.Call; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index 5de7ae5d77..6d626654dc 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -288,8 +288,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk private void ExecFetch(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)(MemoryCallbackFlags.AccessExecute); + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } private void Reset_Mapper(string m) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs index a28e1b3939..203503d9cf 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs @@ -18,8 +18,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { public byte ReadMemory(ushort addr) { - uint flags = (uint)(Common.MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)Common.MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } + if ((addr & 0xFCE0) == 0) { @@ -103,8 +107,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public void WriteMemory(ushort addr, byte value) { - uint flags = (uint)(Common.MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)Common.MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + } if ((addr & 0xFCE0) == 0) { diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs index 371fb53971..301b2dfba3 100644 --- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs @@ -16,8 +16,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex { public byte ReadMemory(ushort addr) { - uint flags = (uint)MemoryCallbackFlags.AccessRead; - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } if (addr < 0x8000) { @@ -51,8 +54,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex public void WriteMemory(ushort addr, byte value) { - uint flags = (uint)MemoryCallbackFlags.AccessWrite; - MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + } if (addr < 0x8000) { diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs index ab1a070417..8b2eb8c562 100644 --- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs @@ -151,10 +151,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex _framebuffer = new int[VirtualWidth * VirtualHeight]; } + // TODO: move this inside the cpu to avoid a non-inlinable function call private void ExecFetch(ushort addr) { - uint flags = (uint)MemoryCallbackFlags.AccessExecute; - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } private void Setup_Mapper() diff --git a/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/MemoryMap.cs index 8ae68f2960..349e2ad4d4 100644 --- a/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/MemoryMap.cs @@ -13,8 +13,11 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk { public byte ReadMemory(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } if (addr < 0x400) { @@ -26,8 +29,11 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk public void WriteMemory(ushort addr, byte value) { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + } if (addr < 0x400) { diff --git a/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/O2Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/O2Hawk.cs index 93ce47c312..ce04d2e7c1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/O2Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/O2Hawk.cs @@ -144,10 +144,14 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk public string BoardName => mapper.GetType().Name; + // TODO: move callbacks to cpu to avoid non-inlinable function call private void ExecFetch(ushort addr) { - uint flags = (uint)MemoryCallbackFlags.AccessRead; - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } private void Setup_Mapper() diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs index 26512fcab0..a2de55bb37 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs @@ -162,18 +162,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA { padcb = new LibVBANext.StandardCallback(() => InputCallbacks.Call()); fetchcb = new LibVBANext.AddressCallback((addr) => { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } }); readcb = new LibVBANext.AddressCallback((addr) => { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } }); writecb = new LibVBANext.AddressCallback((addr) => { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } }); tracecb = new LibVBANext.TraceCallback((addr, opcode) => Tracer.Put(Trace(addr, opcode))); _inputCallbacks.ActiveChanged += SyncPadCallback; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.cs index c4835e2f37..782ac39f9e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/GBHawk.cs @@ -304,10 +304,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk frame_buffer = new int[VirtualWidth * VirtualHeight]; } + // TODO: move callbacks to cpu to avoid having to make a non-inlinable private void ExecFetch(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } private void Setup_Mapper() diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs index eacf4b6ffe..26ee9eebcb 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/MemoryMap.cs @@ -27,8 +27,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk { public byte ReadMemory(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } + addr_access = addr; if (ppu.DMA_start) @@ -149,8 +153,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk public void WriteMemory(ushort addr, byte value) { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + } + addr_access = addr; if (ppu.DMA_start) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IDebuggable.cs index 027daf5830..9dd9bec100 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IDebuggable.cs @@ -47,22 +47,34 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy private void ReadCallback(uint address, ulong cycleOffset) { callbackCycleCount = _cycleCount + cycleOffset; - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(address, 0, flags, "System Bus"); + + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(address, 0, flags, "System Bus"); + } } private void WriteCallback(uint address, ulong cycleOffset) { callbackCycleCount = _cycleCount + cycleOffset; - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(address, 0, flags,"System Bus"); + + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(address, 0, flags,"System Bus"); + } } private void ExecCallback(uint address, ulong cycleOffset) { callbackCycleCount = _cycleCount + cycleOffset; - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(address, 0, flags, "System Bus"); + + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(address, 0, flags, "System Bus"); + } } /// diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index c9b88f8182..6fe62fd8b0 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -888,8 +888,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public void ExecFetch(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.CPUZero | MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)(MemoryCallbackFlags.CPUZero | MemoryCallbackFlags.AccessExecute); + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } public byte ReadMemory(ushort addr) @@ -939,8 +942,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } } - uint flags = (uint)(MemoryCallbackFlags.CPUZero | MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, ret, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)(MemoryCallbackFlags.CPUZero | MemoryCallbackFlags.AccessRead); + MemoryCallbacks.CallMemoryCallbacks(addr, ret, flags, "System Bus"); + } DB = ret; return ret; @@ -987,8 +993,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES Board.WritePrg(addr - 0x8000, value); } - uint flags = (uint)(MemoryCallbackFlags.CPUZero | MemoryCallbackFlags.AccessWrite | MemoryCallbackFlags.SizeByte); - MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)(MemoryCallbackFlags.CPUZero | MemoryCallbackFlags.AccessWrite | MemoryCallbackFlags.SizeByte); + MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + } } // the palette for each VS game needs to be chosen explicitly since there are 6 different ones. diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs index c4d6dc5267..7c47b0783e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs @@ -372,47 +372,65 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES private void ReadHook(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); - // we RefreshMemoryCallbacks() after the trigger in case the trigger turns itself off at that point - // EDIT: for now, theres some IPC re-entrancy problem - // RefreshMemoryCallbacks(); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + // we RefreshMemoryCallbacks() after the trigger in case the trigger turns itself off at that point + // EDIT: for now, theres some IPC re-entrancy problem + // RefreshMemoryCallbacks(); + } } private void ExecHook(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); - // we RefreshMemoryCallbacks() after the trigger in case the trigger turns itself off at that point - // EDIT: for now, theres some IPC re-entrancy problem - // RefreshMemoryCallbacks(); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + // we RefreshMemoryCallbacks() after the trigger in case the trigger turns itself off at that point + // EDIT: for now, theres some IPC re-entrancy problem + // RefreshMemoryCallbacks(); + } } private void WriteHook(uint addr, byte val) { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, val, flags, "System Bus"); - // we RefreshMemoryCallbacks() after the trigger in case the trigger turns itself off at that point - // EDIT: for now, theres some IPC re-entrancy problem - // RefreshMemoryCallbacks(); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, val, flags, "System Bus"); + // we RefreshMemoryCallbacks() after the trigger in case the trigger turns itself off at that point + // EDIT: for now, theres some IPC re-entrancy problem + // RefreshMemoryCallbacks(); + } } private void ReadHook_SMP(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "SMP"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "SMP"); + } } private void ExecHook_SMP(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "SMP"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "SMP"); + } } private void WriteHook_SMP(uint addr, byte val) { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, val, flags, "SMP"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, val, flags, "SMP"); + } } private enum LoadParamType diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index 383169efd8..35795c25b1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -296,8 +296,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem public byte ReadMemory(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } return ReadMemoryMapper(addr); } @@ -306,8 +309,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem { WriteMemoryMapper(addr, value); - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); + } } public byte FetchMemory(ushort addr) @@ -317,8 +323,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem private void OnExecMemory(ushort addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } /// diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IDebuggable.cs index 00ab8b4dea..23c35591ee 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IDebuggable.cs @@ -57,18 +57,27 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx { ExecCallback = new LibGPGX.mem_cb(a => { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(a, 0, flags, "M68K BUS"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(a, 0, flags, "M68K BUS"); + } }); ReadCallback = new LibGPGX.mem_cb(a => { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(a, 0, flags, "M68K BUS"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(a, 0, flags, "M68K BUS"); + } }); WriteCallback = new LibGPGX.mem_cb(a => { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(a, 0, flags, "M68K BUS"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(a, 0, flags, "M68K BUS"); + } }); _memoryCallbacks.ActiveChanged += RefreshMemCallbacks; } diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs index 43b92879f9..7f4f0b3f63 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs @@ -909,6 +909,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX flags |= MemoryCallbackFlags.AccessExecute; break; } + MemoryCallbacks.CallMemoryCallbacks(address, value, (uint)flags, "System Bus"); } diff --git a/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs b/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs index 1fc495f916..f30d37b66e 100644 --- a/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs +++ b/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs @@ -139,18 +139,27 @@ namespace BizHawk.Emulation.Cores.WonderSwan void ReadCallback(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessRead); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasReads) + { + uint flags = (uint)MemoryCallbackFlags.AccessRead; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } void WriteCallback(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessWrite); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasWrites) + { + uint flags = (uint)MemoryCallbackFlags.AccessWrite; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } void ExecCallback(uint addr) { - uint flags = (uint)(MemoryCallbackFlags.AccessExecute); - MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + if (MemoryCallbacks.HasExecutes) + { + uint flags = (uint)MemoryCallbackFlags.AccessExecute; + MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); + } } void ButtonCallback() {