From 92c4df38c337d87846b6abb6e0970685bed63292 Mon Sep 17 00:00:00 2001 From: goyuken Date: Mon, 6 Jan 2014 22:14:24 +0000 Subject: [PATCH] quicknes: memory domains --- .../Consoles/Nintendo/QuickNES/LibQuickNES.cs | 12 +++++ .../Consoles/Nintendo/QuickNES/QuickNES.cs | 51 +++++++++++++++++- output/dll/libquicknes.dll | Bin 453354 -> 454416 bytes quicknes/bizinterface.cpp | 35 ++++++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs index 24a76a5e43..6eab122a15 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs @@ -180,6 +180,18 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES /// 0 to hide, 8 for normal, 64 for all [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] public static extern void qn_set_sprite_limit(IntPtr e, int n); + /// + /// get memory area for debugging + /// + /// Context + /// + /// + /// + /// + /// + /// + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern bool qn_get_memory_area(IntPtr e, int which, ref IntPtr data, ref int size, ref bool writable, ref IntPtr name); /// /// handle "string error" as returned by some quicknes functions diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs index 1ff94aca08..d7377adce5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs @@ -9,6 +9,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES { public class QuickNES : IEmulator, IVideoProvider, ISyncSoundProvider { + #region FPU precision + private class FPCtrl : IDisposable { [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] @@ -36,6 +38,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES FPCtrl FP = new FPCtrl(); + #endregion + static QuickNES() { LibQuickNES.qn_setup_mappers(); @@ -58,6 +62,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES InitSaveStateBuff(); InitVideo(); InitAudio(); + InitMemoryDomains(); } catch { @@ -266,16 +271,58 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES private set; } - public MemoryDomainList MemoryDomains + #region debugging + + unsafe void InitMemoryDomains() { - get { return MemoryDomainList.GetDummyList(); } + List mm = new List(); + for (int i = 0; ; i++) + { + IntPtr data = IntPtr.Zero; + int size = 0; + bool writable = false; + IntPtr name = IntPtr.Zero; + + if (!LibQuickNES.qn_get_memory_area(Context, i, ref data, ref size, ref writable, ref name)) + break; + + if (data != IntPtr.Zero && size > 0 && name != IntPtr.Zero) + { + byte* p = (byte*)data; + + mm.Add(new MemoryDomain + ( + Marshal.PtrToStringAnsi(name), + size, + MemoryDomain.Endian.Unknown, + delegate(int addr) + { + if (addr < 0 || addr >= size) + throw new ArgumentOutOfRangeException(); + return p[addr]; + }, + delegate(int addr, byte val) + { + if (!writable) + return; + if (addr < 0 || addr >= size) + throw new ArgumentOutOfRangeException(); + p[addr] = val; + })); + } + } + MemoryDomains = new MemoryDomainList(mm, 0); } + public MemoryDomainList MemoryDomains { get; private set; } + public List> GetCpuFlagsAndRegisters() { return new List>(); } + #endregion + #region settings public object GetSettings() diff --git a/output/dll/libquicknes.dll b/output/dll/libquicknes.dll index 05a94858609c415ea9505f155983fb748465a6ff..8b713d283a674ac04c4640a20ba5c9b384ab4c27 100644 GIT binary patch delta 54422 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 PH`tO?Ubm>+LZ|;9*J@!Z diff --git a/quicknes/bizinterface.cpp b/quicknes/bizinterface.cpp index 5cfa683fcd..c35d70e8b0 100644 --- a/quicknes/bizinterface.cpp +++ b/quicknes/bizinterface.cpp @@ -193,3 +193,38 @@ EXPORT void qn_set_sprite_limit(Nes_Emu *e, int n) { e->set_sprite_mode((Nes_Emu::sprite_mode_t)n); } + +EXPORT int qn_get_memory_area(Nes_Emu *e, int which, const void **data, int *size, int *writable, const char **name) +{ + if (!data || !size || !writable || !name) + return 0; + switch (which) + { + default: + return 0; + case 0: + *data = e->low_mem(); + *size = e->low_mem_size; + *writable = 1; + *name = "RAM"; + return 1; + case 1: + *data = e->high_mem(); + *size = e->high_mem_size; + *writable = 1; + *name = "WRAM"; + return 1; + case 2: + *data = e->chr_mem(); + *size = e->chr_size(); + *writable = 0; + *name = "CHR"; + return 1; + case 3: + *data = e->nametable_mem(); + *size = e->nametable_size(); + *writable = 0; + *name = "CIRAM (nametables)"; + return 1; + } +}