From 45e5f4b2862174df7cb0a6d5a57cc04919823357 Mon Sep 17 00:00:00 2001 From: goyuken Date: Mon, 6 Jan 2014 23:23:47 +0000 Subject: [PATCH] quicknes: add "System Bus". note that this System Bus will not resolve any MMIO stuff at all --- .../Consoles/Nintendo/QuickNES/LibQuickNES.cs | 16 ++++++ .../Consoles/Nintendo/QuickNES/QuickNES.cs | 54 ++++++++++++------ output/dll/libquicknes.dll | Bin 454416 -> 454842 bytes quicknes/bizinterface.cpp | 10 ++++ quicknes/nes_emu/Nes_Emu.h | 7 ++- 5 files changed, 69 insertions(+), 18 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs index 6eab122a15..79d83b72b1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs @@ -192,6 +192,22 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES /// [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); + /// + /// peek the system bus + /// + /// Context + /// 0000:ffff, but non-ram/rom addresses won't work + /// + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern byte qn_peek_prgbus(IntPtr e, int addr); + /// + /// poke the system bus + /// + /// Context + /// 0000:ffff, but non-ram/rom addresses won't work + /// + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern void qn_poke_prgbus(IntPtr e, int addr, byte val); /// /// 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 d7377adce5..95fc4f827f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs @@ -292,25 +292,45 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES 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; - })); + 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; + } + )); } } + // add system bus + mm.Add(new MemoryDomain + ( + "System Bus", + 0x10000, + MemoryDomain.Endian.Unknown, + delegate(int addr) + { + if (addr < 0 || addr >= 0x10000) + throw new ArgumentOutOfRangeException(); + return LibQuickNES.qn_peek_prgbus(Context, addr); + }, + delegate(int addr, byte val) + { + if (addr < 0 || addr >= 0x10000) + throw new ArgumentOutOfRangeException(); + LibQuickNES.qn_poke_prgbus(Context, addr, val); + } + )); MemoryDomains = new MemoryDomainList(mm, 0); } diff --git a/output/dll/libquicknes.dll b/output/dll/libquicknes.dll index 8b713d283a674ac04c4640a20ba5c9b384ab4c27..b1c2e2ff6749131449a7cf9acd04beb002bccf9b 100644 GIT binary patch delta 46727 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 F|34aS!zus( delta 45602 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 apf_WExnb7&{d2?qIre{5*(9m} diff --git a/quicknes/bizinterface.cpp b/quicknes/bizinterface.cpp index c35d70e8b0..a8a29374d8 100644 --- a/quicknes/bizinterface.cpp +++ b/quicknes/bizinterface.cpp @@ -228,3 +228,13 @@ EXPORT int qn_get_memory_area(Nes_Emu *e, int which, const void **data, int *siz return 1; } } + +EXPORT unsigned char qn_peek_prgbus(Nes_Emu *e, int addr) +{ + return e->peek_prg(addr & 0xffff); +} + +EXPORT void qn_poke_prgbus(Nes_Emu *e, int addr, unsigned char val) +{ + e->poke_prg(addr & 0xffff, val); +} diff --git a/quicknes/nes_emu/Nes_Emu.h b/quicknes/nes_emu/Nes_Emu.h index 81d47f154c..c3394e2154 100644 --- a/quicknes/nes_emu/Nes_Emu.h +++ b/quicknes/nes_emu/Nes_Emu.h @@ -197,7 +197,12 @@ public: // Optional 8K memory enum { high_mem_size = 0x2000 }; byte* high_mem() { return emu.impl->sram; } - + +// Prg peek/poke for debuggin + byte peek_prg(nes_addr_t addr) const { return *static_cast(emu).get_code(addr); } + void poke_prg(nes_addr_t addr, byte value) { *static_cast(emu).get_code(addr) = value; } + + // End of public interface public: blargg_err_t set_sample_rate( long rate, class Nes_Buffer* );