snes: support trace logging GB and SMP cores (C# side and dlls)

This commit is contained in:
zeromus 2017-05-14 13:51:02 -05:00
parent 4eaf17c6c1
commit 5b44f0960f
7 changed files with 51 additions and 14 deletions

View File

@ -108,6 +108,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
NUM
};
public enum eTRACE : uint
{
CPU = 0,
SMP = 1,
GB = 2
}
public enum eCDLog_Flags
{
ExecFirst = 0x01,
@ -142,7 +149,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
public delegate void snes_audio_sample_t(ushort left, ushort right);
public delegate void snes_scanlineStart_t(int line);
public delegate string snes_path_request_t(int slot, string hint);
public delegate void snes_trace_t(string msg);
public delegate void snes_trace_t(uint which, string msg);
public struct CPURegs

View File

@ -85,10 +85,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
Message(eMessage.eMessage_QUERY_state_hook_write);
}
public void QUERY_set_trace_callback(snes_trace_t callback)
public void QUERY_set_trace_callback(int mask, snes_trace_t callback)
{
this.traceCallback = callback;
comm->value = (callback != null) ? 1u : 0u;
comm->value = (uint)mask;
Message(eMessage.eMessage_QUERY_enable_trace);
}
public void QUERY_set_scanlineStart(snes_scanlineStart_t scanlineStart)

View File

@ -71,7 +71,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
case eMessage.eMessage_SIG_trace_callback:
{
if (traceCallback != null)
traceCallback(comm->GetAscii());
traceCallback(comm->value, comm->GetAscii());
break;
}
case eMessage.eMessage_SIG_allocSharedMemory:

View File

@ -24,11 +24,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
if (!_nocallbacks && _tracer.Enabled)
{
Api.QUERY_set_trace_callback(_tracecb);
//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
if(IsSGB)
Api.QUERY_set_trace_callback(1<<(int)LibsnesApi.eTRACE.GB, _tracecb);
else
Api.QUERY_set_trace_callback(1<<(int)LibsnesApi.eTRACE.CPU, _tracecb);
}
else
{
Api.QUERY_set_trace_callback(null);
Api.QUERY_set_trace_callback(0,null);
}
// for deterministic emulation, save the state we're going to use before frame advance

View File

@ -323,18 +323,43 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
return test;
}
private void snes_trace(string msg)
private void snes_trace(uint which, string msg)
{
// TODO: get them out of the core split up and remove this hackery
string splitStr = "A:";
const string splitStr = "A:";
var split = msg.Split(new[] {splitStr }, 2, StringSplitOptions.None);
_tracer.Put(new TraceInfo
if (which == (uint)LibsnesApi.eTRACE.CPU)
{
Disassembly = split[0].PadRight(34),
RegisterInfo = splitStr + split[1]
});
var split = msg.Split(new[] { splitStr }, 2, StringSplitOptions.None);
_tracer.Put(new TraceInfo
{
Disassembly = split[0].PadRight(34),
RegisterInfo = splitStr + split[1]
});
}
else if (which == (uint)LibsnesApi.eTRACE.SMP)
{
int idx = msg.IndexOf("YA:");
string dis = msg.Substring(0,idx).TrimEnd();
string regs = msg.Substring(idx);
_tracer.Put(new TraceInfo
{
Disassembly = dis,
RegisterInfo = regs
});
}
else if (which == (uint)LibsnesApi.eTRACE.GB)
{
int idx = msg.IndexOf("AF:");
string dis = msg.Substring(0,idx).TrimEnd();
string regs = msg.Substring(idx);
_tracer.Put(new TraceInfo
{
Disassembly = dis,
RegisterInfo = regs
});
}
}
private void SetPalette(SnesColors.ColorType pal)