From 758a84027e3f7fb36812e28802483572817c9494 Mon Sep 17 00:00:00 2001 From: goyuken Date: Wed, 13 Nov 2013 17:08:52 +0000 Subject: [PATCH] gb: memory callbacks no longer fire on writes to the system bus. (they were already not firing for all other memory domain action). add a new memory callback, exec. occurs right before the cpu reads a byte, if that byte will be the first byte of a new opcode. read callback no longer occurs in this situation. --- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 6 ++++++ .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 10 +++++++++- libgambatte/include/gambatte.h | 1 + libgambatte/src/cinterface.cpp | 6 ++++++ libgambatte/src/cinterface.h | 2 ++ libgambatte/src/cpu.cpp | 2 +- libgambatte/src/cpu.h | 6 +++++- libgambatte/src/gambatte.cpp | 4 ++++ libgambatte/src/memory.cpp | 1 + libgambatte/src/memory.h | 17 +++++++++++++++++ output/dll/libgambatte.dll | Bin 177152 -> 177152 bytes 11 files changed, 52 insertions(+), 3 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs index c9f685ede4..302a8c8d35 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -488,6 +488,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy LibGambatte.MemoryCallback readcb; LibGambatte.MemoryCallback writecb; + LibGambatte.MemoryCallback execcb; void RefreshMemoryCallbacks() { @@ -503,9 +504,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy writecb = delegate(uint addr) { mcs.CallWrite(addr); RefreshMemoryCallbacks(); }; else writecb = null; + if (mcs.HasExecutes) + execcb = delegate(uint addr) { mcs.CallExecute(addr); RefreshMemoryCallbacks(); }; + else + execcb = null; LibGambatte.gambatte_setreadcallback(GambatteState, readcb); LibGambatte.gambatte_setwritecallback(GambatteState, writecb); + LibGambatte.gambatte_setexeccallback(GambatteState, execcb); } diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs index caba667895..00db1c7687 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -146,7 +146,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy public delegate void MemoryCallback(uint address); /// - /// set a callback to occur immediately BEFORE EVERY cpu read + /// set a callback to occur immediately BEFORE EVERY cpu read, except for opcode first byte fetches /// /// opaque state pointer /// null to clear @@ -161,6 +161,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setwritecallback(IntPtr core, MemoryCallback callback); + /// + /// set a callback to occur immediately BEFORE EVERY cpu opcode (first byte) fetch + /// + /// opaque state pointer + /// null to clear + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_setexeccallback(IntPtr core, MemoryCallback callback); + /// /// type of the cpu trace callback /// diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index bd1f533fe7..542ce48291 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -88,6 +88,7 @@ public: void setReadCallback(void (*callback)(unsigned)); void setWriteCallback(void (*callback)(unsigned)); + void setExecCallback(void (*callback)(unsigned)); void setTraceCallback(void (*callback)(void *)); void setScanlineCallback(void (*callback)(), int sl); void setRTCCallback(std::time_t (*callback)()); diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index cbe7c855d8..d73e727450 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -83,6 +83,12 @@ __declspec(dllexport) void gambatte_setwritecallback(void *core, void (*callback g->setWriteCallback(callback); } +__declspec(dllexport) void gambatte_setexeccallback(void *core, void (*callback)(unsigned)) +{ + GB *g = (GB *) core; + g->setExecCallback(callback); +} + __declspec(dllexport) void gambatte_settracecallback(void *core, void (*callback)(void *)) { GB *g = (GB *) core; diff --git a/libgambatte/src/cinterface.h b/libgambatte/src/cinterface.h index 8a81d658e5..8389dc0c81 100644 --- a/libgambatte/src/cinterface.h +++ b/libgambatte/src/cinterface.h @@ -24,6 +24,8 @@ extern "C" __declspec(dllexport) void gambatte_setwritecallback(void *core, void (*callback)(unsigned)); + __declspec(dllexport) void gambatte_setexeccallback(void *core, void (*callback)(unsigned)); + __declspec(dllexport) void gambatte_settracecallback(void *core, void (*callback)(void *)); __declspec(dllexport) void gambatte_setscanlinecallback(void *core, void (*callback)(), int sl); diff --git a/libgambatte/src/cpu.cpp b/libgambatte/src/cpu.cpp index 1755228700..711319b7bb 100644 --- a/libgambatte/src/cpu.cpp +++ b/libgambatte/src/cpu.cpp @@ -131,7 +131,7 @@ void CPU::loadState(const SaveState &state) { #define READ(dest, addr) do { (dest) = memory.read(addr, cycleCounter); cycleCounter += 4; } while (0) // #define PC_READ(dest, addr) do { (dest) = memory.pc_read(addr, cycleCounter); cycleCounter += 4; } while (0) -#define PC_READ(dest) do { (dest) = memory.read(PC, cycleCounter); PC = (PC + 1) & 0xFFFF; cycleCounter += 4; } while (0) +#define PC_READ(dest) do { (dest) = memory.read_excb(PC, cycleCounter); PC = (PC + 1) & 0xFFFF; cycleCounter += 4; } while (0) #define FF_READ(dest, addr) do { (dest) = memory.ff_read(addr, cycleCounter); cycleCounter += 4; } while (0) #define WRITE(addr, data) do { memory.write(addr, data, cycleCounter); cycleCounter += 4; } while (0) diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 2bd7ca2e2e..82ffe599c4 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -75,6 +75,10 @@ public: memory.setWriteCallback(callback); } + void setExecCallback(void (*callback)(unsigned)) { + memory.setExecCallback(callback); + } + void setTraceCallback(void (*callback)(void *)) { tracecallback = callback; } @@ -124,7 +128,7 @@ public: //unsigned char ExternalRead(unsigned short addr) { return memory.read(addr, cycleCounter_); } unsigned char ExternalRead(unsigned short addr) { return memory.peek(addr); } - void ExternalWrite(unsigned short addr, unsigned char val) { memory.write(addr, val, cycleCounter_); } + void ExternalWrite(unsigned short addr, unsigned char val) { memory.write_nocb(addr, val, cycleCounter_); } int LinkStatus(int which) { return memory.LinkStatus(which); } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index bca5e65140..b855f4a62e 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -103,6 +103,10 @@ void GB::setWriteCallback(void (*callback)(unsigned)) { p_->cpu.setWriteCallback(callback); } +void GB::setExecCallback(void (*callback)(unsigned)) { + p_->cpu.setExecCallback(callback); +} + void GB::setTraceCallback(void (*callback)(void *)) { p_->cpu.setTraceCallback(callback); } diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 4b0364c894..66b4c6c5a2 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -29,6 +29,7 @@ Memory::Memory(const Interrupter &interrupter_in) : getInput(0), readCallback(0), writeCallback(0), + execCallback(0), divLastUpdate(0), lastOamDmaUpdate(DISABLED_TIME), display(ioamhram, 0, VideoInterruptRequester(&intreq)), diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 037eb524b8..e0ec5d210e 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -35,6 +35,7 @@ class Memory { void (*readCallback)(unsigned); void (*writeCallback)(unsigned); + void (*execCallback)(unsigned); InputGetter *getInput; unsigned long divLastUpdate; @@ -125,10 +126,23 @@ public: return cart.rmem(P >> 12) ? cart.rmem(P >> 12)[P] : nontrivial_read(P, cycleCounter); } + unsigned read_excb(const unsigned P, const unsigned long cycleCounter) { + if (execCallback) + execCallback(P); + return cart.rmem(P >> 12) ? cart.rmem(P >> 12)[P] : nontrivial_read(P, cycleCounter); + } + unsigned peek(const unsigned P) { return cart.rmem(P >> 12) ? cart.rmem(P >> 12)[P] : nontrivial_peek(P); } + void write_nocb(const unsigned P, const unsigned data, const unsigned long cycleCounter) { + if (cart.wmem(P >> 12)) { + cart.wmem(P >> 12)[P] = data; + } else + nontrivial_write(P, data, cycleCounter); + } + void write(const unsigned P, const unsigned data, const unsigned long cycleCounter) { if (cart.wmem(P >> 12)) { cart.wmem(P >> 12)[P] = data; @@ -161,6 +175,9 @@ public: void setWriteCallback(void (*callback)(unsigned)) { this->writeCallback = callback; } + void setExecCallback(void (*callback)(unsigned)) { + this->execCallback = callback; + } void setScanlineCallback(void (*callback)(), int sl) { display.setScanlineCallback(callback, sl); diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 0e03875488e899e3d073047933553e09787fa3af..6f8eb165f792df389e94f76c509987de3c86c010 100644 GIT binary patch delta 23488 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 Z=hHXM>&zdTzreP#&s^H(Beo{&{{g)i^-BN%