From 8d8e6364504b612398c1d63a3b70ad513509a6f1 Mon Sep 17 00:00:00 2001 From: goyuken Date: Sun, 14 Oct 2012 15:10:33 +0000 Subject: [PATCH] libgambatte: add memory read\write callbacks, maybe? not sure how to test it... --- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 33 ++++++++++++++++++ .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 24 ++++++++++++- .../output/dll/libgambatte.dll | Bin 171520 -> 177152 bytes libgambatte/include/gambatte.h | 3 ++ libgambatte/src/cinterface.cpp | 12 +++++++ libgambatte/src/cinterface.h | 4 +++ libgambatte/src/cpu.h | 8 +++++ libgambatte/src/gambatte.cpp | 8 +++++ libgambatte/src/memory.cpp | 2 ++ libgambatte/src/memory.h | 14 ++++++++ 10 files changed, 107 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs index bd54048eab..18d7edf42c 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -138,6 +138,8 @@ namespace BizHawk.Emulation.Consoles.GB if (Controller["Power"]) LibGambatte.gambatte_reset(GambatteState); + RefreshMemoryCallbacks(); + LibGambatte.gambatte_runfor(GambatteState, VideoBuffer, 160, soundbuff, ref nsamp); // upload any modified data to the memory domains @@ -221,6 +223,8 @@ namespace BizHawk.Emulation.Consoles.GB public bool DeterministicEmulation { get { return true; } } + #region saveram + public byte[] ReadSaveRam() { int length = LibGambatte.gambatte_savesavedatalength(GambatteState); @@ -271,6 +275,8 @@ namespace BizHawk.Emulation.Consoles.GB set { } } + #endregion + public void ResetFrameCounter() { // is this right? @@ -368,6 +374,33 @@ namespace BizHawk.Emulation.Consoles.GB #endregion + #region memorycallback + + LibGambatte.MemoryCallback readcb; + LibGambatte.MemoryCallback writecb; + + void RefreshMemoryCallbacks() + { + var mcs = CoreInputComm.MemoryCallbackSystem; + + // we RefreshMemoryCallbacks() after the triggers in case the trigger turns itself off at that point + + if (mcs.HasRead) + readcb = delegate(uint addr) { mcs.TriggerRead((int)addr); RefreshMemoryCallbacks(); }; + else + readcb = null; + if (mcs.HasWrite) + writecb = delegate(uint addr) { mcs.TriggerWrite((int)addr); RefreshMemoryCallbacks(); }; + else + writecb = null; + + LibGambatte.gambatte_setreadcallback(GambatteState, readcb); + LibGambatte.gambatte_setwritecallback(GambatteState, writecb); + } + + + + #endregion public CoreInputComm CoreInputComm { get; set; } diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs index 4cade884cd..948998da5b 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -78,7 +78,6 @@ namespace BizHawk.Emulation.Consoles.GB [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_reset(IntPtr core); - /// /// palette type for gambatte_setdmgpalettecolor /// @@ -130,6 +129,29 @@ namespace BizHawk.Emulation.Consoles.GB [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setinputgetter(IntPtr core, InputGetter getinput); + /// + /// type of the read\write memory callbacks + /// + /// the address which the cpu is read\writing + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void MemoryCallback(uint address); + + /// + /// set a callback to occur immediately BEFORE EVERY cpu read + /// + /// opaque state pointer + /// null to clear + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_setreadcallback(IntPtr core, MemoryCallback callback); + + /// + /// set a callback to occur immediately AFTER EVERY cpu write + /// + /// opaque state pointer + /// null to clear + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_setwritecallback(IntPtr core, MemoryCallback callback); + /// /// Sets the directory used for storing save data. The default is the same directory as the ROM Image file. /// diff --git a/BizHawk.MultiClient/output/dll/libgambatte.dll b/BizHawk.MultiClient/output/dll/libgambatte.dll index 259a8937a135459fa555cf061e653ca02f4f503c..a7a81490b3e5436e1ecb46af08d0a8e416c880c0 100644 GIT binary patch delta 67866 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 scGRG~%setInputGetter(cig); } +__declspec(dllexport) void gambatte_setreadcallback(void *core, void (*callback)(unsigned)) +{ + GB *g = (GB *) core; + g->setReadCallback(callback); +} + +__declspec(dllexport) void gambatte_setwritecallback(void *core, void (*callback)(unsigned)) +{ + GB *g = (GB *) core; + g->setWriteCallback(callback); +} + __declspec(dllexport) void gambatte_setsavedir(void *core, const char *sdir) { GB *g = (GB *) core; diff --git a/libgambatte/src/cinterface.h b/libgambatte/src/cinterface.h index 55748318ff..30278421ab 100644 --- a/libgambatte/src/cinterface.h +++ b/libgambatte/src/cinterface.h @@ -18,6 +18,10 @@ extern "C" __declspec(dllexport) void gambatte_setinputgetter(void *core, unsigned (*getinput)(void)); + __declspec(dllexport) void gambatte_setreadcallback(void *core, void (*callback)(unsigned)); + + __declspec(dllexport) void gambatte_setwritecallback(void *core, void (*callback)(unsigned)); + __declspec(dllexport) void gambatte_setsavedir(void *core, const char *sdir); __declspec(dllexport) int gambatte_iscgb(void *core); diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 98cfd41da6..e56dafd9d1 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -64,6 +64,14 @@ public: void setInputGetter(InputGetter *getInput) { memory.setInputGetter(getInput); } + + void setReadCallback(void (*callback)(unsigned)) { + memory.setReadCallback(callback); + } + + void setWriteCallback(void (*callback)(unsigned)) { + memory.setWriteCallback(callback); + } void setSaveDir(const std::string &sdir) { memory.setSaveDir(sdir); diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index d445489ac0..52b64a32c6 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -95,6 +95,14 @@ void GB::setInputGetter(InputGetter *getInput) { p_->cpu.setInputGetter(getInput); } +void GB::setReadCallback(void (*callback)(unsigned)) { + p_->cpu.setReadCallback(callback); +} + +void GB::setWriteCallback(void (*callback)(unsigned)) { + p_->cpu.setWriteCallback(callback); +} + void GB::setSaveDir(const std::string &sdir) { p_->cpu.setSaveDir(sdir); } diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 46358dd88e..72e99c495b 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -27,6 +27,8 @@ namespace gambatte { Memory::Memory(const Interrupter &interrupter_in) : getInput(0), + readCallback(0), + writeCallback(0), divLastUpdate(0), lastOamDmaUpdate(DISABLED_TIME), display(ioamhram, 0, VideoInterruptRequester(&intreq)), diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 38617d894c..536a25f53f 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -33,6 +33,9 @@ class Memory { Cartridge cart; unsigned char ioamhram[0x200]; + void (*readCallback)(unsigned); + void (*writeCallback)(unsigned); + InputGetter *getInput; unsigned long divLastUpdate; unsigned long lastOamDmaUpdate; @@ -111,6 +114,8 @@ public: } unsigned read(const unsigned P, const unsigned long cycleCounter) { + if (readCallback) + readCallback(P); return cart.rmem(P >> 12) ? cart.rmem(P >> 12)[P] : nontrivial_read(P, cycleCounter); } @@ -119,6 +124,8 @@ public: cart.wmem(P >> 12)[P] = data; } else nontrivial_write(P, data, cycleCounter); + if (writeCallback) + writeCallback(P); } void ff_write(const unsigned P, const unsigned data, const unsigned long cycleCounter) { @@ -138,6 +145,13 @@ public: this->getInput = getInput; } + void setReadCallback(void (*callback)(unsigned)) { + this->readCallback = callback; + } + void setWriteCallback(void (*callback)(unsigned)) { + this->writeCallback = callback; + } + void setEndtime(unsigned long cc, unsigned long inc); void setSoundBuffer(uint_least32_t *const buf) { sound.setBuffer(buf); }