psx - support memory callbacks
This commit is contained in:
parent
d7186c9e6f
commit
c0421965f1
|
@ -324,6 +324,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
OctoshockDll.shock_Create(out psx, SystemRegion, pFirmware);
|
OctoshockDll.shock_Create(out psx, SystemRegion, pFirmware);
|
||||||
|
|
||||||
SetMemoryDomains();
|
SetMemoryDomains();
|
||||||
|
InitMemCallbacks();
|
||||||
|
|
||||||
//set a default framebuffer based on the first frame of emulation, to cut down on flickering or whatever
|
//set a default framebuffer based on the first frame of emulation, to cut down on flickering or whatever
|
||||||
//this is probably quixotic, but we have to pick something
|
//this is probably quixotic, but we have to pick something
|
||||||
|
@ -790,6 +791,39 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
|
|
||||||
#region Debugging
|
#region Debugging
|
||||||
|
|
||||||
|
OctoshockDll.ShockCallback_Mem mem_cb;
|
||||||
|
|
||||||
|
void ShockMemCallback(uint address, OctoshockDll.eShockMemCb type, uint size, uint value)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case OctoshockDll.eShockMemCb.Read:
|
||||||
|
MemoryCallbacks.CallReads(address);
|
||||||
|
break;
|
||||||
|
case OctoshockDll.eShockMemCb.Write:
|
||||||
|
MemoryCallbacks.CallWrites(address);
|
||||||
|
break;
|
||||||
|
case OctoshockDll.eShockMemCb.Execute:
|
||||||
|
MemoryCallbacks.CallExecutes(address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitMemCallbacks()
|
||||||
|
{
|
||||||
|
mem_cb = new OctoshockDll.ShockCallback_Mem(ShockMemCallback);
|
||||||
|
_memoryCallbacks.ActiveChanged += RefreshMemCallbacks;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RefreshMemCallbacks()
|
||||||
|
{
|
||||||
|
OctoshockDll.eShockMemCb mask = OctoshockDll.eShockMemCb.None;
|
||||||
|
if (MemoryCallbacks.HasReads) mask |= OctoshockDll.eShockMemCb.Read;
|
||||||
|
if (MemoryCallbacks.HasWrites) mask |= OctoshockDll.eShockMemCb.Write;
|
||||||
|
if (MemoryCallbacks.HasExecutes) mask |= OctoshockDll.eShockMemCb.Execute;
|
||||||
|
OctoshockDll.shock_SetMemCb(psx, mem_cb, mask);
|
||||||
|
}
|
||||||
|
|
||||||
unsafe void SetMemoryDomains()
|
unsafe void SetMemoryDomains()
|
||||||
{
|
{
|
||||||
var mmd = new List<MemoryDomain>();
|
var mmd = new List<MemoryDomain>();
|
||||||
|
@ -1284,13 +1318,13 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
|
|
||||||
public ITraceable Tracer { get { return tracer; } }
|
public ITraceable Tracer { get { return tracer; } }
|
||||||
|
|
||||||
public int ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis)
|
public void ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis)
|
||||||
{
|
{
|
||||||
Tracer.Put(dis);
|
Tracer.Put(dis);
|
||||||
return OctoshockDll.SHOCK_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMemoryCallbackSystem MemoryCallbacks { get { throw new NotImplementedException(); } }
|
private readonly MemoryCallbackSystem _memoryCallbacks = new MemoryCallbackSystem();
|
||||||
|
public IMemoryCallbackSystem MemoryCallbacks { get { return _memoryCallbacks; } }
|
||||||
|
|
||||||
public bool CanStep(StepType type) { return false; }
|
public bool CanStep(StepType type) { return false; }
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,15 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
BobOffset
|
BobOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum eShockMemCb : int
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Read = 1,
|
||||||
|
Write = 2,
|
||||||
|
Execute = 4
|
||||||
|
}
|
||||||
|
|
||||||
public const int SHOCK_OK = 0;
|
public const int SHOCK_OK = 0;
|
||||||
public const int SHOCK_FALSE = 0;
|
public const int SHOCK_FALSE = 0;
|
||||||
public const int SHOCK_TRUE = 1;
|
public const int SHOCK_TRUE = 1;
|
||||||
|
@ -172,8 +181,9 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
public TextStateFPtrs ff;
|
public TextStateFPtrs ff;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate int ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis);
|
public delegate void ShockCallback_Trace(IntPtr opaque, uint PC, uint inst, string dis);
|
||||||
|
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate int ShockDisc_ReadTOC(IntPtr opaque, ShockTOC* read_target, ShockTOCTrack* tracks101);
|
public delegate int ShockDisc_ReadTOC(IntPtr opaque, ShockTOC* read_target, ShockTOCTrack* tracks101);
|
||||||
|
@ -181,6 +191,9 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
public delegate int ShockDisc_ReadLBA(IntPtr opaque, int lba, void* dst);
|
public delegate int ShockDisc_ReadLBA(IntPtr opaque, int lba, void* dst);
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
||||||
|
public delegate void ShockCallback_Mem(uint address, eShockMemCb type, uint size, uint value);
|
||||||
|
|
||||||
[DllImport(dd, CallingConvention = cc)]
|
[DllImport(dd, CallingConvention = cc)]
|
||||||
public static extern int shock_Util_DisassembleMIPS(uint PC, uint instr, IntPtr outbuf, int buflen);
|
public static extern int shock_Util_DisassembleMIPS(uint PC, uint instr, IntPtr outbuf, int buflen);
|
||||||
|
|
||||||
|
@ -193,8 +206,6 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
[DllImport(dd, CallingConvention = cc)]
|
[DllImport(dd, CallingConvention = cc)]
|
||||||
public static extern int shock_AnalyzeDisc(IntPtr disc, out ShockDiscInfo info);
|
public static extern int shock_AnalyzeDisc(IntPtr disc, out ShockDiscInfo info);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[DllImport(dd, CallingConvention = cc)]
|
[DllImport(dd, CallingConvention = cc)]
|
||||||
public static extern int shock_Create(out IntPtr psx, eRegion region, void* firmware512k);
|
public static extern int shock_Create(out IntPtr psx, eRegion region, void* firmware512k);
|
||||||
|
|
||||||
|
@ -271,7 +282,10 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
|
||||||
public static extern int shock_SetRegister_CPU(IntPtr psx, int index, uint value);
|
public static extern int shock_SetRegister_CPU(IntPtr psx, int index, uint value);
|
||||||
|
|
||||||
[DllImport(dd, CallingConvention = cc)]
|
[DllImport(dd, CallingConvention = cc)]
|
||||||
public static extern int shock_SetTraceCallback(IntPtr psx, IntPtr opaque, ShockTraceCallback callback);
|
public static extern int shock_SetTraceCallback(IntPtr psx, IntPtr opaque, ShockCallback_Trace callback);
|
||||||
|
|
||||||
|
[DllImport(dd, CallingConvention = cc)]
|
||||||
|
public static extern int shock_SetMemCb(IntPtr psx, ShockCallback_Mem cb, eShockMemCb cbMask);
|
||||||
|
|
||||||
[DllImport(dd, CallingConvention = cc)]
|
[DllImport(dd, CallingConvention = cc)]
|
||||||
public static extern int shock_SetLEC(IntPtr psx, bool enable);
|
public static extern int shock_SetLEC(IntPtr psx, bool enable);
|
||||||
|
|
Binary file not shown.
|
@ -29,6 +29,8 @@
|
||||||
//not very organized, is it
|
//not very organized, is it
|
||||||
void* g_ShockTraceCallbackOpaque = NULL;
|
void* g_ShockTraceCallbackOpaque = NULL;
|
||||||
ShockCallback_Trace g_ShockTraceCallback = NULL;
|
ShockCallback_Trace g_ShockTraceCallback = NULL;
|
||||||
|
ShockCallback_Mem g_ShockMemCallback;
|
||||||
|
eShockMemCb g_ShockMemCbType;
|
||||||
|
|
||||||
/* TODO
|
/* TODO
|
||||||
Make sure load delays are correct.
|
Make sure load delays are correct.
|
||||||
|
@ -252,6 +254,9 @@ INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool D
|
||||||
ReadAbsorb[ReadAbsorbWhich] = 0;
|
ReadAbsorb[ReadAbsorbWhich] = 0;
|
||||||
ReadAbsorbWhich = 0;
|
ReadAbsorbWhich = 0;
|
||||||
|
|
||||||
|
if (g_ShockMemCallback && (g_ShockMemCbType & eShockMemCb_Read))
|
||||||
|
g_ShockMemCallback(address, eShockMemCb_Read, DS24 ? 24 : 32, 0);
|
||||||
|
|
||||||
address &= addr_mask[address >> 29];
|
address &= addr_mask[address >> 29];
|
||||||
|
|
||||||
if(address >= 0x1F800000 && address <= 0x1F8003FF)
|
if(address >= 0x1F800000 && address <= 0x1F8003FF)
|
||||||
|
@ -296,6 +301,9 @@ INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool D
|
||||||
template<typename T>
|
template<typename T>
|
||||||
INLINE void PS_CPU::WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24)
|
INLINE void PS_CPU::WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24)
|
||||||
{
|
{
|
||||||
|
if (g_ShockMemCallback && (g_ShockMemCbType & eShockMemCb_Write))
|
||||||
|
g_ShockMemCallback(address, eShockMemCb_Write, DS24 ? 24 : 32, value);
|
||||||
|
|
||||||
if(MDFN_LIKELY(!(CP0.SR & 0x10000)))
|
if(MDFN_LIKELY(!(CP0.SR & 0x10000)))
|
||||||
{
|
{
|
||||||
address &= addr_mask[address >> 29];
|
address &= addr_mask[address >> 29];
|
||||||
|
|
|
@ -2700,6 +2700,8 @@ EW_EXPORT s32 shock_SetRenderOptions(void* pxs, ShockRenderOptions* opts)
|
||||||
|
|
||||||
extern void* g_ShockTraceCallbackOpaque;
|
extern void* g_ShockTraceCallbackOpaque;
|
||||||
extern ShockCallback_Trace g_ShockTraceCallback;
|
extern ShockCallback_Trace g_ShockTraceCallback;
|
||||||
|
extern ShockCallback_Mem g_ShockMemCallback;
|
||||||
|
extern eShockMemCb g_ShockMemCbType;
|
||||||
|
|
||||||
//Sets the callback to be used for CPU tracing
|
//Sets the callback to be used for CPU tracing
|
||||||
EW_EXPORT s32 shock_SetTraceCallback(void* psx, void* opaque, ShockCallback_Trace callback)
|
EW_EXPORT s32 shock_SetTraceCallback(void* psx, void* opaque, ShockCallback_Trace callback)
|
||||||
|
@ -2710,6 +2712,14 @@ EW_EXPORT s32 shock_SetTraceCallback(void* psx, void* opaque, ShockCallback_Trac
|
||||||
return SHOCK_OK;
|
return SHOCK_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Sets the callback to be used for memory hook events
|
||||||
|
EW_EXPORT s32 shock_SetMemCb(void* psx, ShockCallback_Mem callback, eShockMemCb cbMask)
|
||||||
|
{
|
||||||
|
g_ShockMemCallback = callback;
|
||||||
|
g_ShockMemCbType = cbMask;
|
||||||
|
return SHOCK_OK;
|
||||||
|
}
|
||||||
|
|
||||||
//Sets whether LEC is enabled (sector level error correction). Defaults to FALSE (disabled)
|
//Sets whether LEC is enabled (sector level error correction). Defaults to FALSE (disabled)
|
||||||
EW_EXPORT s32 shock_SetLEC(void* psx, bool enabled)
|
EW_EXPORT s32 shock_SetLEC(void* psx, bool enabled)
|
||||||
{
|
{
|
||||||
|
|
|
@ -192,6 +192,13 @@ enum eShockMemcardTransaction
|
||||||
eShockMemcardTransaction_CheckDirty = 4, //checks whether the memcard is dirty
|
eShockMemcardTransaction_CheckDirty = 4, //checks whether the memcard is dirty
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum eShockMemCb
|
||||||
|
{
|
||||||
|
eShockMemCb_None = 0,
|
||||||
|
eShockMemCb_Read = 1,
|
||||||
|
eShockMemCb_Write = 2,
|
||||||
|
eShockMemCb_Execute = 4
|
||||||
|
};
|
||||||
|
|
||||||
#define MDFN_MSC_RESET 0
|
#define MDFN_MSC_RESET 0
|
||||||
#define MDFN_MSC_POWER 1
|
#define MDFN_MSC_POWER 1
|
||||||
|
@ -237,7 +244,12 @@ typedef s32 (*ShockDisc_ReadTOC)(void* opaque, ShockTOC *read_target, ShockTOCTr
|
||||||
typedef s32 (*ShockDisc_ReadLBA)(void* opaque, s32 lba, void* dst);
|
typedef s32 (*ShockDisc_ReadLBA)(void* opaque, s32 lba, void* dst);
|
||||||
|
|
||||||
//The callback to be issued for traces
|
//The callback to be issued for traces
|
||||||
typedef s32 (*ShockCallback_Trace)(void* opaque, u32 PC, u32 inst, const char* msg);
|
typedef void (*ShockCallback_Trace)(void* opaque, u32 PC, u32 inst, const char* msg);
|
||||||
|
|
||||||
|
//the callback to be issued for memory hook events
|
||||||
|
//note: only one callback can be set. the type is sent to mask that one callback, not indicate which event type the callback is fore.
|
||||||
|
//there isnt one callback per type.
|
||||||
|
typedef void (*ShockCallback_Mem)(u32 address, eShockMemCb type, u32 size, u32 value);
|
||||||
|
|
||||||
class ShockDiscRef
|
class ShockDiscRef
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue