Refactor ITraceable and related types

This commit is contained in:
YoshiRulz 2021-08-01 21:36:45 +10:00
parent 9ec72fd543
commit 4973e3eba1
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
74 changed files with 190 additions and 374 deletions

View File

@ -15,8 +15,10 @@ namespace BizHawk.Emulation.Common
/// </summary>
public abstract class CallbackBasedTraceBuffer : ITraceable
{
private const string DEFAULT_HEADER = "Instructions";
/// <exception cref="InvalidOperationException"><paramref name="debuggableCore"/> does not provide memory callback support or does not implement <see cref="IDebuggable.GetCpuFlagsAndRegisters"/></exception>
protected CallbackBasedTraceBuffer(IDebuggable debuggableCore, IMemoryDomains memoryDomains, IDisassemblable disassembler)
protected CallbackBasedTraceBuffer(IDebuggable debuggableCore, IMemoryDomains memoryDomains, IDisassemblable disassembler, string header = DEFAULT_HEADER)
{
if (!debuggableCore.MemoryCallbacksAvailable())
{
@ -32,7 +34,7 @@ namespace BizHawk.Emulation.Common
throw new InvalidOperationException($"{nameof(IDebuggable.GetCpuFlagsAndRegisters)} is required");
}
Header = "Instructions";
Header = header;
DebuggableCore = debuggableCore;
MemoryDomains = memoryDomains;
Disassembler = disassembler;
@ -48,20 +50,9 @@ namespace BizHawk.Emulation.Common
private ITraceSink _sink;
public bool Enabled => Sink != null;
public void Put(TraceInfo info)
{
Sink.Put(info);
}
public ITraceSink Sink
{
private get
{
return _sink;
}
get => _sink;
set
{
_sink = value;
@ -75,7 +66,7 @@ namespace BizHawk.Emulation.Common
}
}
public string Header { get; protected set; }
public string Header { get; }
private class TracingMemoryCallback : IMemoryCallback
{

View File

@ -1,6 +1,4 @@
#nullable disable
namespace BizHawk.Emulation.Common
namespace BizHawk.Emulation.Common
{
/// <summary>
/// A generic implementation of ITraceable that can be used by any core
@ -8,15 +6,12 @@ namespace BizHawk.Emulation.Common
/// <seealso cref="ITraceable" />
public class TraceBuffer : ITraceable
{
public string Header { get; set; } = "Instructions";
private const string DEFAULT_HEADER = "Instructions";
public ITraceSink Sink { private get; set; }
public string Header { get; }
public bool Enabled => Sink != null;
public ITraceSink? Sink { get; set; }
public void Put(TraceInfo info)
{
Sink.Put(info);
}
public TraceBuffer(string header = DEFAULT_HEADER) => Header = header;
}
}

View File

@ -484,5 +484,10 @@ namespace BizHawk.Emulation.Common
public static string SystemIDToDisplayName(string sysID)
=> SystemIDDisplayNames.TryGetValue(sysID, out var dispName) ? dispName : string.Empty;
public static bool IsEnabled(this ITraceable core) => core.Sink is not null;
/// <remarks>TODO no-op instead of NRE when not "enabled"?</remarks>
public static void Put(this ITraceable core, TraceInfo info) => core.Sink.Put(info);
}
}

View File

@ -1,6 +1,4 @@
#nullable disable
namespace BizHawk.Emulation.Common
namespace BizHawk.Emulation.Common
{
public interface ITraceSink
{
@ -23,25 +21,19 @@ namespace BizHawk.Emulation.Common
/// that's right, we can only have one sink.
/// a sink can route to two other sinks if it has to, though
/// </summary>
ITraceSink Sink { set; }
/// <summary>
/// Gets a value indicating whether tracing is enabled
/// This is defined as equivalent to Sink != null
/// It's put here because it's such a common operation to check whether it's enabled, and it's not nice to write Sink != null all over
/// </summary>
bool Enabled { get; }
/// <summary>
/// This is defined as equivalent to Sink.Put
/// TBD: could it be defined as equivalent to if(Enabled) Sink.Put()? Probably not, that's just a small amount of wasted work
/// </summary>
void Put(TraceInfo info);
ITraceSink? Sink { get; set; }
}
public class TraceInfo
public readonly struct TraceInfo
{
public string Disassembly { get; set; }
public string RegisterInfo { get; set; }
public readonly string Disassembly;
public readonly string RegisterInfo;
public TraceInfo(string disassembly, string registerInfo)
{
Disassembly = disassembly;
RegisterInfo = registerInfo;
}
}
}

View File

@ -19,11 +19,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
public int opcode;
public TraceInfo CP1610State(bool disassemble = true)
{
return new TraceInfo
{
Disassembly = $"{RegisterPC - 1:X4}: {opcode:X2} {(disassemble ? Disassemble((ushort)(RegisterPC - 1), out _) : "---")} ".PadRight(26),
RegisterInfo = string.Join(" ",
=> new(
disassembly: $"{RegisterPC - 1:X4}: {opcode:X2} {(disassemble ? Disassemble((ushort)(RegisterPC - 1), out _) : "---")} ".PadRight(26),
registerInfo: string.Join(" ",
new[]
{
$"Cy:{TotalExecutedCycles}",
@ -34,10 +32,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
FlagO ? "O" : "o",
FlagI ? "I" : "i",
FlagD ? "D" : "d")
}
.Concat(Register.Select((r, i) => $"R{i}:{4:X4}")))
};
}
}.Concat(Register.Select((r, i) => $"R{i}:{4:X4}"))));
private void Calc_FlagC(int result)
{

View File

@ -381,11 +381,9 @@ namespace BizHawk.Emulation.Cores.Components.H6280
public string TraceHeader => "HuC6280: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP, Cy), flags (NVTBDIZC)";
public TraceInfo State()
{
return new TraceInfo
{
Disassembly = $"{MPR[PC >> 13]:X2}:{PC:X4}: {ReadMemory(PC):X2} {Disassemble(PC, out _)} ".PadRight(30),
RegisterInfo = string.Join(" ",
=> new(
disassembly: $"{MPR[PC >> 13]:X2}:{PC:X4}: {ReadMemory(PC):X2} {Disassemble(PC, out _)} ".PadRight(30),
registerInfo: string.Join(" ",
$"A:{A:X2}",
$"X:{X:X2}",
$"Y:{Y:X2}",
@ -400,9 +398,7 @@ namespace BizHawk.Emulation.Cores.Components.H6280
FlagD ? "D" : "d",
FlagI ? "I" : "i",
FlagZ ? "Z" : "z",
FlagC ? "C" : "c"))
};
}
FlagC ? "C" : "c")));
private static readonly byte[] TableNZ =
{

View File

@ -448,7 +448,7 @@ namespace BizHawk.Emulation.Cores.Components.I8048
{
IRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
IRQ_(0);
IRQCallback();
@ -458,7 +458,7 @@ namespace BizHawk.Emulation.Cores.Components.I8048
{
TIRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====TIRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====TIRQ====", registerInfo: string.Empty));
IRQ_(1);
IRQCallback();
@ -522,11 +522,9 @@ namespace BizHawk.Emulation.Cores.Components.I8048
public string TraceHeader => "I8048: PC, machine code, mnemonic, operands, registers (A, B, X, Y, US, SP, DP, CC), Cy, flags (CAFBIFT0T1TFR)";
public TraceInfo State(bool disassemble = true)
{
return new TraceInfo
{
Disassembly = $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
RegisterInfo = string.Format(
=> new(
disassembly: $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
registerInfo: string.Format(
"A:{0:X2} R0:{1:X2} R1:{2:X2} R2:{3:X2} R3:{4:X2} R4:{5:X2} R5:{6:X2} R6:{7:X2} R7:{8:X2} PSW:{9:X4} Cy:{10} LY:{11} {12}{13}{14}{15}{16}{17}{18}{19}{20}{21}{22}",
Regs[A],
Regs[(ushort)(R0 + RB)],
@ -550,10 +548,7 @@ namespace BizHawk.Emulation.Cores.Components.I8048
T0 ? "T" : "t",
T1 ? "T" : "t",
TF ? "T" : "t",
RB > 0 ? "R" : "r"
)
};
}
RB > 0 ? "R" : "r"));
/// <summary>
/// Optimization method to set cur_instr

View File

@ -164,11 +164,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
{
interrupts_enabled = false;
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====IRQ====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
// call interrupt processor
// lowest bit set is highest priority
@ -333,11 +329,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
{
interrupts_enabled = false;
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====IRQ====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
RegPC--;
@ -347,11 +339,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
}
else
{
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====un-halted====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====un-halted====", registerInfo: string.Empty));
OnExecFetch?.Invoke(RegPC);
if (TraceCallback != null && !CB_prefix) TraceCallback(State(useRGBDSSyntax));
@ -364,11 +352,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
{
interrupts_enabled = false;
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====IRQ====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
halted = false;
if (Halt_bug_4)
@ -407,11 +391,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
else if (temp)
{
// even if interrupt servicing is disabled, any interrupt flag raised still resumes execution
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====un-halted====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====un-halted====", registerInfo: string.Empty));
halted = false;
if (is_GBC)
@ -493,21 +473,13 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
interrupts_enabled = false;
I_use = false;
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====un-stop====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====un-stop====", registerInfo: string.Empty));
stopped = false;
stop_check = false;
stop_time = 0;
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====IRQ====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
// call interrupt processor
// lowest bit set is highest priority
@ -527,11 +499,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
if (stop_time == 0)
{
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====un-stop====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====un-stop====", registerInfo: string.Empty));
stopped = false;
@ -555,11 +523,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
if ((buttons_pressed & 0xF) != 0xF)
{
// TODO: On a gameboy, you can only un-STOP once, needs further testing
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====un-stop====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====un-stop====", registerInfo: string.Empty));
stopped = false;
OnExecFetch?.Invoke(RegPC);
@ -753,11 +717,9 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
public string TraceHeader => "LR35902: PC, machine code, mnemonic, operands, registers (A, F, B, C, D, E, H, L, SP), Cy, flags (ZNHCI)";
public TraceInfo State(bool useRGBDSSyntax, bool disassemble = true)
{
return new TraceInfo
{
Disassembly = $"{(disassemble ? Disassemble(RegPC, ReadMemory, useRGBDSSyntax, out _) : "---")} ".PadRight(40),
RegisterInfo = string.Join(" ",
=> new(
disassembly: $"{(disassemble ? Disassemble(RegPC, ReadMemory, useRGBDSSyntax, out _) : "---")} ".PadRight(40),
registerInfo: string.Join(" ",
$"A:{Regs[A]:X2}",
$"F:{Regs[F]:X2}",
$"B:{Regs[B]:X2}",
@ -775,9 +737,7 @@ namespace BizHawk.Emulation.Cores.Components.LR35902
FlagH ? "H" : "h",
FlagC ? "C" : "c",
FlagI ? "I" : "i",
interrupts_enabled ? "E" : "e"))
};
}
interrupts_enabled ? "E" : "e")));
private void FetchInstruction(int op)
{

View File

@ -433,7 +433,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6800
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI NMI====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====CWAI NMI====", registerInfo: string.Empty));
}
else if (IRQPending && !FlagI)
{
@ -446,7 +446,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6800
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====CWAI IRQ====", registerInfo: string.Empty));
}
else
{
@ -465,7 +465,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6800
{
NMIPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====NMI====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====NMI====", registerInfo: string.Empty));
NMI_();
NMICallback();
@ -476,7 +476,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6800
{
IRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
IRQ_();
IRQCallback();
@ -501,11 +501,9 @@ namespace BizHawk.Emulation.Cores.Components.MC6800
public string TraceHeader => "MC6809: PC, machine code, mnemonic, operands, registers (A, B, X, SP, CC), Cy, flags (EHINZVC)";
public TraceInfo State(bool disassemble = true)
{
return new TraceInfo
{
Disassembly = $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
RegisterInfo = string.Format(
=> new(
disassembly: $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
registerInfo: string.Format(
"A:{0:X2} B:{1:X2} X:{2:X4} SP:{3:X4} CC:{4:X2} Cy:{5} {6}{7}{8}{9}{10}{11}",
Regs[A],
Regs[B],
@ -518,10 +516,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6800
FlagN ? "N" : "n",
FlagZ ? "Z" : "z",
FlagV ? "V" : "v",
FlagC ? "C" : "c"
)
};
}
FlagC ? "C" : "c"));
/// <summary>
/// Optimization method to set cur_instr

View File

@ -473,7 +473,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI NMI====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====CWAI NMI====", registerInfo: string.Empty));
}
else if (FIRQPending && !FlagF)
{
@ -486,7 +486,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI FIRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====CWAI FIRQ====", registerInfo: string.Empty));
}
else if (IRQPending && !FlagI)
{
@ -499,7 +499,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====CWAI IRQ====", registerInfo: string.Empty));
}
else
{
@ -522,7 +522,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====SYNC NMI====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====SYNC NMI====", registerInfo: string.Empty));
}
else if (FIRQPending)
{
@ -537,7 +537,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====SYNC FIRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====SYNC FIRQ====", registerInfo: string.Empty));
}
else
{
@ -563,7 +563,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1;
IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====SYNC IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====SYNC IRQ====", registerInfo: string.Empty));
}
else
{
@ -593,7 +593,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
{
NMIPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====NMI====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====NMI====", registerInfo: string.Empty));
NMI_();
NMICallback();
@ -604,7 +604,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
{
FIRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====FIRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====FIRQ====", registerInfo: string.Empty));
FIRQ_();
FIRQCallback();
@ -615,7 +615,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
{
IRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
IRQ_();
IRQCallback();
instr_pntr = irq_pntr = 0;
@ -639,11 +639,9 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
public string TraceHeader => "MC6809: PC, machine code, mnemonic, operands, registers (A, B, X, Y, US, SP, DP, CC), Cy, flags (EFHINZVC)";
public TraceInfo State(bool disassemble = true)
{
return new TraceInfo
{
Disassembly = $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
RegisterInfo = string.Format(
=> new(
disassembly: $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
registerInfo: string.Format(
"A:{0:X2} B:{1:X2} X:{2:X4} Y:{3:X4} US:{4:X4} SP:{5:X4} DP:{6:X2} CC:{7:X2} Cy:{8} {9}{10}{11}{12}{13}{14}{15}{16}",
Regs[A],
Regs[B],
@ -661,10 +659,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
FlagN ? "N" : "n",
FlagZ ? "Z" : "z",
FlagV ? "V" : "v",
FlagC ? "C" : "c"
)
};
}
FlagC ? "C" : "c"));
/// <summary>
/// Optimization method to set cur_instr

View File

@ -561,12 +561,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
interrupt_pending = false;
if (NMI)
{
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====NMI====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====NMI====", registerInfo: string.Empty));
ea = NMIVector;
opcode = VOP_NMI;
NMI = false;
@ -577,11 +572,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
if (IRQ && !my_iflag)
{
TraceCallback?.Invoke(new TraceInfo
{
Disassembly = "====IRQ====",
RegisterInfo = ""
});
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
ea = IRQVector;
opcode = VOP_IRQ;
mi = 0;

View File

@ -94,13 +94,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
public TraceInfo State(bool disassemble = true)
{
if (!disassemble)
{
return new TraceInfo {
Disassembly = "",
RegisterInfo = ""
};
}
if (!disassemble) return new(disassembly: string.Empty, registerInfo: string.Empty);
string rawbytes = "";
string disasm = Disassemble(PC, out var length);
@ -110,10 +104,9 @@ namespace BizHawk.Emulation.Cores.Components.M6502
rawbytes += $" {_link.PeekMemory((ushort)(PC + i)):X2}";
}
return new TraceInfo
{
Disassembly = $"{PC:X4}: {rawbytes,-9} {disasm} ".PadRight(32),
RegisterInfo = string.Join(" ",
return new(
disassembly: $"{PC:X4}: {rawbytes,-9} {disasm} ".PadRight(32),
registerInfo: string.Join(" ",
$"A:{A:X2}",
$"X:{X:X2}",
$"Y:{Y:X2}",
@ -131,8 +124,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
// !RDY ? "R" : "r"
),
$"Cy:{TotalExecutedCycles}",
$"PPU-Cy:{ext_ppu_cycle}")
};
$"PPU-Cy:{ext_ppu_cycle}"));
}
public bool AtStart => opcode == VOP_Fetch1 || Microcode[opcode][mi] >= Uop.End;

View File

@ -775,7 +775,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
{
nonMaskableInterruptPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====NMI====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====NMI====", registerInfo: string.Empty));
iff2 = iff1;
iff1 = false;
@ -796,7 +796,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
iff1 = iff2 = false;
EI_pending = 0;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" });
TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
switch (interruptMode)
{
@ -867,10 +867,9 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
}
}
return new TraceInfo
{
Disassembly = $"{RegPC:X4}: {byte_code.PadRight(12)} {disasm.PadRight(26)}",
RegisterInfo = string.Join(" ",
return new(
disassembly: $"{RegPC:X4}: {byte_code.PadRight(12)} {disasm.PadRight(26)}",
registerInfo: string.Join(" ",
$"AF:{(Regs[A] << 8) + Regs[F]:X4}",
$"BC:{(Regs[B] << 8) + Regs[C]:X4}",
$"DE:{(Regs[D] << 8) + Regs[E]:X4}",
@ -888,8 +887,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
Flag5 ? "5" : "-",
FlagZ ? "Z" : "z",
FlagS ? "S" : "s",
FlagI ? "E" : "e"))
};
FlagI ? "E" : "e")));
}
/// <summary>

View File

@ -13,7 +13,7 @@ namespace BizHawk.Emulation.Cores.Calculators
_controller = controller;
_lagged = true;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -32,7 +32,7 @@ namespace BizHawk.Emulation.Cores.Calculators
HardReset();
SetupMemoryDomains();
_tracer = new TraceBuffer { Header = _cpu.TraceHeader };
_tracer = new TraceBuffer(_cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
ser.Register<IDisassemblable>(_cpu);

View File

@ -27,7 +27,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC
_isLag = true;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -24,7 +24,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC
CoreComm = lp.Comm;
_gameInfo = lp.Roms.Select(r => r.Game).ToList();
_cpu = new Z80A();
_tracer = new TraceBuffer { Header = _cpu.TraceHeader };
_tracer = new TraceBuffer(_cpu.TraceHeader);
_files = lp.Roms.Select(r => r.RomData).ToList();
var settings = lp.Settings ?? new AmstradCPCSettings();

View File

@ -139,7 +139,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
private void StepInto()
{
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_machine.Cpu.TraceCallback = TracerWrapper;
}

View File

@ -24,10 +24,8 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
var ser = new BasicServiceProvider(this);
ServiceProvider = ser;
_tracer = new TraceBuffer
{
Header = "6502: PC, opcode, register (A, X, Y, P, SP, Cy), flags (NVTBDIZC)"
};
const string TRACE_HEADER = "6502: PC, opcode, register (A, X, Y, P, SP, Cy), flags (NVTBDIZC)";
_tracer = new TraceBuffer(TRACE_HEADER);
_disk1 = _romSet[0];
@ -121,17 +119,11 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
private bool _prevPressed;
private void TracerWrapper(string[] content)
{
_tracer.Put(new TraceInfo
{
Disassembly = content[0],
RegisterInfo = content[1]
});
}
=> _tracer.Put(new(disassembly: content[0], registerInfo: content[1]));
private void FrameAdv(IController controller, bool render, bool renderSound)
{
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_machine.Cpu.TraceCallback = TracerWrapper;
}

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
_board.Controller = controller;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_board.Cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -54,7 +54,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
ser.Register<IVideoProvider>(_board.Vic);
ser.Register<IDriveLight>(this);
_tracer = new TraceBuffer { Header = _board.Cpu.TraceHeader };
_tracer = new TraceBuffer(_board.Cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState));

View File

@ -31,7 +31,7 @@ namespace BizHawk.Emulation.Cores.Computers.MSX
if (current_controller == MSXControllerKB) { kb_rows_check(controller); }
if (Tracer.Enabled)
if (Tracer.IsEnabled())
{
tracecb = MakeTrace;
}

View File

@ -81,7 +81,7 @@ namespace BizHawk.Emulation.Cores.Computers.MSX
Console.WriteLine(Header_Length + " " + Disasm_Length + " " + Reg_String_Length);
Tracer = new TraceBuffer { Header = newHeader.ToString() };
Tracer = new TraceBuffer(newHeader.ToString());
var serviceProvider = ServiceProvider as BasicServiceProvider;
serviceProvider.Register<ITraceable>(Tracer);
@ -132,11 +132,7 @@ namespace BizHawk.Emulation.Cores.Computers.MSX
LibMSX.MSX_getdisassembly(MSX_Pntr, new_d, t, Disasm_Length);
LibMSX.MSX_getregisterstate(MSX_Pntr, new_r, t, Reg_String_Length);
Tracer.Put(new TraceInfo
{
Disassembly = new_d.ToString().PadRight(36),
RegisterInfo = new_r.ToString()
});
Tracer.Put(new(disassembly: new_d.ToString().PadRight(36), registerInfo: new_r.ToString()));
}
private readonly MemoryCallbackSystem _memorycallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

View File

@ -27,7 +27,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
_isLag = true;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -29,7 +29,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
_cpu = new Z80A();
_tracer = new TraceBuffer { Header = _cpu.TraceHeader };
_tracer = new TraceBuffer(_cpu.TraceHeader);
_files = lp.Roms.Select(r => r.RomData).ToList();

View File

@ -317,7 +317,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (cyc_counter == 3)
{
_m6532.Timer.Tick();
if (Tracer.Enabled && Cpu.AtStart)
if (Tracer.IsEnabled() && Cpu.AtStart)
{
Tracer.Put(Cpu.TraceState());
}

View File

@ -47,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
RebootCore();
SetupMemoryDomains();
Tracer = new TraceBuffer { Header = Cpu.TraceHeader };
Tracer = new TraceBuffer(Cpu.TraceHeader);
ser.Register<IDisassemblable>(Cpu);
ser.Register<ITraceable>(Tracer);

View File

@ -59,7 +59,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -261,7 +261,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk
ser.Register<ISoundProvider>(this);
ServiceProvider = ser;
_tracer = new TraceBuffer { Header = cpu.TraceHeader };
_tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains();

View File

@ -26,7 +26,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision
}
_isLag = true;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -57,15 +57,14 @@ namespace BizHawk.Emulation.Cores.ColecoVision
LoadRom(rom, skipBios);
SetupMemoryDomains();
_tracer.Header = _cpu.TraceHeader;
ser.Register<IDisassemblable>(_cpu);
ser.Register<ITraceable>(_tracer);
ser.Register<ITraceable>(_tracer = new TraceBuffer(_cpu.TraceHeader));
}
private readonly Z80A _cpu;
private readonly TMS9918A _vdp;
private readonly byte[] _biosRom;
private readonly TraceBuffer _tracer = new TraceBuffer();
private readonly TraceBuffer _tracer;
private byte[] _romData;
private byte[] _ram = new byte[1024];

View File

@ -31,7 +31,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
_controller = controller;
_isLag = false;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
CPU.TraceCallback = s => _tracer.Put(s);
}

View File

@ -25,7 +25,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
DummyReadMemory = ReadBus
};
_tracer = new TraceBuffer { Header = CPU.TraceHeader };
_tracer = new TraceBuffer(CPU.TraceHeader);
var bios01 = comm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131253"));
var bios02 = comm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131254"));

View File

@ -723,14 +723,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
}
}
return new TraceInfo
{
Disassembly = string.Format(
return new(
disassembly: string.Format(
"{0:X4}: {1} {2}",
pc,
byte_code.PadRight(12),
disasm.PadRight(26)),
RegisterInfo = string.Format(
registerInfo: string.Format(
"Flags:{75}{76}{77}{78}{79} " +
"PC1:{0:X4} DC0:{1:X4} A:{2:X2} ISAR:{3:X2} DB:{4:X2} IO:{5:X2} J:{6:X2} H:{7:X4} K:{8:X4} Q:{9:X4} " +
"R0:{10:X2} R1:{11:X2} R2:{12:X2} R3:{13:X2} R4:{14:X2} R5:{15:X2} R6:{16:X2} R7:{17:X2} R8:{18:X2} R9:{19:X2} " +
@ -763,9 +762,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
FlagO ? "O" : "o",
FlagZ ? "Z" : "z",
FlagC ? "C" : "c",
FlagS ? "S" : "s"),
};
FlagS ? "S" : "s"));
}
/// <summary>

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public bool FrameAdvance(IController controller, bool render, bool rendersound)
{
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -102,7 +102,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
_settings = new object(); // TODO: wtf is this
_syncSettings = (VectrexSyncSettings)syncSettings ?? new VectrexSyncSettings();
_tracer = new TraceBuffer { Header = cpu.TraceHeader };
_tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains();

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Intellivision
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -58,7 +58,7 @@ namespace BizHawk.Emulation.Cores.Intellivision
LoadExecutiveRom(comm.CoreFileProvider.GetFirmwareOrThrow(new("INTV", "EROM"), "Executive ROM is required."));
LoadGraphicsRom(comm.CoreFileProvider.GetFirmwareOrThrow(new("INTV", "GROM"), "Graphics ROM is required."));
_tracer = new TraceBuffer { Header = _cpu.TraceHeader };
_tracer = new TraceBuffer(_cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains();

View File

@ -18,7 +18,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{
//Console.WriteLine("-----------------------FRAME-----------------------");
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -79,7 +79,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
ser.Register<IVideoProvider>(this);
ServiceProvider = ser;
_tracer = new TraceBuffer { Header = cpu.TraceHeader };
_tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains();

View File

@ -48,7 +48,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.BSNES
};
// TODO: I really don't think stuff like this should be set every single frame (only on change)
Api.core.snes_set_layer_enables(ref enables);
Api.core.snes_set_trace_enabled(_tracer.Enabled);
Api.core.snes_set_trace_enabled(_tracer.IsEnabled());
Api.core.snes_set_video_enabled(render);
Api.core.snes_set_audio_enabled(renderSound);

View File

@ -138,10 +138,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.BSNES
SetMemoryDomains();
_tracer = new TraceBuffer
{
Header = "65816: PC, mnemonic, operands, registers (A, X, Y, S, D, B, flags (NVMXDIZC), V, H)"
};
const string TRACE_HEADER = "65816: PC, mnemonic, operands, registers (A, X, Y, S, D, B, flags (NVMXDIZC), V, H)";
_tracer = new TraceBuffer(TRACE_HEADER);
ser.Register<IDisassemblable>(new W65816_DisassemblerService());
ser.Register(_tracer);
@ -381,12 +379,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.BSNES
}
private void snes_trace(string disassembly, string registerInfo)
{
_tracer.Put(new TraceInfo
{
Disassembly = disassembly,
RegisterInfo = registerInfo
});
}
=> _tracer.Put(new(disassembly: disassembly, registerInfo: registerInfo));
}
}

View File

@ -66,10 +66,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
ServiceProvider = ser;
PutSettings(_settings);
Tracer = new TraceBuffer
{
Header = "ARM7: PC, machine code, mnemonic, operands, registers"
};
const string TRACE_HEADER = "ARM7: PC, machine code, mnemonic, operands, registers";
Tracer = new TraceBuffer(TRACE_HEADER);
_tracecb = msg => Tracer.Put(_traceInfo(msg));
ser.Register(Tracer);
MemoryCallbacks = new MGBAMemoryCallbackSystem(this);
@ -107,11 +105,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
sb.Append($" { RegisterNames[i] }:{ regs[RegisterNames[i]].Value:X8}");
}
return new TraceInfo
{
Disassembly = $"{pc:X8}: { machineCode } { instruction }".PadRight(50),
RegisterInfo = sb.ToString()
};
return new(
disassembly: $"{pc:X8}: { machineCode } { instruction }".PadRight(50),
registerInfo: sb.ToString());
}
public bool FrameAdvance(IController controller, bool render, bool renderSound = true)
@ -124,7 +120,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
WireMemoryDomainPointers();
}
LibmGBA.BizSetTraceCallback(Core, Tracer.Enabled ? _tracecb : null);
LibmGBA.BizSetTraceCallback(Core, Tracer.IsEnabled() ? _tracecb : null);
IsLagFrame = LibmGBA.BizAdvance(
Core,

View File

@ -45,7 +45,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
ppu.color_palette[3] = color_palette_Gr[3];
}
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -187,7 +187,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
_ = PutSettings(settings ?? new GBSettings());
_syncSettings = (GBSyncSettings)syncSettings ?? new GBSyncSettings();
_tracer = new TraceBuffer { Header = cpu.TraceHeader };
_tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState));
ser.Register<IDisassemblable>(_disassembler);

View File

@ -44,7 +44,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
R.ppu.color_palette[3] = color_palette_Gr[3];
}
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
L.cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -61,7 +61,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink
ser.Register<IVideoProvider>(this);
ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = L.cpu.TraceHeader };
_tracer = new TraceBuffer(L.cpu.TraceHeader);
ser.Register<ITraceable>(_tracer);
_lStates = L.ServiceProvider.GetService<IStatable>();

View File

@ -59,7 +59,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x
R.ppu.color_palette[3] = color_palette_Gr[3];
}
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
L.cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -68,7 +68,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink3x
ser.Register<IVideoProvider>(this);
ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = L.cpu.TraceHeader };
_tracer = new TraceBuffer(L.cpu.TraceHeader);
ser.Register(_tracer);
_lStates = L.ServiceProvider.GetService<IStatable>();

View File

@ -74,7 +74,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x
D.ppu.color_palette[3] = color_palette_Gr[3];
}
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
A.cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -96,7 +96,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink4x
ser.Register<IVideoProvider>(this);
ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = A.cpu.TraceHeader };
_tracer = new TraceBuffer(A.cpu.TraceHeader);
ser.Register(_tracer);
ServiceProvider = ser;

View File

@ -15,16 +15,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
int[] s = new int[14];
System.Runtime.InteropServices.Marshal.Copy(_s, s, 0, 14);
Tracer.Put(new TraceInfo
{
Disassembly =
LR35902.Disassemble(
(ushort) s[1],
addr => (addr == (ushort)s[1]) ? (byte)((s[12] >> 16) & 0xFF) : ((addr == (ushort)s[1] + 1) ? (byte)((s[12] >> 8) & 0xFF) : (byte)(s[12] & 0xFF)),
_settings.RgbdsSyntax,
out _).PadRight(36),
RegisterInfo =
string.Format(
Tracer.Put(new(
disassembly: LR35902.Disassemble(
(ushort) s[1],
addr => (addr == (ushort)s[1]) ? (byte)((s[12] >> 16) & 0xFF) : ((addr == (ushort)s[1] + 1) ? (byte)((s[12] >> 8) & 0xFF) : (byte)(s[12] & 0xFF)),
_settings.RgbdsSyntax,
out _).PadRight(36),
registerInfo: string.Format(
"A:{3:x2} F:{8:x2} B:{4:x2} C:{5:x2} D:{6:x2} E:{7:x2} H:{9:x2} L:{10:x2} LY:{13:x2} SP:{2:x2} {11} Cy:{0}",
s[0],
s[1] & 0xffff,
@ -39,8 +36,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
s[10] & 0xff,
s[11] != 0 ? "skip" : "",
s[12] & 0xffffff,
s[13] & 0xff)
});
s[13] & 0xff)));
}
}
}

View File

@ -24,10 +24,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
var ser = new BasicServiceProvider(this);
ser.Register<IDisassemblable>(_disassembler);
ServiceProvider = ser;
Tracer = new TraceBuffer
{
Header = "LR35902: PC, opcode, registers (A, F, B, C, D, E, H, L, LY, SP, CY)"
};
const string TRACE_HEADER = "LR35902: PC, opcode, registers (A, F, B, C, D, E, H, L, LY, SP, CY)";
Tracer = new TraceBuffer(TRACE_HEADER);
ser.Register<ITraceable>(Tracer);
InitMemoryCallbacks();
@ -327,7 +325,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
LibGambatte.gambatte_reset(GambatteState);
}
if (Tracer.Enabled)
if (Tracer.IsEnabled())
{
_tracecb = MakeTrace;
}

View File

@ -17,11 +17,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
var length = 0;
var disasm = Disassemble(MemoryDomains.SystemBus, pc, out length);
var traceInfo = new TraceInfo
{
Disassembly = $"{pc:X}: {disasm.PadRight(32)}"
};
var sb = new StringBuilder();
for (int i = 1; i < 32; i++) // r0 is always zero
@ -45,16 +40,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
// drop MMU co-processor regs for now
traceInfo.RegisterInfo = sb.ToString().Trim();
Tracer.Put(traceInfo);
Tracer.Put(new(disassembly: $"{pc:X}: {disasm.PadRight(32)}", registerInfo: sb.ToString().Trim()));
}
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 };
Tracer = new TraceBuffer(TraceHeader);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
_tracecb = new mupen64plusApi.TraceCallback(MakeTrace);
}

View File

@ -214,14 +214,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
IsVIFrame = false;
if (Tracer != null && Tracer.Enabled)
{
api.setTraceCallback(_tracecb);
}
else
{
api.setTraceCallback(null);
}
api.setTraceCallback(Tracer?.IsEnabled() is true ? _tracecb : null);
_audioProvider.RenderSound = rendersound;

View File

@ -287,7 +287,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
{
_controller = controller;
if (Tracer.Enabled)
if (Tracer.IsEnabled())
cpu.TraceCallback = s => Tracer.Put(s);
else
cpu.TraceCallback = null;

View File

@ -52,7 +52,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
ser.Register<IDisassemblable>(cpu);
Tracer = new TraceBuffer { Header = cpu.TraceHeader };
Tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(Tracer);
ser.Register<IVideoProvider>(videoProvider);
ser.Register<ISoundProvider>(this);

View File

@ -28,21 +28,19 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
string opcodeStr = MOS6502X.Disassemble(pc, out _, address => _memoryDomains.SystemBus.PeekByte(address));
Tracer.Put(new TraceInfo
{
Disassembly = $"{pc:X4}: {opcodeStr}".PadRight(26),
RegisterInfo = string.Join(" ",
Tracer.Put(new(
disassembly: $"{pc:X4}: {opcodeStr}".PadRight(26),
registerInfo: string.Join(" ",
$"A:{a:X2}",
$"X:{x:X2}",
$"Y:{y:X2}",
$"P:{p:X2}",
$"SP:{sp:X2}")
});
$"SP:{sp:X2}")));
}
private void ConnectTracer()
{
Tracer = new TraceBuffer { Header = TraceHeader };
Tracer = new TraceBuffer(TraceHeader);
((BasicServiceProvider) ServiceProvider).Register<ITraceable>(Tracer);
_traceCb = MakeTrace;
}

View File

@ -194,7 +194,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
SetPads(controller, out var j1, out var j2);
QN.qn_set_tracecb(Context, Tracer.Enabled ? _traceCb : null);
QN.qn_set_tracecb(Context, Tracer.IsEnabled() ? _traceCb : null);
LibQuickNES.ThrowStringError(QN.qn_emulate_frame(Context, j1, j2));
IsLagFrame = QN.qn_get_joypad_read_count(Context) == 0;

View File

@ -20,7 +20,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
IsLagFrame = true;
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
//Api.QUERY_set_trace_callback(1<<(int)LibsnesApi.eTRACE.SMP, _tracecb); //TEST -- it works but theres no way to control it from the frontend now

View File

@ -36,10 +36,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
var ser = new BasicServiceProvider(this);
ServiceProvider = ser;
_tracer = new TraceBuffer
{
Header = "65816: PC, mnemonic, operands, registers (A, X, Y, S, D, DB, flags (NVMXDIZC), V, H)"
};
const string TRACE_HEADER = "65816: PC, mnemonic, operands, registers (A, X, Y, S, D, DB, flags (NVMXDIZC), V, H)";
_tracer = new TraceBuffer(TRACE_HEADER);
ser.Register<IDisassemblable>(new W65816_DisassemblerService());
@ -352,34 +350,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
if (which == (uint)LibsnesApi.eTRACE.CPU)
{
var split = msg.Split(new[] { splitStr }, 2, StringSplitOptions.None);
_tracer.Put(new TraceInfo
{
Disassembly = split[0].PadRight(34),
RegisterInfo = splitStr + split[1]
});
_tracer.Put(new(disassembly: split[0].PadRight(34), registerInfo: splitStr + split[1]));
}
else if (which == (uint)LibsnesApi.eTRACE.SMP)
{
int idx = msg.IndexOf("YA:");
string dis = msg.Substring(0,idx).TrimEnd();
string regs = msg.Substring(idx);
_tracer.Put(new TraceInfo
{
Disassembly = dis,
RegisterInfo = regs
});
_tracer.Put(new(disassembly: msg.Substring(0, idx).TrimEnd(), registerInfo: msg.Substring(idx)));
}
else if (which == (uint)LibsnesApi.eTRACE.GB)
{
int idx = msg.IndexOf("AF:");
string dis = msg.Substring(0,idx).TrimEnd();
string regs = msg.Substring(idx);
_tracer.Put(new TraceInfo
{
Disassembly = dis,
RegisterInfo = regs
});
_tracer.Put(new(disassembly: msg.Substring(0, idx).TrimEnd(), registerInfo: msg.Substring(idx)));
}
}

View File

@ -27,7 +27,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubGBHawk
_GBCore.ppu.color_palette[2] = GBHawk.GBHawk.color_palette_Gr[2];
_GBCore.ppu.color_palette[3] = GBHawk.GBHawk.color_palette_Gr[3];
}
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_GBCore.cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -37,7 +37,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubGBHawk
ser.Register(_GBCore.ServiceProvider.GetService<IRegionable>());
ser.Register(_GBCore.ServiceProvider.GetService<ICodeDataLogger>());
_tracer = new TraceBuffer { Header = _GBCore.cpu.TraceHeader };
_tracer = new TraceBuffer(_GBCore.cpu.TraceHeader);
ser.Register(_tracer);
_GBCore.ControllerDefinition.AddAxis("Input Cycle", 0.RangeTo(70224), 70224);

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubNESHawk
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
//Console.WriteLine("-----------------------FRAME-----------------------");
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
_nesCore.cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -41,7 +41,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.SubNESHawk
ser.Register(_nesCore.ServiceProvider.GetService<IRegionable>());
ser.Register(_nesCore.ServiceProvider.GetService<ICodeDataLogger>());
_tracer = new TraceBuffer { Header = "6502: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP), flags (NVTBDIZCR), CPU Cycle, PPU Cycle" };
const string TRACE_HEADER = "6502: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP), flags (NVTBDIZCR), CPU Cycle, PPU Cycle";
_tracer = new TraceBuffer(TRACE_HEADER);
ser.Register(_tracer);

View File

@ -16,7 +16,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
CheckSpriteLimit();
PSG.BeginFrame(Cpu.TotalExecutedCycles);
Cpu.Debug = Tracer.Enabled;
Cpu.Debug = Tracer.IsEnabled();
if (SuperGrafx)
{

View File

@ -225,11 +225,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
RomLength = RomData.Length;
// user request: current value of the SF2MapperLatch on the tracelogger
Cpu.Logger = s => Tracer.Put(new TraceInfo
{
Disassembly = $"{SF2MapperLatch:X1}:{s}",
RegisterInfo = ""
});
Cpu.Logger = s => Tracer.Put(new(disassembly: $"{SF2MapperLatch:X1}:{s}", registerInfo: string.Empty));
}
else
{
@ -319,7 +315,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
Cpu.ResetPC();
Tracer = new TraceBuffer { Header = Cpu.TraceHeader };
Tracer = new TraceBuffer(Cpu.TraceHeader);
var ser = new BasicServiceProvider(this);
ServiceProvider = ser;
ser.Register<ITraceable>(Tracer);

View File

@ -15,7 +15,7 @@ namespace BizHawk.Emulation.Cores.Sega.GGHawkLink
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
//Console.WriteLine("-----------------------FRAME-----------------------");
if (_tracer.Enabled)
if (_tracer.IsEnabled())
{
L.Cpu.TraceCallback = s => _tracer.Put(s);
}

View File

@ -45,7 +45,7 @@ namespace BizHawk.Emulation.Cores.Sega.GGHawkLink
ser.Register<IVideoProvider>(this);
ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = L.Cpu.TraceHeader };
_tracer = new TraceBuffer(L.Cpu.TraceHeader);
ser.Register(_tracer);
ServiceProvider = ser;

View File

@ -20,7 +20,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
PSG.Set_Panning(Settings.ForceStereoSeparation ? ForceStereoByte : (byte)0xFF);
}
if (Tracer.Enabled)
if (Tracer.IsEnabled())
{
Cpu.TraceCallback = s => Tracer.Put(s);
}

View File

@ -194,7 +194,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
//this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete
((ICodeDataLogger)this).SetCDL(null);
Tracer = new TraceBuffer { Header = Cpu.TraceHeader };
Tracer = new TraceBuffer(Cpu.TraceHeader);
ser.Register(Tracer);
ser.Register<IDisassemblable>(Cpu);

View File

@ -10,11 +10,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
public class GPGXTraceBuffer : CallbackBasedTraceBuffer
{
private const string TRACE_HEADER = "M68K: PC, machine code, mnemonic, operands, registers (D0-D7, A0-A7, SR, USP), flags (XNZVC)";
public GPGXTraceBuffer(IDebuggable debuggableCore, IMemoryDomains memoryDomains, IDisassemblable disassembler)
: base(debuggableCore, memoryDomains, disassembler)
{
Header = "M68K: PC, machine code, mnemonic, operands, registers (D0-D7, A0-A7, SR, USP), flags (XNZVC)";
}
: base(debuggableCore, memoryDomains, disassembler, TRACE_HEADER) {}
protected override void TraceFromCallback(uint addr, uint value, uint flags)
{
@ -22,11 +21,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
uint pc = (uint)regs["M68K PC"].Value;
var disasm = Disassembler.Disassemble(MemoryDomains.SystemBus, pc & 0xFFFFFF, out _);
var traceInfo = new TraceInfo
{
Disassembly = $"{pc:X6}: {disasm}".PadRight(50)
};
var sb = new StringBuilder();
foreach (var r in regs)
@ -49,9 +43,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
(sr & 2) > 0 ? "V" : "v",
(sr & 1) > 0 ? "C" : "c"));
traceInfo.RegisterInfo = sb.ToString().Trim();
Put(traceInfo);
this.Put(new(disassembly: $"{pc:X6}: {disasm}".PadRight(50), registerInfo: sb.ToString().Trim()));
}
}
}

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
{
public TraceBuffer Tracer { get; private set; }
public static string TraceHeader = "R3000A: PC, machine code, mnemonic, operands, registers (GPRs, lo, hi, sr, cause, epc)";
public const string TraceHeader = "R3000A: PC, machine code, mnemonic, operands, registers (GPRs, lo, hi, sr, cause, epc)";
private OctoshockDll.ShockCallback_Trace trace_cb;
@ -25,17 +25,13 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
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()
});
Tracer.Put(new(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 };
Tracer = new TraceBuffer(TraceHeader);
ServiceProvider = new BasicServiceProvider(this);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
}

View File

@ -829,7 +829,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
OctoshockDll.shock_SetRenderOptions(psx, ref ropts);
//prep tracer
if (Tracer.Enabled)
if (Tracer.IsEnabled())
OctoshockDll.shock_SetTraceCallback(psx, IntPtr.Zero, trace_cb);
else
OctoshockDll.shock_SetTraceCallback(psx, IntPtr.Zero, null);