gpgx: move to normal tracing method too
CallbackBasedTraceBuffer seems deprecated
This commit is contained in:
parent
799afc6b0a
commit
8e92c5fd17
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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.
Loading…
Reference in New Issue