From ed2b690f752e9a1d52fa2acb27ce8493d5a5790f Mon Sep 17 00:00:00 2001 From: goyuken Date: Tue, 11 Sep 2012 15:28:38 +0000 Subject: [PATCH] add memory domains to gambatte appears to work, but i don't really have much of anything to test on it ramwatch is horribly slow --- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 49 ++++++++++++++++-- .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 21 ++++++++ BizHawk.MultiClient/output/libgambatte.dll | Bin 171520 -> 171520 bytes libgambatte/include/gambatte.h | 3 ++ libgambatte/src/cinterface.cpp | 5 ++ libgambatte/src/cinterface.h | 2 + libgambatte/src/cpu.h | 2 + libgambatte/src/gambatte.cpp | 7 +++ libgambatte/src/mem/cartridge.cpp | 29 +++++++++++ libgambatte/src/mem/cartridge.h | 3 ++ libgambatte/src/memory.h | 2 + 11 files changed, 119 insertions(+), 4 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs index 439cd60c03..98da8619ba 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -45,6 +45,8 @@ namespace BizHawk.Emulation.Consoles.GB InputCallback = new LibGambatte.InputGetter(ControllerCallback); LibGambatte.gambatte_setinputgetter(GambatteState, InputCallback); + + InitMemoryDomains(); } public static readonly ControllerDefinition GbController = new ControllerDefinition @@ -251,16 +253,55 @@ namespace BizHawk.Emulation.Consoles.GB get { return GbOutputComm; } } - public IList MemoryDomains + + MemoryDomain CreateMemoryDomain(LibGambatte.MemoryAreas which) { - get { throw new NotImplementedException(); } + IntPtr data = IntPtr.Zero; + int length = 0; + + if (!LibGambatte.gambatte_getmemoryarea(GambatteState, which, ref data, ref length)) + throw new Exception("gambatte_getmemoryarea() failed!"); + + if (data == IntPtr.Zero || length <= 0) + throw new Exception("bad return from gambatte_getmemoryarea()"); + + Func peeker = delegate(int addr) + { + if (addr >= length || addr < 0) + throw new ArgumentOutOfRangeException(); + byte[] result = new byte[1]; + System.Runtime.InteropServices.Marshal.Copy(data + addr, result, 0, 1); + return result[0]; + }; + + Action poker = delegate(int addr, byte val) + { + if (addr >= length || addr < 0) + throw new ArgumentOutOfRangeException(); + byte[] source = new byte[1]; + source[0] = val; + System.Runtime.InteropServices.Marshal.Copy(source, 0, data + addr, 1); + }; + return new MemoryDomain(which.ToString(), length, Endian.Little, peeker, poker); } - public MemoryDomain MainMemory + void InitMemoryDomains() { - get { throw new NotImplementedException(); } + MemoryDomains = new MemoryDomain[4]; + + MemoryDomains[0] = CreateMemoryDomain(LibGambatte.MemoryAreas.rambank); + MemoryDomains[1] = CreateMemoryDomain(LibGambatte.MemoryAreas.rom); + MemoryDomains[2] = CreateMemoryDomain(LibGambatte.MemoryAreas.vram); + MemoryDomains[3] = CreateMemoryDomain(LibGambatte.MemoryAreas.wram); + + // what is this supposed to be, exactly? + MainMemory = MemoryDomains[1]; } + public IList MemoryDomains { get; private set; } + + public MemoryDomain MainMemory { get; private set; } + public void Dispose() { LibGambatte.gambatte_destroy(GambatteState); diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs index d184ed78f2..1112696397 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -268,5 +268,26 @@ namespace BizHawk.Emulation.Consoles.GB [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setgameshark(IntPtr core, string codes); + /// + /// memory areas that gambatte_getmemoryarea() can return + /// + public enum MemoryAreas : int + { + vram = 0, + rom = 1, + wram = 2, + rambank = 3, + } + + /// + /// get pointer to internal memory areas, for debugging purposes + /// + /// opaque state pointer + /// which memory area to access + /// pointer to the start of the area + /// valid length of the area, in bytes + /// success + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern bool gambatte_getmemoryarea(IntPtr core, MemoryAreas which, ref IntPtr data, ref int length); } } diff --git a/BizHawk.MultiClient/output/libgambatte.dll b/BizHawk.MultiClient/output/libgambatte.dll index 08d529cca3504f81964abd163dec48d005811e0d..5712394eb38bafe0e815d06e72648062cc7aa331 100644 GIT binary patch delta 17196 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 delta 16957 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::string(codes)); } +__declspec(dllexport) int gambatte_getmemoryarea(void *core, int which, unsigned char **data, int *length) +{ + GB *g = (GB *) core; + return g->getMemoryArea(which, data, length); +} diff --git a/libgambatte/src/cinterface.h b/libgambatte/src/cinterface.h index ee2a39a301..0a7ebcffee 100644 --- a/libgambatte/src/cinterface.h +++ b/libgambatte/src/cinterface.h @@ -46,6 +46,8 @@ extern "C" __declspec(dllexport) void gambatte_setgamegenie(void *core, const char *codes); __declspec(dllexport) void gambatte_setgameshark(void *core, const char *codes); + + __declspec(dllexport) int gambatte_getmemoryarea(void *core, int which, unsigned char **data, int *length); } diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index a84fd723cb..87a26dbcd4 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -55,6 +55,8 @@ public: int saveSavedataLength() {return memory.saveSavedataLength(); } void saveSavedata(char *dest) { memory.saveSavedata(dest); } + bool getMemoryArea(int which, unsigned char **data, int *length) { return memory.getMemoryArea(which, data, length); } + void setVideoBuffer(uint_least32_t *const videoBuf, const int pitch) { memory.setVideoBuffer(videoBuf, pitch); } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index a6deec0f80..1688f68128 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -142,6 +142,13 @@ int GB::saveSavedataLength() { return -1; } +bool GB::getMemoryArea(int which, unsigned char **data, int *length) { + if (p_->cpu.loaded()) + return p_->cpu.getMemoryArea(which, data, length); + else + return false; +} + void GB::setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned rgb32) { p_->cpu.setDmgPaletteColor(palNum, colorNum, rgb32); } diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index 0c4bf5c972..d463b38c00 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -694,6 +694,35 @@ void Cartridge::saveSavedata(char *dest) { } } +bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length) +{ + if (!data || !length) + return false; + + switch (which) + { + case 0: + *data = memptrs.vramdata(); + *length = memptrs.vramdataend() - memptrs.vramdata(); + return true; + case 1: + *data = memptrs.romdata(); + *length = memptrs.romdataend() - memptrs.romdata(); + return true; + case 2: + *data = memptrs.wramdata(0); + *length = memptrs.wramdataend() - memptrs.wramdata(0); + return true; + case 3: + *data = memptrs.rambankdata(); + *length = memptrs.rambankdataend() - memptrs.rambankdata(); + return true; + default: + return false; + } + return false; +} + static int asHex(const char c) { return c >= 'A' ? c - 'A' + 0xA : c - '0'; } diff --git a/libgambatte/src/mem/cartridge.h b/libgambatte/src/mem/cartridge.h index ee036f6077..da78a47875 100644 --- a/libgambatte/src/mem/cartridge.h +++ b/libgambatte/src/mem/cartridge.h @@ -87,6 +87,9 @@ public: void saveSavedata(char *dest); const std::string saveBasePath() const; void setSaveDir(const std::string &dir); + + bool getMemoryArea(int which, unsigned char **data, int *length); + int loadROM(const char *romfiledata, unsigned romfilelength, bool forceDmg, bool multicartCompat); const char * romTitle() const { return reinterpret_cast(memptrs.romdata() + 0x134); } void setGameGenie(const std::string &codes); diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 70d9fd6308..83b93aa1b0 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -83,6 +83,8 @@ public: void saveSavedata(char *dest) { cart.saveSavedata(dest); } const std::string saveBasePath() const { return cart.saveBasePath(); } + bool getMemoryArea(int which, unsigned char **data, int *length) { return cart.getMemoryArea(which, data, length); } + void setOsdElement(std::auto_ptr osdElement) { display.setOsdElement(osdElement); }