BizHawk/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.ITraceable.cs

46 lines
1.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BizHawk.Emulation.Common;
using BizHawk.Common.NumberExtensions;
namespace BizHawk.Emulation.Cores.Sony.PSX
{
public partial class Octoshock
{
public TraceBuffer Tracer { get; private set; }
public static string TraceHeader = "R3000A: PC, machine code, mnemonic, operands, registers (GPRs, lo, hi, sr, cause, epc)";
OctoshockDll.ShockCallback_Trace trace_cb;
public void ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis)
{
var regs = GetCpuFlagsAndRegisters();
StringBuilder sb = new StringBuilder();
foreach (var r in regs)
{
if (r.Key != "pc")
sb.Append($"{r.Key}:{r.Value.Value.ToHexString(r.Value.BitSize / 4)} ");
}
Tracer.Put(new TraceInfo
{
Disassembly = $"{PC:X8}: {inst:X8} {dis.PadRight(30)}",
RegisterInfo = sb.ToString().Trim()
});
}
private void ConnectTracer()
{
trace_cb = new OctoshockDll.ShockCallback_Trace(ShockTraceCallback);
Tracer = new TraceBuffer() { Header = TraceHeader };
ServiceProvider = new BasicServiceProvider(this);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
}
}
}