consistently check if callbacks exist before calling memory callbacks, across all cores

This commit is contained in:
adelikat 2020-04-21 16:42:57 -05:00
parent 1060bbc155
commit 325551ecd0
19 changed files with 217 additions and 90 deletions

View File

@ -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");

View File

@ -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");

View File

@ -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;
}

View File

@ -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)

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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()

View File

@ -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)
{

View File

@ -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()

View File

@ -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;

View File

@ -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()

View File

@ -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)

View File

@ -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");
}
}
/// <summary>

View File

@ -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.

View File

@ -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

View File

@ -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");
}
}
/// <summary>

View File

@ -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;
}

View File

@ -909,6 +909,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
flags |= MemoryCallbackFlags.AccessExecute;
break;
}
MemoryCallbacks.CallMemoryCallbacks(address, value, (uint)flags, "System Bus");
}

View File

@ -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()
{