From e8d9ae7e7c26f27e74ce9f188056560a05ccb636 Mon Sep 17 00:00:00 2001 From: goyuken Date: Thu, 21 Aug 2014 23:51:25 +0000 Subject: [PATCH] vba: cpu flags and registers --- .../BizHawk.Emulation.Cores.csproj | 1 + .../Consoles/Nintendo/GBA/LibVBANext.cs | 55 +++++++++++++++++- .../Consoles/Nintendo/GBA/VBANext.cs | 12 +++- .../Nintendo/GBA/VBARegisterHelper.cs | 44 ++++++++++++++ output/dll/libvbanext.dll | Bin 443392 -> 443392 bytes vbanext/constarrays.h | 1 - vbanext/instance.cpp | 12 +++- 7 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBARegisterHelper.cs diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index d8ad73899d..d6d19607ae 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -242,6 +242,7 @@ + diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/LibVBANext.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/LibVBANext.cs index c793fb95d4..7850fe0566 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/LibVBANext.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/LibVBANext.cs @@ -92,7 +92,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA /// [DllImport(dllname, CallingConvention = cc)] public static extern void Reset(IntPtr g); - + /// /// frame advance /// @@ -137,6 +137,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA [DllImport(dllname, CallingConvention = cc)] public static extern void SetScanlineCallback(IntPtr g, StandardCallback cb, int scanline); + [DllImport(dllname, CallingConvention = cc)] + public static extern IntPtr GetRegisters(IntPtr g); [StructLayout(LayoutKind.Sequential)] public class MemoryAreas @@ -150,5 +152,56 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA public IntPtr rom; public IntPtr mmio; } + + // this isn't used directly at the moment. but it could be used for something eventually... + [StructLayout(LayoutKind.Sequential)] + public class Registers + { + public int R0; + public int R1; + public int R2; + public int R3; + public int R4; + public int R5; + public int R6; + public int R7; + public int R8; + public int R9; + public int R10; + public int R11; + public int R12; + public int R13; + public int R14; + public int R15; + public int CPSR; + public int SPSR; + public int R13_IRQ; + public int R14_IRQ; + public int SPSR_IRQ; + public int _unk0; // what are these??? + public int _unk1; + public int _unk2; + public int _unk3; + public int _unk4; + public int R13_USR; + public int R14_USR; + public int R13_SVC; + public int R14_SVC; + public int SPSR_SVC; + public int R13_ABT; + public int R14_ABT; + public int SPSR_ABT; + public int R13_UND; + public int R14_UND; + public int SPSR_UND; + public int R8_FIQ; + public int R9_FIQ; + public int R10_FIQ; + public int R11_FIQ; + public int R12_FIQ; + public int R13_FIQ; + public int R14_FIQ; + public int SPSR_FIQ; + } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs index cfe5ab1c17..ccd57d863f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs @@ -74,6 +74,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA savebuff = new byte[LibVBANext.BinStateSize(Core)]; savebuff2 = new byte[savebuff.Length + 13]; InitMemoryDomains(); + InitRegisters(); // todo: hook me up as a setting SetupColors(); @@ -347,14 +348,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA public MemoryDomainList MemoryDomains { get; private set; } + VBARegisterHelper regs; + + void InitRegisters() + { + regs = new VBARegisterHelper(Core); + } + public Dictionary GetCpuFlagsAndRegisters() { - throw new NotImplementedException(); + return regs.GetAllRegisters(); } public void SetCpuRegister(string register, int value) { - throw new NotImplementedException(); + regs.SetRegister(register, value); } #endregion diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBARegisterHelper.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBARegisterHelper.cs new file mode 100644 index 0000000000..48831b81f6 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBARegisterHelper.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; + +namespace BizHawk.Emulation.Cores.Nintendo.GBA +{ + public unsafe class VBARegisterHelper + { + IntPtr _origin; + Dictionary _locs = new Dictionary(); + + public VBARegisterHelper(IntPtr Core) + { + _origin = LibVBANext.GetRegisters(Core); + foreach (var field in typeof(LibVBANext.Registers).GetFields()) + { + var ofs = Marshal.OffsetOf(typeof(LibVBANext.Registers), field.Name); + _locs[field.Name] = IntPtr.Add(_origin, (int)ofs); + } + } + + public int GetRegister(string name) + { + int* p = (int*)_locs[name]; + return *p; + } + public void SetRegister(string name, int val) + { + int* p = (int*)_locs[name]; + *p = val; + } + public Dictionary GetAllRegisters() + { + Dictionary ret = new Dictionary(); + foreach (var kvp in _locs) + { + ret[kvp.Key] = GetRegister(kvp.Key); + } + return ret; + } + } +} diff --git a/output/dll/libvbanext.dll b/output/dll/libvbanext.dll index 0247e74803374fd488ad7d018d83064ac4677d46..2fabdcb1e60ddca1c7f2068dbc00147e0b3efdbf 100644 GIT binary patch delta 38240 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 A+5i9m delta 38227 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 kbool SyncBatteryRam(NewState *ns) scanlineCallbackLine = scanline; } + uint32_t *GetRegisters() + { + return &bus.reg[0].I; + } + }; // class Gigazoid // zeroing mem operators: these are very important @@ -13508,4 +13511,9 @@ EXPORT void SetScanlineCallback(Gigazoid *g, void (*cb)(), int scanline) g->SetScanlineCallback(cb, scanline); } +EXPORT u32 *GetRegisters(Gigazoid *g) +{ + return g->GetRegisters(); +} + #include "optable.inc"