BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.ITraceable.cs

66 lines
1.9 KiB
C#
Raw Normal View History

2016-08-13 17:36:26 +00:00
using System;
using System.Runtime.InteropServices;
using System.Text;
using BizHawk.Common.NumberExtensions;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Nintendo.N64.NativeApi;
2016-08-13 17:36:26 +00:00
namespace BizHawk.Emulation.Cores.Nintendo.N64
{
partial class N64
2016-08-13 17:36:26 +00:00
{
public TraceBuffer Tracer { get; private set; }
2016-08-13 17:36:26 +00:00
private mupen64plusApi.TraceCallback _tracecb;
public void MakeTrace()
2016-08-13 17:36:26 +00:00
{
var regs = GetCpuFlagsAndRegisters();
uint pc = (uint)regs["PC"].Value;
var length = 0;
var disasm = Disassemble(MemoryDomains.SystemBus, pc, out length);
2016-08-13 17:36:26 +00:00
var traceInfo = new TraceInfo
2016-08-13 17:36:26 +00:00
{
2019-04-03 16:41:18 +00:00
Disassembly = $"{pc:X}: {disasm.PadRight(32)}"
};
2016-08-13 17:36:26 +00:00
var sb = new StringBuilder();
2016-08-13 17:36:26 +00:00
for (int i = 1; i < 32; i++) // r0 is always zero
{
UInt64 val = (regs[GPRnames[i] + "_hi"].Value << 32) | regs[GPRnames[i] + "_lo"].Value;
string name = GPRnames[i];
2019-04-03 16:41:18 +00:00
sb.Append($"{name}:{val:X16} ");
}
2019-04-03 16:41:18 +00:00
sb.Append($"LL:{regs["LL"].Value:X8} ");
sb.Append($"LO:{regs["LO_hi"].Value:X8}{regs["LO_lo"].Value:X8} ");
sb.Append($"HI:{regs["HI_hi"].Value:X8}{regs["HI_lo"].Value:X8} ");
sb.Append($"FCR0:{regs["FCR0"].Value:X8} ");
sb.Append($"FCR31:{regs["FCR31"].Value:X8} ");
2016-08-21 09:46:29 +00:00
for (int i = 0; i < 32; i++) // r0 is always zero
{
UInt64 val = (regs["CP1 FGR REG" + i + "_hi"].Value << 32) | regs["CP1 FGR REG" + i + "_lo"].Value;
2019-04-03 16:41:18 +00:00
sb.Append($"f{i}:{val:X16} ");
2016-08-21 09:46:29 +00:00
}
// drop MMU co-processor regs for now
traceInfo.RegisterInfo = sb.ToString().Trim();
Tracer.Put(traceInfo);
}
2016-08-21 09:46:29 +00:00
private const string TraceHeader = "r3400: PC, mnemonic, operands, registers (GPRs, Load/Link Bit, MultHI, MultLO, Implementation/Revision, Control/Status, FGRs)";
private void ConnectTracer()
{
Tracer = new TraceBuffer { Header = TraceHeader };
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
_tracecb = new mupen64plusApi.TraceCallback(MakeTrace);
2016-08-13 17:36:26 +00:00
}
}
}