diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs index d745e14c73..79e3629ebe 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -339,8 +339,10 @@ namespace BizHawk.Emulation.Consoles.GB if (!LibGambatte.gambatte_getmemoryarea(GambatteState, which, ref data, ref length)) throw new Exception("gambatte_getmemoryarea() failed!"); - if (data == IntPtr.Zero || length <= 0) + // if length == 0, it's an empty block; (usually rambank on some carts); that's ok + if (data == IntPtr.Zero && length > 0) throw new Exception("bad return from gambatte_getmemoryarea()"); + MemoryRefreshers[i] = new MemoryRefresher(data, length); @@ -349,17 +351,18 @@ namespace BizHawk.Emulation.Consoles.GB void InitMemoryDomains() { - MemoryDomains = new MemoryDomain[4]; - MemoryRefreshers = new MemoryRefresher[4]; + MemoryDomains = new MemoryDomain[6]; + MemoryRefreshers = new MemoryRefresher[6]; - CreateMemoryDomain(LibGambatte.MemoryAreas.rambank); + CreateMemoryDomain(LibGambatte.MemoryAreas.cartram); CreateMemoryDomain(LibGambatte.MemoryAreas.rom); CreateMemoryDomain(LibGambatte.MemoryAreas.vram); CreateMemoryDomain(LibGambatte.MemoryAreas.wram); + CreateMemoryDomain(LibGambatte.MemoryAreas.oam); + CreateMemoryDomain(LibGambatte.MemoryAreas.hram); // fixme: other code brokenly assumes that MainMemory is MemoryDomains[0] // (here, we'd want it to be MemoryDomains[2]) - var tmp = MemoryDomains[2]; MemoryDomains[2] = MemoryDomains[0]; MemoryDomains[0] = tmp; diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs index 1112696397..4c6f525a5e 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -276,7 +276,9 @@ namespace BizHawk.Emulation.Consoles.GB vram = 0, rom = 1, wram = 2, - rambank = 3, + cartram = 3, + oam = 4, + hram = 5 } /// diff --git a/BizHawk.MultiClient/output/libgambatte.dll b/BizHawk.MultiClient/output/libgambatte.dll index 5712394eb3..d604749bd2 100644 Binary files a/BizHawk.MultiClient/output/libgambatte.dll and b/BizHawk.MultiClient/output/libgambatte.dll differ diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index 5ffbf24349..12807e8ee6 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -97,7 +97,7 @@ public: int saveSavedataLength(); void saveSavedata(char *dest); - // 0 = vram, 1 = rom, 2 = wram, 3 = rambank + // 0 = vram, 1 = rom, 2 = wram, 3 = cartram, 4 = oam, 5 = hram bool getMemoryArea(int which, unsigned char **data, int *length); /** Saves emulator state to the state slot selected with selectState(). diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index d463b38c00..fd4e440721 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -694,8 +694,7 @@ void Cartridge::saveSavedata(char *dest) { } } -bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length) -{ +bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length) { if (!data || !length) return false; @@ -717,6 +716,7 @@ bool Cartridge::getMemoryArea(int which, unsigned char **data, int *length) *data = memptrs.rambankdata(); *length = memptrs.rambankdataend() - memptrs.rambankdata(); return true; + default: return false; } diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index ed3899c519..46358dd88e 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -1003,4 +1003,24 @@ void Memory::setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned lon display.setDmgPaletteColor(palNum, colorNum, rgb32); } +bool Memory::getMemoryArea(int which, unsigned char **data, int *length) { + if (!data || !length) + return false; + + switch (which) + { + case 4: // oam + *data = &ioamhram[0]; + *length = 160; + return true; + case 5: // hram + *data = &ioamhram[384]; + *length = 127; + return true; + default: // pass to cartridge + return cart.getMemoryArea(which, data, length); + } +} + + } diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 83b93aa1b0..38617d894c 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -83,7 +83,7 @@ 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); } + bool getMemoryArea(int which, unsigned char **data, int *length); // { return cart.getMemoryArea(which, data, length); } void setOsdElement(std::auto_ptr osdElement) { display.setOsdElement(osdElement);