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> /// </summary>
public abstract class CallbackBasedTraceBuffer : ITraceable 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> /// <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()) if (!debuggableCore.MemoryCallbacksAvailable())
{ {
@ -32,7 +34,7 @@ namespace BizHawk.Emulation.Common
throw new InvalidOperationException($"{nameof(IDebuggable.GetCpuFlagsAndRegisters)} is required"); throw new InvalidOperationException($"{nameof(IDebuggable.GetCpuFlagsAndRegisters)} is required");
} }
Header = "Instructions"; Header = header;
DebuggableCore = debuggableCore; DebuggableCore = debuggableCore;
MemoryDomains = memoryDomains; MemoryDomains = memoryDomains;
Disassembler = disassembler; Disassembler = disassembler;
@ -48,20 +50,9 @@ namespace BizHawk.Emulation.Common
private ITraceSink _sink; private ITraceSink _sink;
public bool Enabled => Sink != null;
public void Put(TraceInfo info)
{
Sink.Put(info);
}
public ITraceSink Sink public ITraceSink Sink
{ {
private get get => _sink;
{
return _sink;
}
set set
{ {
_sink = value; _sink = value;
@ -75,7 +66,7 @@ namespace BizHawk.Emulation.Common
} }
} }
public string Header { get; protected set; } public string Header { get; }
private class TracingMemoryCallback : IMemoryCallback private class TracingMemoryCallback : IMemoryCallback
{ {

View File

@ -1,6 +1,4 @@
#nullable disable namespace BizHawk.Emulation.Common
namespace BizHawk.Emulation.Common
{ {
/// <summary> /// <summary>
/// A generic implementation of ITraceable that can be used by any core /// A generic implementation of ITraceable that can be used by any core
@ -8,15 +6,12 @@ namespace BizHawk.Emulation.Common
/// <seealso cref="ITraceable" /> /// <seealso cref="ITraceable" />
public class TraceBuffer : 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) public TraceBuffer(string header = DEFAULT_HEADER) => Header = header;
{
Sink.Put(info);
}
} }
} }

View File

@ -484,5 +484,10 @@ namespace BizHawk.Emulation.Common
public static string SystemIDToDisplayName(string sysID) public static string SystemIDToDisplayName(string sysID)
=> SystemIDDisplayNames.TryGetValue(sysID, out var dispName) ? dispName : string.Empty; => 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 public interface ITraceSink
{ {
@ -23,25 +21,19 @@ namespace BizHawk.Emulation.Common
/// that's right, we can only have one sink. /// that's right, we can only have one sink.
/// a sink can route to two other sinks if it has to, though /// a sink can route to two other sinks if it has to, though
/// </summary> /// </summary>
ITraceSink Sink { set; } ITraceSink? Sink { get; 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);
} }
public class TraceInfo public readonly struct TraceInfo
{ {
public string Disassembly { get; set; } public readonly string Disassembly;
public string RegisterInfo { get; set; }
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 int opcode;
public TraceInfo CP1610State(bool disassemble = true) public TraceInfo CP1610State(bool disassemble = true)
{ => new(
return new TraceInfo disassembly: $"{RegisterPC - 1:X4}: {opcode:X2} {(disassemble ? Disassemble((ushort)(RegisterPC - 1), out _) : "---")} ".PadRight(26),
{ registerInfo: string.Join(" ",
Disassembly = $"{RegisterPC - 1:X4}: {opcode:X2} {(disassemble ? Disassemble((ushort)(RegisterPC - 1), out _) : "---")} ".PadRight(26),
RegisterInfo = string.Join(" ",
new[] new[]
{ {
$"Cy:{TotalExecutedCycles}", $"Cy:{TotalExecutedCycles}",
@ -34,10 +32,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
FlagO ? "O" : "o", FlagO ? "O" : "o",
FlagI ? "I" : "i", FlagI ? "I" : "i",
FlagD ? "D" : "d") 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) 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 string TraceHeader => "HuC6280: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP, Cy), flags (NVTBDIZC)";
public TraceInfo State() public TraceInfo State()
{ => new(
return new TraceInfo disassembly: $"{MPR[PC >> 13]:X2}:{PC:X4}: {ReadMemory(PC):X2} {Disassemble(PC, out _)} ".PadRight(30),
{ registerInfo: string.Join(" ",
Disassembly = $"{MPR[PC >> 13]:X2}:{PC:X4}: {ReadMemory(PC):X2} {Disassemble(PC, out _)} ".PadRight(30),
RegisterInfo = string.Join(" ",
$"A:{A:X2}", $"A:{A:X2}",
$"X:{X:X2}", $"X:{X:X2}",
$"Y:{Y:X2}", $"Y:{Y:X2}",
@ -400,9 +398,7 @@ namespace BizHawk.Emulation.Cores.Components.H6280
FlagD ? "D" : "d", FlagD ? "D" : "d",
FlagI ? "I" : "i", FlagI ? "I" : "i",
FlagZ ? "Z" : "z", FlagZ ? "Z" : "z",
FlagC ? "C" : "c")) FlagC ? "C" : "c")));
};
}
private static readonly byte[] TableNZ = private static readonly byte[] TableNZ =
{ {

View File

@ -448,7 +448,7 @@ namespace BizHawk.Emulation.Cores.Components.I8048
{ {
IRQPending = false; IRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
IRQ_(0); IRQ_(0);
IRQCallback(); IRQCallback();
@ -458,7 +458,7 @@ namespace BizHawk.Emulation.Cores.Components.I8048
{ {
TIRQPending = false; TIRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====TIRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====TIRQ====", registerInfo: string.Empty));
IRQ_(1); IRQ_(1);
IRQCallback(); 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 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) public TraceInfo State(bool disassemble = true)
{ => new(
return new TraceInfo disassembly: $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
{ registerInfo: string.Format(
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}", "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[A],
Regs[(ushort)(R0 + RB)], Regs[(ushort)(R0 + RB)],
@ -550,10 +548,7 @@ namespace BizHawk.Emulation.Cores.Components.I8048
T0 ? "T" : "t", T0 ? "T" : "t",
T1 ? "T" : "t", T1 ? "T" : "t",
TF ? "T" : "t", TF ? "T" : "t",
RB > 0 ? "R" : "r" RB > 0 ? "R" : "r"));
)
};
}
/// <summary> /// <summary>
/// Optimization method to set cur_instr /// Optimization method to set cur_instr

View File

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

View File

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

View File

@ -473,7 +473,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1; irq_pntr = -1;
IRQS = 3; IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI NMI====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====CWAI NMI====", registerInfo: string.Empty));
} }
else if (FIRQPending && !FlagF) else if (FIRQPending && !FlagF)
{ {
@ -486,7 +486,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1; irq_pntr = -1;
IRQS = 3; IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI FIRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====CWAI FIRQ====", registerInfo: string.Empty));
} }
else if (IRQPending && !FlagI) else if (IRQPending && !FlagI)
{ {
@ -499,7 +499,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1; irq_pntr = -1;
IRQS = 3; IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====CWAI IRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====CWAI IRQ====", registerInfo: string.Empty));
} }
else else
{ {
@ -522,7 +522,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1; irq_pntr = -1;
IRQS = 3; IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====SYNC NMI====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====SYNC NMI====", registerInfo: string.Empty));
} }
else if (FIRQPending) else if (FIRQPending)
{ {
@ -537,7 +537,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1; irq_pntr = -1;
IRQS = 3; IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====SYNC FIRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====SYNC FIRQ====", registerInfo: string.Empty));
} }
else else
{ {
@ -563,7 +563,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
irq_pntr = -1; irq_pntr = -1;
IRQS = 3; IRQS = 3;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====SYNC IRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====SYNC IRQ====", registerInfo: string.Empty));
} }
else else
{ {
@ -593,7 +593,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
{ {
NMIPending = false; NMIPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====NMI====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====NMI====", registerInfo: string.Empty));
NMI_(); NMI_();
NMICallback(); NMICallback();
@ -604,7 +604,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
{ {
FIRQPending = false; FIRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====FIRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====FIRQ====", registerInfo: string.Empty));
FIRQ_(); FIRQ_();
FIRQCallback(); FIRQCallback();
@ -615,7 +615,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
{ {
IRQPending = false; IRQPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
IRQ_(); IRQ_();
IRQCallback(); IRQCallback();
instr_pntr = irq_pntr = 0; 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 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) public TraceInfo State(bool disassemble = true)
{ => new(
return new TraceInfo disassembly: $"{(disassemble ? Disassemble(Regs[PC], ReadMemory, out _) : "---")} ".PadRight(50),
{ registerInfo: string.Format(
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}", "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[A],
Regs[B], Regs[B],
@ -661,10 +659,7 @@ namespace BizHawk.Emulation.Cores.Components.MC6809
FlagN ? "N" : "n", FlagN ? "N" : "n",
FlagZ ? "Z" : "z", FlagZ ? "Z" : "z",
FlagV ? "V" : "v", FlagV ? "V" : "v",
FlagC ? "C" : "c" FlagC ? "C" : "c"));
)
};
}
/// <summary> /// <summary>
/// Optimization method to set cur_instr /// Optimization method to set cur_instr

View File

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

View File

@ -94,13 +94,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
public TraceInfo State(bool disassemble = true) public TraceInfo State(bool disassemble = true)
{ {
if (!disassemble) if (!disassemble) return new(disassembly: string.Empty, registerInfo: string.Empty);
{
return new TraceInfo {
Disassembly = "",
RegisterInfo = ""
};
}
string rawbytes = ""; string rawbytes = "";
string disasm = Disassemble(PC, out var length); string disasm = Disassemble(PC, out var length);
@ -110,10 +104,9 @@ namespace BizHawk.Emulation.Cores.Components.M6502
rawbytes += $" {_link.PeekMemory((ushort)(PC + i)):X2}"; rawbytes += $" {_link.PeekMemory((ushort)(PC + i)):X2}";
} }
return new TraceInfo return new(
{ disassembly: $"{PC:X4}: {rawbytes,-9} {disasm} ".PadRight(32),
Disassembly = $"{PC:X4}: {rawbytes,-9} {disasm} ".PadRight(32), registerInfo: string.Join(" ",
RegisterInfo = string.Join(" ",
$"A:{A:X2}", $"A:{A:X2}",
$"X:{X:X2}", $"X:{X:X2}",
$"Y:{Y:X2}", $"Y:{Y:X2}",
@ -131,8 +124,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
// !RDY ? "R" : "r" // !RDY ? "R" : "r"
), ),
$"Cy:{TotalExecutedCycles}", $"Cy:{TotalExecutedCycles}",
$"PPU-Cy:{ext_ppu_cycle}") $"PPU-Cy:{ext_ppu_cycle}"));
};
} }
public bool AtStart => opcode == VOP_Fetch1 || Microcode[opcode][mi] >= Uop.End; 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; nonMaskableInterruptPending = false;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====NMI====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====NMI====", registerInfo: string.Empty));
iff2 = iff1; iff2 = iff1;
iff1 = false; iff1 = false;
@ -796,7 +796,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
iff1 = iff2 = false; iff1 = iff2 = false;
EI_pending = 0; EI_pending = 0;
TraceCallback?.Invoke(new TraceInfo { Disassembly = "====IRQ====", RegisterInfo = "" }); TraceCallback?.Invoke(new(disassembly: "====IRQ====", registerInfo: string.Empty));
switch (interruptMode) switch (interruptMode)
{ {
@ -867,10 +867,9 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
} }
} }
return new TraceInfo return new(
{ disassembly: $"{RegPC:X4}: {byte_code.PadRight(12)} {disasm.PadRight(26)}",
Disassembly = $"{RegPC:X4}: {byte_code.PadRight(12)} {disasm.PadRight(26)}", registerInfo: string.Join(" ",
RegisterInfo = string.Join(" ",
$"AF:{(Regs[A] << 8) + Regs[F]:X4}", $"AF:{(Regs[A] << 8) + Regs[F]:X4}",
$"BC:{(Regs[B] << 8) + Regs[C]:X4}", $"BC:{(Regs[B] << 8) + Regs[C]:X4}",
$"DE:{(Regs[D] << 8) + Regs[E]:X4}", $"DE:{(Regs[D] << 8) + Regs[E]:X4}",
@ -888,8 +887,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A
Flag5 ? "5" : "-", Flag5 ? "5" : "-",
FlagZ ? "Z" : "z", FlagZ ? "Z" : "z",
FlagS ? "S" : "s", FlagS ? "S" : "s",
FlagI ? "E" : "e")) FlagI ? "E" : "e")));
};
} }
/// <summary> /// <summary>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
{ {
_board.Controller = controller; _board.Controller = controller;
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
_board.Cpu.TraceCallback = s => _tracer.Put(s); _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<IVideoProvider>(_board.Vic);
ser.Register<IDriveLight>(this); ser.Register<IDriveLight>(this);
_tracer = new TraceBuffer { Header = _board.Cpu.TraceHeader }; _tracer = new TraceBuffer(_board.Cpu.TraceHeader);
ser.Register<ITraceable>(_tracer); ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState)); 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 (current_controller == MSXControllerKB) { kb_rows_check(controller); }
if (Tracer.Enabled) if (Tracer.IsEnabled())
{ {
tracecb = MakeTrace; tracecb = MakeTrace;
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -47,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
RebootCore(); RebootCore();
SetupMemoryDomains(); SetupMemoryDomains();
Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; Tracer = new TraceBuffer(Cpu.TraceHeader);
ser.Register<IDisassemblable>(Cpu); ser.Register<IDisassemblable>(Cpu);
ser.Register<ITraceable>(Tracer); 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) public bool FrameAdvance(IController controller, bool render, bool renderSound)
{ {
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
cpu.TraceCallback = s => _tracer.Put(s); cpu.TraceCallback = s => _tracer.Put(s);
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -723,14 +723,13 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
} }
} }
return new TraceInfo return new(
{ disassembly: string.Format(
Disassembly = string.Format(
"{0:X4}: {1} {2}", "{0:X4}: {1} {2}",
pc, pc,
byte_code.PadRight(12), byte_code.PadRight(12),
disasm.PadRight(26)), disasm.PadRight(26)),
RegisterInfo = string.Format( registerInfo: string.Format(
"Flags:{75}{76}{77}{78}{79} " + "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} " + "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} " + "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", FlagO ? "O" : "o",
FlagZ ? "Z" : "z", FlagZ ? "Z" : "z",
FlagC ? "C" : "c", FlagC ? "C" : "c",
FlagS ? "S" : "s"), FlagS ? "S" : "s"));
};
} }
/// <summary> /// <summary>

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public bool FrameAdvance(IController controller, bool render, bool rendersound) public bool FrameAdvance(IController controller, bool render, bool rendersound)
{ {
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
cpu.TraceCallback = s => _tracer.Put(s); 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 _settings = new object(); // TODO: wtf is this
_syncSettings = (VectrexSyncSettings)syncSettings ?? new VectrexSyncSettings(); _syncSettings = (VectrexSyncSettings)syncSettings ?? new VectrexSyncSettings();
_tracer = new TraceBuffer { Header = cpu.TraceHeader }; _tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(_tracer); ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState)); ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains(); SetupMemoryDomains();

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Intellivision
public bool FrameAdvance(IController controller, bool render, bool renderSound) public bool FrameAdvance(IController controller, bool render, bool renderSound)
{ {
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
_cpu.TraceCallback = s => _tracer.Put(s); _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.")); LoadExecutiveRom(comm.CoreFileProvider.GetFirmwareOrThrow(new("INTV", "EROM"), "Executive ROM is required."));
LoadGraphicsRom(comm.CoreFileProvider.GetFirmwareOrThrow(new("INTV", "GROM"), "Graphics 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<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState)); ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains(); SetupMemoryDomains();

View File

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

View File

@ -79,7 +79,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
ser.Register<IVideoProvider>(this); ser.Register<IVideoProvider>(this);
ServiceProvider = ser; ServiceProvider = ser;
_tracer = new TraceBuffer { Header = cpu.TraceHeader }; _tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register(_tracer); ser.Register(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState)); ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains(); 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) // 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_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_video_enabled(render);
Api.core.snes_set_audio_enabled(renderSound); Api.core.snes_set_audio_enabled(renderSound);

View File

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

View File

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

View File

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

View File

@ -187,7 +187,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
_ = PutSettings(settings ?? new GBSettings()); _ = PutSettings(settings ?? new GBSettings());
_syncSettings = (GBSyncSettings)syncSettings ?? new GBSyncSettings(); _syncSettings = (GBSyncSettings)syncSettings ?? new GBSyncSettings();
_tracer = new TraceBuffer { Header = cpu.TraceHeader }; _tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(_tracer); ser.Register<ITraceable>(_tracer);
ser.Register<IStatable>(new StateSerializer(SyncState)); ser.Register<IStatable>(new StateSerializer(SyncState));
ser.Register<IDisassemblable>(_disassembler); 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]; R.ppu.color_palette[3] = color_palette_Gr[3];
} }
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
L.cpu.TraceCallback = s => _tracer.Put(s); 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<IVideoProvider>(this);
ser.Register<ISoundProvider>(this); ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = L.cpu.TraceHeader }; _tracer = new TraceBuffer(L.cpu.TraceHeader);
ser.Register<ITraceable>(_tracer); ser.Register<ITraceable>(_tracer);
_lStates = L.ServiceProvider.GetService<IStatable>(); _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]; R.ppu.color_palette[3] = color_palette_Gr[3];
} }
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
L.cpu.TraceCallback = s => _tracer.Put(s); 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<IVideoProvider>(this);
ser.Register<ISoundProvider>(this); ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = L.cpu.TraceHeader }; _tracer = new TraceBuffer(L.cpu.TraceHeader);
ser.Register(_tracer); ser.Register(_tracer);
_lStates = L.ServiceProvider.GetService<IStatable>(); _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]; D.ppu.color_palette[3] = color_palette_Gr[3];
} }
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
A.cpu.TraceCallback = s => _tracer.Put(s); 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<IVideoProvider>(this);
ser.Register<ISoundProvider>(this); ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = A.cpu.TraceHeader }; _tracer = new TraceBuffer(A.cpu.TraceHeader);
ser.Register(_tracer); ser.Register(_tracer);
ServiceProvider = ser; ServiceProvider = ser;

View File

@ -15,16 +15,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
int[] s = new int[14]; int[] s = new int[14];
System.Runtime.InteropServices.Marshal.Copy(_s, s, 0, 14); System.Runtime.InteropServices.Marshal.Copy(_s, s, 0, 14);
Tracer.Put(new TraceInfo Tracer.Put(new(
{ disassembly: LR35902.Disassemble(
Disassembly =
LR35902.Disassemble(
(ushort) s[1], (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)), 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, _settings.RgbdsSyntax,
out _).PadRight(36), out _).PadRight(36),
RegisterInfo = registerInfo: string.Format(
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}", "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[0],
s[1] & 0xffff, s[1] & 0xffff,
@ -39,8 +36,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
s[10] & 0xff, s[10] & 0xff,
s[11] != 0 ? "skip" : "", s[11] != 0 ? "skip" : "",
s[12] & 0xffffff, 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); var ser = new BasicServiceProvider(this);
ser.Register<IDisassemblable>(_disassembler); ser.Register<IDisassemblable>(_disassembler);
ServiceProvider = ser; ServiceProvider = ser;
Tracer = new TraceBuffer const string TRACE_HEADER = "LR35902: PC, opcode, registers (A, F, B, C, D, E, H, L, LY, SP, CY)";
{ Tracer = new TraceBuffer(TRACE_HEADER);
Header = "LR35902: PC, opcode, registers (A, F, B, C, D, E, H, L, LY, SP, CY)"
};
ser.Register<ITraceable>(Tracer); ser.Register<ITraceable>(Tracer);
InitMemoryCallbacks(); InitMemoryCallbacks();
@ -327,7 +325,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
LibGambatte.gambatte_reset(GambatteState); LibGambatte.gambatte_reset(GambatteState);
} }
if (Tracer.Enabled) if (Tracer.IsEnabled())
{ {
_tracecb = MakeTrace; _tracecb = MakeTrace;
} }

View File

@ -17,11 +17,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
var length = 0; var length = 0;
var disasm = Disassemble(MemoryDomains.SystemBus, pc, out length); var disasm = Disassemble(MemoryDomains.SystemBus, pc, out length);
var traceInfo = new TraceInfo
{
Disassembly = $"{pc:X}: {disasm.PadRight(32)}"
};
var sb = new StringBuilder(); var sb = new StringBuilder();
for (int i = 1; i < 32; i++) // r0 is always zero 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 // drop MMU co-processor regs for now
traceInfo.RegisterInfo = sb.ToString().Trim(); Tracer.Put(new(disassembly: $"{pc:X}: {disasm.PadRight(32)}", registerInfo: sb.ToString().Trim()));
Tracer.Put(traceInfo);
} }
private const string TraceHeader = "r3400: PC, mnemonic, operands, registers (GPRs, Load/Link Bit, MultHI, MultLO, Implementation/Revision, Control/Status, FGRs)"; private const string TraceHeader = "r3400: PC, mnemonic, operands, registers (GPRs, Load/Link Bit, MultHI, MultLO, Implementation/Revision, Control/Status, FGRs)";
private void ConnectTracer() private void ConnectTracer()
{ {
Tracer = new TraceBuffer { Header = TraceHeader }; Tracer = new TraceBuffer(TraceHeader);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer); (ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
_tracecb = new mupen64plusApi.TraceCallback(MakeTrace); _tracecb = new mupen64plusApi.TraceCallback(MakeTrace);
} }

View File

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

View File

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

View File

@ -52,7 +52,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
ser.Register<IDisassemblable>(cpu); ser.Register<IDisassemblable>(cpu);
Tracer = new TraceBuffer { Header = cpu.TraceHeader }; Tracer = new TraceBuffer(cpu.TraceHeader);
ser.Register<ITraceable>(Tracer); ser.Register<ITraceable>(Tracer);
ser.Register<IVideoProvider>(videoProvider); ser.Register<IVideoProvider>(videoProvider);
ser.Register<ISoundProvider>(this); 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)); string opcodeStr = MOS6502X.Disassemble(pc, out _, address => _memoryDomains.SystemBus.PeekByte(address));
Tracer.Put(new TraceInfo Tracer.Put(new(
{ disassembly: $"{pc:X4}: {opcodeStr}".PadRight(26),
Disassembly = $"{pc:X4}: {opcodeStr}".PadRight(26), registerInfo: string.Join(" ",
RegisterInfo = string.Join(" ",
$"A:{a:X2}", $"A:{a:X2}",
$"X:{x:X2}", $"X:{x:X2}",
$"Y:{y:X2}", $"Y:{y:X2}",
$"P:{p:X2}", $"P:{p:X2}",
$"SP:{sp:X2}") $"SP:{sp:X2}")));
});
} }
private void ConnectTracer() private void ConnectTracer()
{ {
Tracer = new TraceBuffer { Header = TraceHeader }; Tracer = new TraceBuffer(TraceHeader);
((BasicServiceProvider) ServiceProvider).Register<ITraceable>(Tracer); ((BasicServiceProvider) ServiceProvider).Register<ITraceable>(Tracer);
_traceCb = MakeTrace; _traceCb = MakeTrace;
} }

View File

@ -194,7 +194,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
SetPads(controller, out var j1, out var j2); 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)); LibQuickNES.ThrowStringError(QN.qn_emulate_frame(Context, j1, j2));
IsLagFrame = QN.qn_get_joypad_read_count(Context) == 0; IsLagFrame = QN.qn_get_joypad_read_count(Context) == 0;

View File

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

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[2] = GBHawk.GBHawk.color_palette_Gr[2];
_GBCore.ppu.color_palette[3] = GBHawk.GBHawk.color_palette_Gr[3]; _GBCore.ppu.color_palette[3] = GBHawk.GBHawk.color_palette_Gr[3];
} }
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
_GBCore.cpu.TraceCallback = s => _tracer.Put(s); _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<IRegionable>());
ser.Register(_GBCore.ServiceProvider.GetService<ICodeDataLogger>()); ser.Register(_GBCore.ServiceProvider.GetService<ICodeDataLogger>());
_tracer = new TraceBuffer { Header = _GBCore.cpu.TraceHeader }; _tracer = new TraceBuffer(_GBCore.cpu.TraceHeader);
ser.Register(_tracer); ser.Register(_tracer);
_GBCore.ControllerDefinition.AddAxis("Input Cycle", 0.RangeTo(70224), 70224); _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) public bool FrameAdvance(IController controller, bool render, bool renderSound)
{ {
//Console.WriteLine("-----------------------FRAME-----------------------"); //Console.WriteLine("-----------------------FRAME-----------------------");
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
_nesCore.cpu.TraceCallback = s => _tracer.Put(s); _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<IRegionable>());
ser.Register(_nesCore.ServiceProvider.GetService<ICodeDataLogger>()); 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); ser.Register(_tracer);

View File

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

View File

@ -225,11 +225,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
RomLength = RomData.Length; RomLength = RomData.Length;
// user request: current value of the SF2MapperLatch on the tracelogger // user request: current value of the SF2MapperLatch on the tracelogger
Cpu.Logger = s => Tracer.Put(new TraceInfo Cpu.Logger = s => Tracer.Put(new(disassembly: $"{SF2MapperLatch:X1}:{s}", registerInfo: string.Empty));
{
Disassembly = $"{SF2MapperLatch:X1}:{s}",
RegisterInfo = ""
});
} }
else else
{ {
@ -319,7 +315,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
Cpu.ResetPC(); Cpu.ResetPC();
Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; Tracer = new TraceBuffer(Cpu.TraceHeader);
var ser = new BasicServiceProvider(this); var ser = new BasicServiceProvider(this);
ServiceProvider = ser; ServiceProvider = ser;
ser.Register<ITraceable>(Tracer); 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) public bool FrameAdvance(IController controller, bool render, bool renderSound)
{ {
//Console.WriteLine("-----------------------FRAME-----------------------"); //Console.WriteLine("-----------------------FRAME-----------------------");
if (_tracer.Enabled) if (_tracer.IsEnabled())
{ {
L.Cpu.TraceCallback = s => _tracer.Put(s); 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<IVideoProvider>(this);
ser.Register<ISoundProvider>(this); ser.Register<ISoundProvider>(this);
_tracer = new TraceBuffer { Header = L.Cpu.TraceHeader }; _tracer = new TraceBuffer(L.Cpu.TraceHeader);
ser.Register(_tracer); ser.Register(_tracer);
ServiceProvider = ser; ServiceProvider = ser;

View File

@ -20,7 +20,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
PSG.Set_Panning(Settings.ForceStereoSeparation ? ForceStereoByte : (byte)0xFF); PSG.Set_Panning(Settings.ForceStereoSeparation ? ForceStereoByte : (byte)0xFF);
} }
if (Tracer.Enabled) if (Tracer.IsEnabled())
{ {
Cpu.TraceCallback = s => Tracer.Put(s); 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 //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete
((ICodeDataLogger)this).SetCDL(null); ((ICodeDataLogger)this).SetCDL(null);
Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; Tracer = new TraceBuffer(Cpu.TraceHeader);
ser.Register(Tracer); ser.Register(Tracer);
ser.Register<IDisassemblable>(Cpu); ser.Register<IDisassemblable>(Cpu);

View File

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

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
{ {
public TraceBuffer Tracer { get; private set; } 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; 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)} "); sb.Append($"{r.Key}:{r.Value.Value.ToHexString(r.Value.BitSize / 4)} ");
} }
Tracer.Put(new TraceInfo Tracer.Put(new(disassembly: $"{PC:X8}: {inst:X8} {dis.PadRight(30)}", registerInfo: sb.ToString().Trim()));
{
Disassembly = $"{PC:X8}: {inst:X8} {dis.PadRight(30)}",
RegisterInfo = sb.ToString().Trim()
});
} }
private void ConnectTracer() private void ConnectTracer()
{ {
trace_cb = new OctoshockDll.ShockCallback_Trace(ShockTraceCallback); trace_cb = new OctoshockDll.ShockCallback_Trace(ShockTraceCallback);
Tracer = new TraceBuffer { Header = TraceHeader }; Tracer = new TraceBuffer(TraceHeader);
ServiceProvider = new BasicServiceProvider(this); ServiceProvider = new BasicServiceProvider(this);
(ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer); (ServiceProvider as BasicServiceProvider).Register<ITraceable>(Tracer);
} }

View File

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