blind commit: add SMP hooks to bsnes to test hook scoping system (need to build a waterbox to proceed)

This commit is contained in:
zeromus 2017-08-23 10:08:43 -04:00
parent 56859e9581
commit b868c07a10
7 changed files with 108 additions and 4 deletions

View File

@ -115,6 +115,21 @@ namespace BizHawk.Emulation.Common
public bool HasExecutes => _hasExecutes;
public bool HasReadsForScope(string scope)
{
return _reads.Where(e => e.Scope == scope).Any();
}
public bool HasWritesForScope(string scope)
{
return _writes.Where(e => e.Scope == scope).Any();
}
public bool HasExecutesForScope(string scope)
{
return _execs.Where(e => e.Scope == scope).Any();
}
private void UpdateHasVariables()
{
_hasReads = _reads.Count > 0;

View File

@ -37,6 +37,21 @@ namespace BizHawk.Emulation.Common
/// </summary>
bool HasExecutes { get; }
/// <summary>
/// Gets a value indicating whether or not there are currently any read hooks
/// </summary>
bool HasReadsForScope(string scope);
/// <summary>
/// Gets a value indicating whether or not there are currently any write hooks
/// </summary>
bool HasWritesForScope(string scope);
/// <summary>
/// Gets a value indicating whether or not there are currently any execute hooks
/// </summary>
bool HasExecutesForScope(string scope);
/// <summary>
/// Adds a callback for the given type to the given address
/// If no address is specified the callback will be hooked to all addresses

View File

@ -151,6 +151,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
public Action<uint> ReadHook, ExecHook;
public Action<uint, byte> WriteHook;
public Action<uint> ReadHook_SMP, ExecHook_SMP;
public Action<uint, byte> WriteHook_SMP;
public enum eCDLog_AddrType
{
CARTROM, CARTRAM, WRAM, APURAM,

View File

@ -25,6 +25,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
WriteHook(_comm->addr, (byte)_comm->value);
break;
case eMessage.eMessage_BRK_hook_exec_smp:
ExecHook_SMP(_comm->addr);
break;
case eMessage.eMessage_BRK_hook_read_smp:
ReadHook_SMP(_comm->addr);
break;
case eMessage.eMessage_BRK_hook_write_smp:
WriteHook_SMP(_comm->addr, (byte)_comm->value);
break;
//not supported yet
case eMessage.eMessage_BRK_hook_nmi:
break;

View File

@ -24,6 +24,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
eMessage_QUERY_state_hook_write,
eMessage_QUERY_state_hook_nmi,
eMessage_QUERY_state_hook_irq,
eMessage_QUERY_state_hook_exec_smp,
eMessage_QUERY_state_hook_read_smp,
eMessage_QUERY_state_hook_write_smp,
eMessage_QUERY_enable_trace,
eMessage_QUERY_enable_scanline,
eMessage_QUERY_enable_audio,
@ -63,6 +66,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
eMessage_BRK_hook_write,
eMessage_BRK_hook_nmi,
eMessage_BRK_hook_irq,
eMessage_BRK_hook_exec_smp,
eMessage_BRK_hook_read_smp,
eMessage_BRK_hook_write_smp,
eMessage_BRK_scanlineStart,
};

View File

@ -63,7 +63,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
{
ReadHook = ReadHook,
ExecHook = ExecHook,
WriteHook = WriteHook
WriteHook = WriteHook,
ReadHook_SMP = ReadHook_SMP,
ExecHook_SMP = ExecHook_SMP,
WriteHook_SMP = WriteHook_SMP,
};
ScanlineHookManager = new MyScanlineHookManager(this);
@ -383,6 +386,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
// RefreshMemoryCallbacks();
}
private void ReadHook_SMP(uint addr)
{
MemoryCallbacks.CallReads(addr, "SMP");
}
private void ExecHook_SMP(uint addr)
{
MemoryCallbacks.CallExecutes(addr, "SMP");
}
private void WriteHook_SMP(uint addr, byte val)
{
MemoryCallbacks.CallWrites(addr, "SMP");
}
private enum LoadParamType
{
Normal, SuperGameBoy
@ -557,9 +575,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
private void RefreshMemoryCallbacks(bool suppress)
{
var mcs = MemoryCallbacks;
Api.QUERY_set_state_hook_exec(!suppress && mcs.HasExecutes);
Api.QUERY_set_state_hook_read(!suppress && mcs.HasReads);
Api.QUERY_set_state_hook_write(!suppress && mcs.HasWrites);
Api.QUERY_set_state_hook_exec(!suppress && mcs.HasExecutesForScope("System Bus"));
Api.QUERY_set_state_hook_read(!suppress && mcs.HasReadsForScope("System Bus"));
Api.QUERY_set_state_hook_write(!suppress && mcs.HasWritesForScope("System Bus"));
}
//public byte[] snes_get_memory_data_read(LibsnesApi.SNES_MEMORY id)

View File

@ -47,6 +47,9 @@ enum eMessage : int32
eMessage_QUERY_state_hook_write,
eMessage_QUERY_state_hook_nmi,
eMessage_QUERY_state_hook_irq,
eMessage_QUERY_state_hook_exec_smp,
eMessage_QUERY_state_hook_read_smp,
eMessage_QUERY_state_hook_write_smp,
eMessage_QUERY_enable_trace,
eMessage_QUERY_enable_scanline,
eMessage_QUERY_enable_audio,
@ -86,6 +89,9 @@ enum eMessage : int32
eMessage_BRK_hook_write,
eMessage_BRK_hook_nmi,
eMessage_BRK_hook_irq,
eMessage_BRK_hook_exec_smp,
eMessage_BRK_hook_read_smp,
eMessage_BRK_hook_write_smp,
eMessage_BRK_scanlineStart,
};
@ -348,6 +354,25 @@ static void debug_op_irq()
BREAK(eMessage_BRK_hook_irq);
}
static void debug_op_exec_smp(uint24 addr)
{
comm.addr = addr;
BREAK(eMessage_BRK_hook_exec_smp);
}
static void debug_op_read_smp(uint24 addr)
{
comm.addr = addr;
BREAK(eMessage_BRK_hook_read_smp);
}
static void debug_op_write_smp(uint24 addr, uint8 value)
{
comm.addr = addr;
comm.value = value;
BREAK(eMessage_BRK_hook_write_smp);
}
void pwrap_init()
{
//bsnes's interface initialization calls into this after initializing itself, so we can get a chance to mod it for pwrap functionalities
@ -455,6 +480,15 @@ void QUERY_state_hook_nmi() {
void QUERY_state_hook_irq() {
SNES::cpu.debugger.op_irq = comm.value ? debug_op_irq : hook<void()>();
}
void QUERY_state_hook_exec_smp() {
SNES::smp.debugger.op_exec = comm.value ? debug_op_exec_smp : hook<void(uint24)>();
}
void QUERY_state_hook_read_smp() {
SNES::smp.debugger.op_read = comm.value ? debug_op_read_smp : hook<void(uint24)>();
}
void QUERY_state_hook_write_smp() {
SNES::smp.debugger.op_write = comm.value ? debug_op_write_smp : hook<void(uint24, uint8)>();
}
void QUERY_state_enable_trace() {
snes_set_trace_callback(comm.value, snes_trace);
}
@ -535,6 +569,9 @@ const Action kHandlers_QUERY[] = {
QUERY_state_hook_exec, //eMessage_QUERY_state_hook_exec
QUERY_state_hook_read, //eMessage_QUERY_state_hook_read
QUERY_state_hook_write, //eMessage_QUERY_state_hook_write
QUERY_state_hook_exec_smp, //eMessage_QUERY_state_hook_exec_smp
QUERY_state_hook_read_smp, //eMessage_QUERY_state_hook_read_smp
QUERY_state_hook_write_smp, //eMessage_QUERY_state_hook_write_smp
QUERY_state_hook_nmi, //eMessage_QUERY_state_hook_nmi
QUERY_state_hook_irq, //eMessage_QUERY_state_hook_irq
QUERY_state_enable_trace, //eMessage_QUERY_enable_trace TODO - consolidate enable flags