diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 7158569dd2..774ff55764 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -148,6 +148,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy Util.Hash_SHA1(romdata), Util.Hash_MD5(romdata) ); + { + byte[] buff = new byte[32]; + LibGambatte.gambatte_romtitle(GambatteState, buff); + string romname = System.Text.Encoding.ASCII.GetString(buff); + Console.WriteLine("Core reported rom name: {0}", romname); + } + TimeCallback = new LibGambatte.RTCCallback(GetCurrentTime); LibGambatte.gambatte_setrtccallback(GambatteState, TimeCallback); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs index da18f72a49..5346c852bf 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -316,9 +316,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// ROM header title of currently loaded ROM image. /// /// opaque state pointer + /// enough room for 16 ascii chars plus terminator /// [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern string gambatte_romtitle(IntPtr core); + public static extern string gambatte_romtitle(IntPtr core, byte[] data); /// /// memory areas that gambatte_getmemoryarea() can return diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index 8652739799..990d3f9a64 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -19,7 +19,6 @@ #ifndef GAMBATTE_H #define GAMBATTE_H -#include "inputgetter.h" #include "gbint.h" #include #include @@ -84,7 +83,7 @@ public: void setCgbPalette(unsigned *lut); /** Sets the callback used for getting input state. */ - void setInputGetter(InputGetter *getInput); + void setInputGetter(unsigned (*getInput)()); void setReadCallback(void (*callback)(unsigned)); void setWriteCallback(void (*callback)(unsigned)); diff --git a/libgambatte/include/inputgetter.h b/libgambatte/include/inputgetter.h deleted file mode 100644 index d280de179a..0000000000 --- a/libgambatte/include/inputgetter.h +++ /dev/null @@ -1,33 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2007 by Sindre AamÄs * - * aamas@stud.ntnu.no * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 as * - * published by the Free Software Foundation. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License version 2 for more details. * - * * - * You should have received a copy of the GNU General Public License * - * version 2 along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#ifndef GAMBATTE_INPUTGETTER_H -#define GAMBATTE_INPUTGETTER_H - -namespace gambatte { -class InputGetter { -public: - enum { A = 0x01, B = 0x02, SELECT = 0x04, START = 0x08, RIGHT = 0x10, LEFT = 0x20, UP = 0x40, DOWN = 0x80 }; - virtual ~InputGetter() {}; - - /** @return A|B|SELECT|START|RIGHT|LEFT|UP|DOWN if those buttons are pressed. */ - virtual unsigned operator()() = 0; -}; -} - -#endif diff --git a/libgambatte/libgambatte.vcxproj b/libgambatte/libgambatte.vcxproj index 434d1c23c3..a61ab0e8fc 100644 --- a/libgambatte/libgambatte.vcxproj +++ b/libgambatte/libgambatte.vcxproj @@ -86,7 +86,6 @@ - diff --git a/libgambatte/libgambatte.vcxproj.filters b/libgambatte/libgambatte.vcxproj.filters index 5571702c18..614dad17ef 100644 --- a/libgambatte/libgambatte.vcxproj.filters +++ b/libgambatte/libgambatte.vcxproj.filters @@ -99,9 +99,6 @@ Header Files - - Header Files - Header Files diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index b6bb0328eb..88bed9f184 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -1,223 +1,175 @@ #include "cinterface.h" #include "gambatte.h" #include +#include #include "newstate.h" using namespace gambatte; - -GBEXPORT void *gambatte_create() +GBEXPORT GB *gambatte_create() { - GB *g = new GB(); - return (void *) g; + return new (std::calloc(1, sizeof (GB))) GB(); } -GBEXPORT void gambatte_destroy(void *core) +GBEXPORT void gambatte_destroy(GB *g) { - GB *g = (GB *) core; - delete g; + g->~GB(); + std::free(g); } -GBEXPORT int gambatte_load(void *core, const char *romfiledata, unsigned romfilelength, long long now, unsigned flags) +GBEXPORT int gambatte_load(GB *g, const char *romfiledata, unsigned romfilelength, long long now, unsigned flags) { - GB *g = (GB *) core; int ret = g->load(romfiledata, romfilelength, now, flags); return ret; } -GBEXPORT long gambatte_runfor(void *core, short *soundbuf, unsigned *samples) +GBEXPORT long gambatte_runfor(GB *g, short *soundbuf, unsigned *samples) { - GB *g = (GB *) core; unsigned sampv = *samples; long ret = g->runFor((unsigned int *) soundbuf, sampv); *samples = sampv; return ret; } -GBEXPORT void gambatte_blitto(void *core, unsigned long *videobuf, int pitch) +GBEXPORT void gambatte_blitto(GB *g, unsigned long *videobuf, int pitch) { - GB *g = (GB *) core; g->blitTo((unsigned int *)videobuf, pitch); } -GBEXPORT void gambatte_reset(void *core, long long now) +GBEXPORT void gambatte_reset(GB *g, long long now) { - GB *g = (GB *) core; g->reset(now); } -GBEXPORT void gambatte_setdmgpalettecolor(void *core, unsigned palnum, unsigned colornum, unsigned rgb32) +GBEXPORT void gambatte_setdmgpalettecolor(GB *g, unsigned palnum, unsigned colornum, unsigned rgb32) { - GB *g = (GB *) core; g->setDmgPaletteColor(palnum, colornum, rgb32); } -GBEXPORT void gambatte_setcgbpalette(void *core, unsigned *lut) +GBEXPORT void gambatte_setcgbpalette(GB *g, unsigned *lut) { - GB *g = (GB *) core; g->setCgbPalette(lut); } -class CInputGetter: public InputGetter +GBEXPORT void gambatte_setinputgetter(GB *g, unsigned (*getinput)(void)) { -public: - - unsigned (*inputfunc)(void); - unsigned operator()() - { - return inputfunc (); - } -}; - -GBEXPORT void gambatte_setinputgetter(void *core, unsigned (*getinput)(void)) -{ - GB *g = (GB *) core; - CInputGetter *cig = new CInputGetter(); - cig->inputfunc = getinput; - // how do i manage the lifetime of cig? - g->setInputGetter(cig); + g->setInputGetter(getinput); } -GBEXPORT void gambatte_setreadcallback(void *core, void (*callback)(unsigned)) +GBEXPORT void gambatte_setreadcallback(GB *g, void (*callback)(unsigned)) { - GB *g = (GB *) core; g->setReadCallback(callback); } -GBEXPORT void gambatte_setwritecallback(void *core, void (*callback)(unsigned)) +GBEXPORT void gambatte_setwritecallback(GB *g, void (*callback)(unsigned)) { - GB *g = (GB *) core; g->setWriteCallback(callback); } -GBEXPORT void gambatte_setexeccallback(void *core, void (*callback)(unsigned)) +GBEXPORT void gambatte_setexeccallback(GB *g, void (*callback)(unsigned)) { - GB *g = (GB *) core; g->setExecCallback(callback); } -GBEXPORT void gambatte_settracecallback(void *core, void (*callback)(void *)) +GBEXPORT void gambatte_settracecallback(GB *g, void (*callback)(void *)) { - GB *g = (GB *) core; g->setTraceCallback(callback); } -GBEXPORT void gambatte_setscanlinecallback(void *core, void (*callback)(), int sl) +GBEXPORT void gambatte_setscanlinecallback(GB *g, void (*callback)(), int sl) { - GB *g = (GB *) core; g->setScanlineCallback(callback, sl); } -GBEXPORT void gambatte_setrtccallback(void *core, unsigned int (*callback)()) +GBEXPORT void gambatte_setrtccallback(GB *g, unsigned int (*callback)()) { - GB *g = (GB *) core; g->setRTCCallback(callback); } -GBEXPORT int gambatte_iscgb(void *core) +GBEXPORT int gambatte_iscgb(GB *g) { - GB *g = (GB *) core; return g->isCgb(); } -GBEXPORT int gambatte_isloaded(void *core) +GBEXPORT int gambatte_isloaded(GB *g) { - GB *g = (GB *) core; return g->isLoaded(); } -GBEXPORT void gambatte_savesavedata(void *core, char *dest) +GBEXPORT void gambatte_savesavedata(GB *g, char *dest) { - GB *g = (GB *) core; g->saveSavedata(dest); } -GBEXPORT void gambatte_loadsavedata(void *core, const char *data) +GBEXPORT void gambatte_loadsavedata(GB *g, const char *data) { - GB *g = (GB *) core; g->loadSavedata(data); } -GBEXPORT int gambatte_savesavedatalength(void *core) +GBEXPORT int gambatte_savesavedatalength(GB *g) { - GB *g = (GB *) core; return g->saveSavedataLength(); } -GBEXPORT long gambatte_newstatelen(void *core) +GBEXPORT long gambatte_newstatelen(GB *g) { - GB *g = (GB *) core; NewStateDummy dummy; g->SyncState(&dummy); return dummy.GetLength(); } -GBEXPORT int gambatte_newstatesave(void *core, char *data, long len) +GBEXPORT int gambatte_newstatesave(GB *g, char *data, long len) { - GB *g = (GB *) core; NewStateExternalBuffer saver(data, len); g->SyncState(&saver); return !saver.Overflow() && saver.GetLength() == len; } -GBEXPORT int gambatte_newstateload(void *core, const char *data, long len) +GBEXPORT int gambatte_newstateload(GB *g, const char *data, long len) { - GB *g = (GB *) core; NewStateExternalBuffer loader((char *)data, len); g->SyncState(&loader); return !loader.Overflow() && loader.GetLength() == len; } -GBEXPORT void gambatte_newstatesave_ex(void *core, FPtrs *ff) +GBEXPORT void gambatte_newstatesave_ex(GB *g, FPtrs *ff) { - GB *g = (GB *) core; NewStateExternalFunctions saver(ff); g->SyncState(&saver); } -GBEXPORT void gambatte_newstateload_ex(void *core, FPtrs *ff) +GBEXPORT void gambatte_newstateload_ex(GB *g, FPtrs *ff) { - GB *g = (GB *) core; NewStateExternalFunctions loader(ff); g->SyncState(&loader); } -static char horriblebuff[64]; -GBEXPORT const char *gambatte_romtitle(void *core) +GBEXPORT void gambatte_romtitle(GB *g, char *dest) { - GB *g = (GB *) core; - const char *s = g->romTitle().c_str(); - std::strncpy(horriblebuff, s, 63); - horriblebuff[63] = 0; - return horriblebuff; + std::strcpy(dest, g->romTitle().c_str()); } -GBEXPORT int gambatte_getmemoryarea(void *core, int which, unsigned char **data, int *length) +GBEXPORT int gambatte_getmemoryarea(GB *g, int which, unsigned char **data, int *length) { - GB *g = (GB *) core; return g->getMemoryArea(which, data, length); } -GBEXPORT unsigned char gambatte_cpuread(void *core, unsigned short addr) +GBEXPORT unsigned char gambatte_cpuread(GB *g, unsigned short addr) { - GB *g = (GB *) core; return g->ExternalRead(addr); } -GBEXPORT void gambatte_cpuwrite(void *core, unsigned short addr, unsigned char val) +GBEXPORT void gambatte_cpuwrite(GB *g, unsigned short addr, unsigned char val) { - GB *g = (GB *) core; g->ExternalWrite(addr, val); } -GBEXPORT int gambatte_linkstatus(void *core, int which) +GBEXPORT int gambatte_linkstatus(GB *g, int which) { - GB *g = (GB *) core; return g->LinkStatus(which); } -GBEXPORT void gambatte_getregs(void *core, int *dest) +GBEXPORT void gambatte_getregs(GB *g, int *dest) { - GB *g = (GB *) core; g->GetRegs(dest); } diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 55a72b6364..0a8cdd4d24 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -63,7 +63,7 @@ public: memory.setVideoBuffer(videoBuf, pitch); } - void setInputGetter(InputGetter *getInput) { + void setInputGetter(unsigned (*getInput)()) { memory.setInputGetter(getInput); } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index 7fbe2c8647..1c7dcc1f62 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -98,7 +98,7 @@ void GB::reset(const std::uint32_t now) { } } -void GB::setInputGetter(InputGetter *getInput) { +void GB::setInputGetter(unsigned (*getInput)()) { p_->cpu.setInputGetter(getInput); } diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index f4e26ce60f..848255d25a 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -19,7 +19,6 @@ #include "memory.h" #include "video.h" #include "sound.h" -#include "inputgetter.h" #include "savestate.h" #include diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 8cc3bfd615..7f5c82863a 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -38,7 +38,7 @@ class Memory { void (*writeCallback)(unsigned); void (*execCallback)(unsigned); - InputGetter *getInput; + unsigned (*getInput)(); unsigned long divLastUpdate; unsigned long lastOamDmaUpdate; @@ -159,7 +159,7 @@ public: int loadROM(const char *romfiledata, unsigned romfilelength, bool forceDmg, bool multicartCompat); - void setInputGetter(InputGetter *getInput) { + void setInputGetter(unsigned (*getInput)()) { this->getInput = getInput; } diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index e893f84f89..2511c2094a 100644 Binary files a/output/dll/libgambatte.dll and b/output/dll/libgambatte.dll differ