diff --git a/BizHawk.Emulation.Common/Interfaces/CoreComms.cs b/BizHawk.Emulation.Common/Interfaces/CoreComms.cs index 70c5de1b00..3c29a1ee57 100644 --- a/BizHawk.Emulation.Common/Interfaces/CoreComms.cs +++ b/BizHawk.Emulation.Common/Interfaces/CoreComms.cs @@ -199,6 +199,17 @@ namespace BizHawk.Emulation.Common } } + public void CallExecute(uint addr) + { + for (int i = 0; i < _writes.Count; i++) + { + if (_writeAddrs[i] == addr) + { + _writes[i](); + } + } + } + public bool HasReads { get { return _reads.Any(); } } public bool HasWrites { get { return _writes.Any(); } } diff --git a/BizHawk.Emulation/CPUs/MOS 6502X/Execute.cs b/BizHawk.Emulation/CPUs/MOS 6502X/Execute.cs index eecfa4360f..0bd0893c8d 100644 --- a/BizHawk.Emulation/CPUs/MOS 6502X/Execute.cs +++ b/BizHawk.Emulation/CPUs/MOS 6502X/Execute.cs @@ -590,6 +590,7 @@ namespace BizHawk.Emulation.CPUs.M6502 { if (debug) Console.WriteLine(State()); branch_irq_hack = false; + if (OnExecFetch != null) OnExecFetch(PC); opcode = ReadMemory(PC++); mi = -1; } diff --git a/BizHawk.Emulation/CPUs/MOS 6502X/MOS6502X.cs b/BizHawk.Emulation/CPUs/MOS 6502X/MOS6502X.cs index bfba3f75c3..f04539aeda 100644 --- a/BizHawk.Emulation/CPUs/MOS 6502X/MOS6502X.cs +++ b/BizHawk.Emulation/CPUs/MOS 6502X/MOS6502X.cs @@ -180,6 +180,9 @@ namespace BizHawk.Emulation.CPUs.M6502 public Func PeekMemory; public Action WriteMemory; + //this only calls when the first byte of an instruction is fetched. + public Action OnExecFetch; + public void SetCallbacks ( Func ReadMemory, diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs index c2e7590143..8330d82bed 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs @@ -160,6 +160,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } }; cpu.BCD_Enabled = false; + cpu.OnExecFetch = ExecFetch; ppu = new PPU(this); ram = new byte[0x800]; CIRAM = new byte[0x800]; @@ -512,6 +513,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo //old data bus values from previous reads public byte DB; + public void ExecFetch(ushort addr) + { + CoreComm.MemoryCallbackSystem.CallExecute(addr); + } + public byte ReadMemory(ushort addr) { byte ret;