Refactor ITraceable and related types
This commit is contained in:
parent
9ec72fd543
commit
4973e3eba1
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 =
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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" });
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"));
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)));
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue