gpgx: move to normal tracing method too

CallbackBasedTraceBuffer seems deprecated
This commit is contained in:
feos 2016-08-14 22:29:42 +03:00
parent 799afc6b0a
commit 8e92c5fd17
9 changed files with 70 additions and 48 deletions

View File

@ -108,7 +108,7 @@ namespace BizHawk.Client.EmuHawk
{ {
if (ToWindowRadio.Checked) if (ToWindowRadio.Checked)
TraceView.VirtualListSize = _instructions.Count; TraceView.VirtualListSize = _instructions.Count;
else else if (_streamWriter != null)
{ {
_streamWriter.Close(); _streamWriter.Close();
_streamWriter = null; _streamWriter = null;

View File

@ -48,6 +48,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
Frame++; Frame++;
_drivelight = false; _drivelight = false;
if (Tracer.Enabled)
LibGPGX.gpgx_set_trace_callback(_tracecb);
else
LibGPGX.gpgx_set_trace_callback(null);
LibGPGX.gpgx_advance(); LibGPGX.gpgx_advance();
UpdateVideo(); UpdateVideo();
update_audio(); update_audio();

View File

@ -9,58 +9,60 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
{ {
public partial class GPGX public partial class GPGX
{ {
private readonly ITraceable Tracer; public TraceBuffer Tracer { get; private set; }
public class GPGXTraceBuffer : CallbackBasedTraceBuffer private LibGPGX.trace_cb _tracecb;
private void MakeTrace()
{ {
public GPGXTraceBuffer(IDebuggable debuggableCore, IMemoryDomains memoryDomains, IDisassemblable disassembler) var regs = GetCpuFlagsAndRegisters();
: base(debuggableCore, memoryDomains, disassembler) uint pc = (uint)regs["M68K PC"].Value;
var length = 0;
var disasm = Disassemble(MemoryDomains.SystemBus, pc, out length).PadRight(40);
var traceInfo = new TraceInfo
{ {
Header = "M68K: PC, machine code, mnemonic, arguments, registers (D0-D7, A0-A7, SR, USP, status flags)"; Disassembly = string.Format("{0:X6}: {1}", pc, disasm)
} };
public override void TraceFromCallback() var sb = new StringBuilder();
foreach (var r in regs)
{ {
var regs = DebuggableCore.GetCpuFlagsAndRegisters(); if (r.Key.StartsWith("M68K")) // drop Z80 regs until it has its own debugger/tracer
uint pc = (uint)regs["M68K PC"].Value;
var length = 0;
var disasm = Disassembler.Disassemble(MemoryDomains.SystemBus, pc, out length);
var traceInfo = new TraceInfo
{ {
Disassembly = string.Format("{0:X6}: {1}", pc, disasm) if (r.Key != "M68K SP" && r.Key != "M68K ISP" && // copies of a7
}; r.Key != "M68K PC" && // already present in every line start
r.Key != "M68K IR") // copy of last opcode, already shown in raw bytes
var sb = new StringBuilder();
foreach (var r in regs)
{
if (r.Key.StartsWith("M68K")) // drop Z80 regs until it has its own debugger/tracer
{ {
if (r.Key != "M68K SP" && r.Key != "M68K ISP" && // copies of a7 sb.Append(
r.Key != "M68K PC" && // already present in every line start string.Format("{0}:{1} ",
r.Key != "M68K IR") // copy of last opcode, already shown in raw bytes r.Key.Replace("M68K", string.Empty).Trim(),
{ r.Value.Value.ToHexString(r.Value.BitSize / 4)));
sb.Append(
string.Format("{0}:{1} ",
r.Key.Replace("M68K", string.Empty).Trim(),
r.Value.Value.ToHexString(r.Value.BitSize / 4)));
}
} }
} }
var sr = regs["M68K SR"].Value;
sb.Append(
string.Format("{0}{1}{2}{3}{4}",
(sr & 16) > 0 ? "X" : "x",
(sr & 8) > 0 ? "N" : "n",
(sr & 4) > 0 ? "Z" : "z",
(sr & 2) > 0 ? "V" : "v",
(sr & 1) > 0 ? "C" : "c"));
traceInfo.RegisterInfo = sb.ToString().Trim();
Put(traceInfo);
} }
var sr = regs["M68K SR"].Value;
sb.Append(
string.Format("{0}{1}{2}{3}{4}",
(sr & 16) > 0 ? "X" : "x",
(sr & 8) > 0 ? "N" : "n",
(sr & 4) > 0 ? "Z" : "z",
(sr & 2) > 0 ? "V" : "v",
(sr & 1) > 0 ? "C" : "c"));
traceInfo.RegisterInfo = sb.ToString().Trim();
Tracer.Put(traceInfo);
}
private const string TraceHeader = "M68K: PC, machine code, mnemonic, arguments, registers (D0-D7, A0-A7, SR, USP, status flags)";
private void ConnectTracer()
{
Tracer = new TraceBuffer { Header = TraceHeader };
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
_tracecb = new LibGPGX.trace_cb(MakeTrace);
} }
} }
} }

View File

@ -164,8 +164,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
InitMemCallbacks(); InitMemCallbacks();
KillMemCallbacks(); KillMemCallbacks();
Tracer = new GPGXTraceBuffer(this, MemoryDomains, this); ConnectTracer();
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
} }
catch catch
{ {

View File

@ -155,12 +155,18 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void mem_cb(uint addr); public delegate void mem_cb(uint addr);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CDCallback(int addr, CDLog_AddrType addrtype, CDLog_Flags flags);
[DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void gpgx_set_mem_callback(mem_cb read, mem_cb write, mem_cb exec); public static extern void gpgx_set_mem_callback(mem_cb read, mem_cb write, mem_cb exec);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void trace_cb();
[DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void gpgx_set_trace_callback(trace_cb cb);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CDCallback(int addr, CDLog_AddrType addrtype, CDLog_Flags flags);
[DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("libgenplusgx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void gpgx_set_cd_callback(CDCallback cd); public static extern void gpgx_set_cd_callback(CDCallback cd);

View File

@ -8,6 +8,7 @@ typedef void (*CDCallback)(int32 addr, int32 addrtype, int32 flags);
extern void (*biz_execcb)(unsigned addr); extern void (*biz_execcb)(unsigned addr);
extern void (*biz_readcb)(unsigned addr); extern void (*biz_readcb)(unsigned addr);
extern void (*biz_writecb)(unsigned addr); extern void (*biz_writecb)(unsigned addr);
extern void (*biz_tracecb)(void);
extern CDCallback biz_cdcallback; extern CDCallback biz_cdcallback;
extern unsigned biz_lastpc; extern unsigned biz_lastpc;

View File

@ -60,6 +60,7 @@ extern void zap(void);
void (*biz_execcb)(unsigned addr) = NULL; void (*biz_execcb)(unsigned addr) = NULL;
void (*biz_readcb)(unsigned addr) = NULL; void (*biz_readcb)(unsigned addr) = NULL;
void (*biz_writecb)(unsigned addr) = NULL; void (*biz_writecb)(unsigned addr) = NULL;
void (*biz_tracecb)(void) = NULL;
CDCallback biz_cdcallback = NULL; CDCallback biz_cdcallback = NULL;
unsigned biz_lastpc = 0; unsigned biz_lastpc = 0;
@ -595,6 +596,11 @@ GPGX_EX void gpgx_set_mem_callback(void (*read)(unsigned), void (*write)(unsigne
biz_execcb = exec; biz_execcb = exec;
} }
GPGX_EX void gpgx_set_trace_callback(void (*trace)(void))
{
biz_tracecb = trace;
}
GPGX_EX void gpgx_set_cd_callback(CDCallback cdcallback) GPGX_EX void gpgx_set_cd_callback(CDCallback cdcallback)
{ {
biz_cdcallback = cdcallback; biz_cdcallback = cdcallback;

View File

@ -339,6 +339,9 @@ void m68k_run(unsigned int cycles)
/* Set the address space for reads */ /* Set the address space for reads */
m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */ m68ki_use_data_space() /* auto-disable (see m68kcpu.h) */
if (biz_tracecb)
biz_tracecb();
if (biz_execcb) if (biz_execcb)
biz_execcb(REG_PC); biz_execcb(REG_PC);

Binary file not shown.