From d305b2f538cda759c43209d21b067b644a9b563d Mon Sep 17 00:00:00 2001 From: goyuken Date: Wed, 17 Dec 2014 03:27:44 +0000 Subject: [PATCH] partially functional ppu viewing tools for quicknes --- BizHawk.Client.EmuHawk/MainForm.Events.cs | 2 - .../tools/NES/NESNameTableViewer.cs | 2 - BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs | 2 - .../Consoles/Nintendo/QuickNES/LibQuickNES.cs | 13 +++ .../Consoles/Nintendo/QuickNES/QuickNES.cs | 102 +++++++++++++++++- output/dll/libquicknes.dll | Bin 415545 -> 416270 bytes quicknes/bizinterface.cpp | 38 +++++++ quicknes/nes_emu/Nes_Emu.h | 5 + quicknes/nes_emu/Nes_Ppu_Impl.cpp | 10 ++ quicknes/nes_emu/Nes_Ppu_Impl.h | 8 +- 10 files changed, 174 insertions(+), 8 deletions(-) diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 29aa248523..16408b3e85 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -1209,8 +1209,6 @@ namespace BizHawk.Client.EmuHawk { FDSControlsMenuItem.Enabled = Global.Emulator.BoardName == "FDS"; - NESPPUViewerMenuItem.Enabled = - NESNametableViewerMenuItem.Enabled = NESSoundChannelsMenuItem.Enabled = MovieSettingsMenuItem.Enabled = Global.Emulator is NES; diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs b/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs index 777eb1f0da..28017fadbe 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESNameTableViewer.cs @@ -14,8 +14,6 @@ namespace BizHawk.Client.EmuHawk // TODO: // Show Scroll Lines + UI Toggle [RequiredService] - private NES _nes { get; set; } - [RequiredService] private INESPPUViewable xxx { get; set; } [RequiredService] private IEmulator _emu { get; set; } diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs b/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs index 8ff2d6711a..e05aedce13 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs @@ -25,8 +25,6 @@ namespace BizHawk.Client.EmuHawk private Bitmap _zoomBoxDefaultImage = new Bitmap(64, 64); private bool _forceChange; - [RequiredService] - private NES _nes { get; set; } [RequiredService] private INESPPUViewable xxx { get; set; } [RequiredService] diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs index 75a54fab96..a7727b7657 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/LibQuickNES.cs @@ -215,6 +215,19 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr qn_get_mapper(IntPtr e, ref int number); + + + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern byte qn_get_reg2000(IntPtr e); + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr qn_get_palmem(IntPtr e); + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr qn_get_oammem(IntPtr e); + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern byte qn_peek_ppu(IntPtr e, int addr); + [DllImport(dllname, CallingConvention = CallingConvention.Cdecl)] + public static extern void qn_peek_ppubus(IntPtr e, byte[] dest); + /// /// 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 4274d453fc..a9a8c7f392 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.cs @@ -24,7 +24,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES )] [ServiceNotApplicable(typeof(IDriveLight))] public class QuickNES : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains, ISaveRam, IInputPollable, - IStatable, IDebuggable, ISettable + IStatable, IDebuggable, ISettable, Cores.Nintendo.NES.INESPPUViewable { #region FPU precision @@ -199,6 +199,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES Blit(); if (rendersound) DrainAudio(); + + if (CB1 != null) CB1(); + if (CB2 != null) CB2(); } } @@ -717,5 +720,102 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES } #endregion + + #region INESPPUViewable + + // todo: don't just call the callbacks at the end of frame; use the scanline info + Action CB1; + Action CB2; + + public int[] GetPalette() + { + return VideoPalette; + } + + private byte R2000 { get { return LibQuickNES.qn_get_reg2000(Context); } } + + public bool BGBaseHigh + { + get { return (R2000 & 0x10) != 0; } + } + + public bool SPBaseHigh + { + get { return (R2000 & 0x08) != 0; } + } + + public bool SPTall + { + get { return (R2000 & 0x20) != 0; } + } + + byte[] ppubusbuf = new byte[0x3000]; + public byte[] GetPPUBus() + { + LibQuickNES.qn_peek_ppubus(Context, ppubusbuf); + return ppubusbuf; + } + + byte[] palrambuf = new byte[0x20]; + public byte[] GetPalRam() + { + Marshal.Copy(LibQuickNES.qn_get_palmem(Context), palrambuf, 0, 0x20); + return palrambuf; + } + + byte[] oambuf = new byte[0x100]; + public byte[] GetOam() + { + Marshal.Copy(LibQuickNES.qn_get_oammem(Context), oambuf, 0, 0x100); + return oambuf; + } + + public byte PeekPPU(int addr) + { + return LibQuickNES.qn_peek_ppu(Context, addr); + } + + // we don't use quicknes's MMC5 at all, so these three methods are just stubs + public byte[] GetExTiles() + { + throw new InvalidOperationException(); + } + + public bool ExActive + { + get { return false; } + } + + public byte[] GetExRam() + { + throw new InvalidOperationException(); + } + + public MemoryDomain GetCHRROM() + { + return MemoryDomains["CHR VROM"]; + } + + public void InstallCallback1(Action cb, int sl) + { + CB1 = cb; + } + + public void InstallCallback2(Action cb, int sl) + { + CB2 = cb; + } + + public void RemoveCallback1() + { + CB1 = null; + } + + public void RemoveCallback2() + { + CB2 = null; + } + + #endregion } } diff --git a/output/dll/libquicknes.dll b/output/dll/libquicknes.dll index 4c8bc9642aa0f8c9fb866338aed380cc63ad3faa..23e523e8c8e9b087730eda07631c1ad78d97fe9d 100644 GIT binary patch delta 67022 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≪WGslJ5}v%I;e%xW-qqwA)lno|3+ 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 diff --git a/quicknes/bizinterface.cpp b/quicknes/bizinterface.cpp index 45bfef3286..c1934d43ff 100644 --- a/quicknes/bizinterface.cpp +++ b/quicknes/bizinterface.cpp @@ -230,6 +230,18 @@ EXPORT int qn_get_memory_area(Nes_Emu *e, int which, const void **data, int *siz *writable = 0; *name = "CHR VROM"; return 1; + case 6: + *data = e->pal_mem(); + *size = 32; + *writable = 1; + *name = "PALRAM"; + return 1; + case 7: + *data = e->oam_mem(); + *size = 256; + *writable = 1; + *name = "OAM"; + return 1; } } @@ -276,3 +288,29 @@ EXPORT const char *qn_get_mapper(Nes_Emu *e, int *number) case 10: return "mmc4"; } } + +EXPORT byte qn_get_reg2000(Nes_Emu *e) +{ + return e->get_ppu2000(); +} + +EXPORT byte *qn_get_palmem(Nes_Emu *e) +{ + return e->pal_mem(); +} + +EXPORT byte *qn_get_oammem(Nes_Emu *e) +{ + return e->oam_mem(); +} + +EXPORT byte qn_peek_ppu(Nes_Emu *e, int addr) +{ + return e->peek_ppu(addr); +} + +EXPORT void qn_peek_ppubus(Nes_Emu *e, byte *dest) +{ + for (int i = 0; i < 0x3000; i++) + dest[i] = e->peek_ppu(i); +} diff --git a/quicknes/nes_emu/Nes_Emu.h b/quicknes/nes_emu/Nes_Emu.h index c08d1f4afe..2402493e16 100644 --- a/quicknes/nes_emu/Nes_Emu.h +++ b/quicknes/nes_emu/Nes_Emu.h @@ -206,9 +206,14 @@ public: // 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; } + byte peek_ppu(int addr) { return emu.ppu.peekaddr(addr); } void get_regs(unsigned int *dest) const; + byte get_ppu2000() const { return emu.ppu.w2000; } + byte* pal_mem() { return emu.ppu.palette; } + byte* oam_mem() { return emu.ppu.spr_ram; } + // End of public interface public: blargg_err_t set_sample_rate( long rate, class Nes_Buffer* ); diff --git a/quicknes/nes_emu/Nes_Ppu_Impl.cpp b/quicknes/nes_emu/Nes_Ppu_Impl.cpp index e9aae96e45..f46524bd4b 100644 --- a/quicknes/nes_emu/Nes_Ppu_Impl.cpp +++ b/quicknes/nes_emu/Nes_Ppu_Impl.cpp @@ -54,6 +54,16 @@ Nes_Ppu_Impl::~Nes_Ppu_Impl() delete impl; } +int Nes_Ppu_Impl::peekaddr(int addr) +{ + if (addr < 0x2000) + return chr_data[map_chr_addr_peek(addr)]; + else + return get_nametable(addr)[addr & 0x3ff]; +} + + + void Nes_Ppu_Impl::all_tiles_modified() { any_tiles_modified = true; diff --git a/quicknes/nes_emu/Nes_Ppu_Impl.h b/quicknes/nes_emu/Nes_Ppu_Impl.h index 0d88371258..d09f82849d 100644 --- a/quicknes/nes_emu/Nes_Ppu_Impl.h +++ b/quicknes/nes_emu/Nes_Ppu_Impl.h @@ -32,6 +32,7 @@ public: enum { buffer_height = image_height }; int write_2007( int ); + int peekaddr(int); // Host palette enum { palette_increment = 64 }; @@ -64,8 +65,8 @@ public: impl_t* impl; enum { scanline_len = 341 }; -protected: byte spr_ram [0x100]; +protected: void begin_frame(); void run_hblank( int ); int sprite_height() const { return (w2000 >> 2 & 8) + 8; } @@ -104,6 +105,11 @@ private: enum { chr_page_size = 0x400 }; long chr_pages [chr_addr_size / chr_page_size]; long chr_pages_ex [chr_addr_size / chr_page_size]; // mmc24 only + long map_chr_addr_peek( unsigned a ) const + { + return chr_pages[a / chr_page_size] + a; + } + long map_chr_addr( unsigned a ) /*const*/ { if (!mmc24_enabled)