diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs index a0c43173c6..35affbfbf4 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -126,7 +126,20 @@ namespace BizHawk.Emulation.Consoles.GB public List> GetCpuFlagsAndRegisters() { - throw new NotImplementedException(); + List> ret = new List>(); + int[] data = new int[10]; + LibGambatte.gambatte_getregs(GambatteState, data); + ret.Add(new KeyValuePair("PC", data[(int)LibGambatte.RegIndicies.PC] & 0xffff)); + ret.Add(new KeyValuePair("SP", data[(int)LibGambatte.RegIndicies.SP] & 0xffff)); + ret.Add(new KeyValuePair("A", data[(int)LibGambatte.RegIndicies.A] & 0xff)); + ret.Add(new KeyValuePair("B", data[(int)LibGambatte.RegIndicies.B] & 0xff)); + ret.Add(new KeyValuePair("C", data[(int)LibGambatte.RegIndicies.C] & 0xff)); + ret.Add(new KeyValuePair("D", data[(int)LibGambatte.RegIndicies.D] & 0xff)); + ret.Add(new KeyValuePair("E", data[(int)LibGambatte.RegIndicies.E] & 0xff)); + ret.Add(new KeyValuePair("F", data[(int)LibGambatte.RegIndicies.F] & 0xff)); + ret.Add(new KeyValuePair("H", data[(int)LibGambatte.RegIndicies.H] & 0xff)); + ret.Add(new KeyValuePair("L", data[(int)LibGambatte.RegIndicies.L] & 0xff)); + return ret; } /// diff --git a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs index 4e28fcce6d..03a2ed20bb 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -402,5 +402,18 @@ namespace BizHawk.Emulation.Consoles.GB /// todo [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int gambatte_linkstatus(IntPtr core, int which); + + /// + /// get reg and flag values + /// + /// opaque state pointer + /// length of at least 10, please + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_getregs(IntPtr core, int[] dest); + + public enum RegIndicies : int + { + PC, SP, A, B, C, D, E, F, H, L + } } } diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index f425485825..bd1f533fe7 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -162,6 +162,8 @@ public: int LinkStatus(int which); + void GetRegs(int *dest); + private: struct Priv; Priv *const p_; diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index 306d047851..cbe7c855d8 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -246,3 +246,9 @@ __declspec(dllexport) int gambatte_linkstatus(void *core, int which) GB *g = (GB *) core; return g->LinkStatus(which); } + +__declspec(dllexport) void gambatte_getregs(void *core, int *dest) +{ + GB *g = (GB *) core; + g->GetRegs(dest); +} diff --git a/libgambatte/src/cinterface.h b/libgambatte/src/cinterface.h index 3487f39f57..8a81d658e5 100644 --- a/libgambatte/src/cinterface.h +++ b/libgambatte/src/cinterface.h @@ -67,6 +67,8 @@ extern "C" __declspec(dllexport) int gambatte_linkstatus(void *core, int which); + __declspec(dllexport) void gambatte_getregs(void *core, int *dest); + } diff --git a/libgambatte/src/cpu.cpp b/libgambatte/src/cpu.cpp index 181232769e..1755228700 100644 --- a/libgambatte/src/cpu.cpp +++ b/libgambatte/src/cpu.cpp @@ -2833,4 +2833,18 @@ void CPU::process(const unsigned long cycles) { cycleCounter_ = cycleCounter; } +void CPU::GetRegs(int *dest) +{ + dest[0] = PC_; + dest[1] = SP; + dest[2] = A_; + dest[3] = B; + dest[4] = C; + dest[5] = D; + dest[6] = E; + dest[7] = F(); + dest[8] = H; + dest[9] = L; +} + } diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 45979cd96e..2bd7ca2e2e 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -127,6 +127,8 @@ public: void ExternalWrite(unsigned short addr, unsigned char val) { memory.write(addr, val, cycleCounter_); } int LinkStatus(int which) { return memory.LinkStatus(which); } + + void GetRegs(int *dest); }; } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index 02460fc07f..bca5e65140 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -268,4 +268,8 @@ int GB::LinkStatus(int which) { return p_->cpu.LinkStatus(which); } +void GB::GetRegs(int *dest) { + p_->cpu.GetRegs(dest); +} + } diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index ba0d506a7f..0e03875488 100644 Binary files a/output/dll/libgambatte.dll and b/output/dll/libgambatte.dll differ