From e24d1efbd489689816fc3b6976bcb98ed48b95d7 Mon Sep 17 00:00:00 2001 From: goyuken Date: Mon, 3 Dec 2012 01:48:18 +0000 Subject: [PATCH] snes: cpu tracelogging. <1% extra overhead incurred when the tracer is not active. --- .../Consoles/Nintendo/SNES/LibsnesCore.cs | 24 +++++++++++++--- .../output/dll/libsneshawk.dll | Bin 2473782 -> 2475088 bytes libsnes/bsnes/snes/cpu/cpu.cpp | 10 ++++++- libsnes/bsnes/snes/interface/interface.cpp | 3 ++ libsnes/bsnes/snes/interface/interface.hpp | 11 ++++--- libsnes/bsnes/target-libsnes/libsnes.cpp | 27 ++++++++++++++++-- libsnes/bsnes/target-libsnes/libsnes.hpp | 3 ++ 7 files changed, 66 insertions(+), 12 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs b/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs index 4487879cd6..ea814b2ca4 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs @@ -79,6 +79,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES public delegate void snes_scanlineStart_t(int line); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate string snes_path_request_t(int slot, string hint); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void snes_trace_t(string msg); [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void snes_set_video_refresh(snes_video_refresh_t video_refresh); @@ -132,6 +134,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void snes_dequeue_message(IntPtr strBuffer); + [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void snes_set_trace_callback(snes_trace_t callback); + [DllImport("libsneshawk.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void snes_set_color_lut(IntPtr colors); @@ -394,6 +399,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES return test; } + void snes_trace(string msg) + { + CoreInputComm.Tracer.Put(msg); + } + public SnesColors.ColorType CurrPalette { get; private set; } public void SetPalette(SnesColors.ColorType pal) @@ -439,9 +449,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES pathRequest_cb = new LibsnesDll.snes_path_request_t(snes_path_request); BizHawk.Emulation.Consoles.Nintendo.SNES.LibsnesDll.snes_set_path_request(pathRequest_cb); - scanlineStart_cb = new LibsnesDll.snes_scanlineStart_t(snes_scanlineStart); + tracecb = new LibsnesDll.snes_trace_t(snes_trace); + // set default palette. Should be overridden by frontend probably SetPalette(SnesColors.ColorType.BizHawk); @@ -483,6 +494,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES CoreOutputComm.VsyncDen = 1; } + CoreOutputComm.CpuTraceAvailable = true; + LibsnesDll.snes_power(); SetupMemoryDomains(romData); @@ -509,6 +522,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES LibsnesDll.snes_audio_sample_t soundcb; LibsnesDll.snes_scanlineStart_t scanlineStart_cb; LibsnesDll.snes_path_request_t pathRequest_cb; + LibsnesDll.snes_trace_t tracecb; ushort snes_input_state(int port, int device, int index, int id) { @@ -628,6 +642,11 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES savestatebuff = ms.ToArray(); } + if (!nocallbacks && CoreInputComm.Tracer.Enabled) + LibsnesDll.snes_set_trace_callback(tracecb); + else + LibsnesDll.snes_set_trace_callback(null); + // speedup when sound rendering is not needed if (!rendersound) LibsnesDll.snes_set_audio_sample(null); @@ -1039,9 +1058,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES public IList MemoryDomains { get; private set; } public MemoryDomain MainMemory { get; private set; } - - - #region audio stuff Sound.Utilities.SpeexResampler resampler; diff --git a/BizHawk.MultiClient/output/dll/libsneshawk.dll b/BizHawk.MultiClient/output/dll/libsneshawk.dll index 2e42ae821f555399591625490c3821b34636b7ee..89875bf9ad90831342896e8a4a77d5fa4a5fffd0 100644 GIT binary patch delta 396621 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