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)
TraceView.VirtualListSize = _instructions.Count;
else
else if (_streamWriter != null)
{
_streamWriter.Close();
_streamWriter = null;

View File

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

View File

@ -9,58 +9,60 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.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)
: base(debuggableCore, memoryDomains, disassembler)
var regs = GetCpuFlagsAndRegisters();
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();
uint pc = (uint)regs["M68K PC"].Value;
var length = 0;
var disasm = Disassembler.Disassemble(MemoryDomains.SystemBus, pc, out length);
var traceInfo = new TraceInfo
if (r.Key.StartsWith("M68K")) // drop Z80 regs until it has its own debugger/tracer
{
Disassembly = string.Format("{0:X6}: {1}", pc, disasm)
};
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
r.Key != "M68K PC" && // already present in every line start
r.Key != "M68K IR") // copy of last opcode, already shown in raw bytes
{
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
{
sb.Append(
string.Format("{0}:{1} ",
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();
KillMemCallbacks();
Tracer = new GPGXTraceBuffer(this, MemoryDomains, this);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
ConnectTracer();
}
catch
{

View File

@ -155,12 +155,18 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
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)]
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)]
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_readcb)(unsigned addr);
extern void (*biz_writecb)(unsigned addr);
extern void (*biz_tracecb)(void);
extern CDCallback biz_cdcallback;
extern unsigned biz_lastpc;

View File

@ -60,6 +60,7 @@ extern void zap(void);
void (*biz_execcb)(unsigned addr) = NULL;
void (*biz_readcb)(unsigned addr) = NULL;
void (*biz_writecb)(unsigned addr) = NULL;
void (*biz_tracecb)(void) = NULL;
CDCallback biz_cdcallback = NULL;
unsigned biz_lastpc = 0;
@ -595,6 +596,11 @@ GPGX_EX void gpgx_set_mem_callback(void (*read)(unsigned), void (*write)(unsigne
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)
{
biz_cdcallback = cdcallback;

View File

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

Binary file not shown.