301 lines
8.9 KiB
C#
301 lines
8.9 KiB
C#
//TODO - make sure msvc builds with 32bit enums and get rid of the extra marshalling fluff here
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
using BizHawk.Emulation.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Sony.PSX
|
|
{
|
|
public unsafe static class OctoshockDll
|
|
{
|
|
const CallingConvention cc = CallingConvention.Cdecl;
|
|
const string dd = "octoshock.dll";
|
|
|
|
public enum eRegion : int
|
|
{
|
|
JP = 0,
|
|
NA = 1,
|
|
EU = 2,
|
|
NONE = 3 //TODO - whats the difference between unset, and region unknown?
|
|
}
|
|
|
|
public enum eVidStandard : int
|
|
{
|
|
NTSC = 0,
|
|
PAL = 1,
|
|
}
|
|
|
|
public enum eShockStep
|
|
{
|
|
Frame
|
|
};
|
|
|
|
public enum eShockFramebufferFlags
|
|
{
|
|
None = 0,
|
|
Normalize = 1
|
|
}
|
|
|
|
public enum eMemType
|
|
{
|
|
MainRAM = 0, //2048K
|
|
BiosROM = 1, //512K
|
|
PIOMem = 2, //64K
|
|
GPURAM = 3, //512K
|
|
SPURAM = 4, //512K
|
|
DCache = 5 //1K
|
|
};
|
|
|
|
public enum eShockStateTransaction : int
|
|
{
|
|
BinarySize = 0,
|
|
BinaryLoad = 1,
|
|
BinarySave = 2,
|
|
TextLoad = 3,
|
|
TextSave = 4
|
|
}
|
|
|
|
public enum eShockMemcardTransaction
|
|
{
|
|
Connect = 0, //connects it to the addressed port (not supported yet)
|
|
Disconnect = 1, //disconnects it from the addressed port (not supported yet)
|
|
Write = 2, //writes from the frontend to the memcard
|
|
Read = 3, //reads from the memcard to the frontend. Also clears the dirty flag
|
|
CheckDirty = 4, //checks whether the memcard is dirty
|
|
};
|
|
|
|
|
|
public enum ePeripheralType : int
|
|
{
|
|
None = 0, //can be used to signify disconnection
|
|
|
|
Pad = 1, //SCPH-1080
|
|
DualShock = 2, //SCPH-1200
|
|
DualAnalog = 3, //SCPH-1180
|
|
|
|
NegCon = 4,
|
|
|
|
Multitap = 10,
|
|
};
|
|
|
|
/// <summary>
|
|
/// this is implemented as an overall render type instead of a horizontal clip control
|
|
/// in case the Framebuffer render type ever develops any differences in its Y-handling.
|
|
/// At that time, we might need to change the GUI to separate the vertical and horizontal components, or something like that
|
|
/// </summary>
|
|
public enum eShockRenderType : int
|
|
{
|
|
Normal,
|
|
ClipOverscan,
|
|
Framebuffer
|
|
};
|
|
|
|
public enum eShockDeinterlaceMode : int
|
|
{
|
|
Weave,
|
|
Bob,
|
|
BobOffset
|
|
}
|
|
|
|
[Flags]
|
|
public enum eShockMemCb : int
|
|
{
|
|
None = 0,
|
|
Read = 1,
|
|
Write = 2,
|
|
Execute = 4
|
|
}
|
|
|
|
public const int SHOCK_OK = 0;
|
|
public const int SHOCK_FALSE = 0;
|
|
public const int SHOCK_TRUE = 1;
|
|
public const int SHOCK_ERROR = -1;
|
|
public const int SHOCK_NOCANDO = -2;
|
|
public const int SHOCK_INVALID_ADDRESS = -3;
|
|
public const int SHOCK_OVERFLOW = -4;
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockDiscInfo
|
|
{
|
|
public eRegion region;
|
|
public unsafe fixed sbyte id[5]; //SCEI, SCEA, SCEE, etc. with null terminator
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockTOCTrack
|
|
{
|
|
public byte adr;
|
|
public byte control;
|
|
public uint lba;
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockTOC
|
|
{
|
|
public byte first_track;
|
|
public byte last_track;
|
|
public byte disc_type;
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockFramebufferInfo
|
|
{
|
|
public int width, height;
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
public eShockFramebufferFlags flags;
|
|
public void* ptr;
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockRenderOptions
|
|
{
|
|
public int scanline_start, scanline_end;
|
|
public eShockRenderType renderType;
|
|
public eShockDeinterlaceMode deinterlaceMode;
|
|
public bool skip;
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockMemcardTransaction
|
|
{
|
|
[MarshalAs(UnmanagedType.I4)]
|
|
public eShockMemcardTransaction transaction;
|
|
public void* buffer128k;
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockRegisters_CPU
|
|
{
|
|
public fixed uint GPR[32];
|
|
public uint PC, PC_NEXT;
|
|
public uint IN_BD_SLOT;
|
|
public uint LO, HI;
|
|
public uint SR, CAUSE, EPC;
|
|
};
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct ShockStateTransaction
|
|
{
|
|
public eShockStateTransaction transaction;
|
|
public void* buffer;
|
|
public int bufferLength;
|
|
public TextStateFPtrs ff;
|
|
};
|
|
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
|
public delegate void ShockCallback_Trace(IntPtr opaque, uint PC, uint inst, string dis);
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
|
public delegate int ShockDisc_ReadTOC(IntPtr opaque, ShockTOC* read_target, ShockTOCTrack* tracks101);
|
|
|
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
|
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)]
|
|
public static extern int shock_Util_DisassembleMIPS(uint PC, uint instr, IntPtr outbuf, int buflen);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_CreateDisc(out IntPtr outDisc, IntPtr Opaque, int lbaCount, ShockDisc_ReadTOC ReadTOC, ShockDisc_ReadLBA ReadLBA2448, bool suppliesDeinterleavedSubcode);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_DestroyDisc(IntPtr disc);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_AnalyzeDisc(IntPtr disc, out ShockDiscInfo info);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Create(out IntPtr psx, eRegion region, void* firmware512k);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Destroy(IntPtr psx);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Peripheral_Connect(
|
|
IntPtr psx,
|
|
int address,
|
|
[MarshalAs(UnmanagedType.I4)] ePeripheralType type
|
|
);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Peripheral_SetPadInput(IntPtr psx, int address, uint buttons, byte left_x, byte left_y, byte right_x, byte right_y);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Peripheral_SetNegconInput(IntPtr psx, int address, uint buttons, byte twist, byte analog1, byte analog2, byte analogL);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Peripheral_MemcardTransact(IntPtr psx, int address, ref ShockMemcardTransaction transaction);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Peripheral_PollActive(IntPtr psx, int address, bool clear);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_MountEXE(IntPtr psx, void* exebuf, int size, bool ignore_pcsp);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_PowerOn(IntPtr psx);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_SoftReset(IntPtr psx);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_PowerOff(IntPtr psx);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_OpenTray(IntPtr psx);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_SetDisc(IntPtr psx, IntPtr disc);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_PokeDisc(IntPtr psx, IntPtr disc);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_CloseTray(IntPtr psx);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_SetRenderOptions(IntPtr psx, ref ShockRenderOptions opts);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_Step(IntPtr psx, eShockStep step);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_GetFramebuffer(IntPtr psx, ref ShockFramebufferInfo fb);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_GetSamples(IntPtr psx, void* buffer);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_GetMemData(
|
|
IntPtr psx,
|
|
out IntPtr ptr,
|
|
out int size,
|
|
[MarshalAs(UnmanagedType.I4)] eMemType memType
|
|
);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_StateTransaction(IntPtr psx, ref ShockStateTransaction transaction);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_GetRegisters_CPU(IntPtr psx, ref ShockRegisters_CPU buffer);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_SetRegister_CPU(IntPtr psx, int index, uint value);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
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)]
|
|
public static extern int shock_SetLEC(IntPtr psx, bool enable);
|
|
|
|
[DllImport(dd, CallingConvention = cc)]
|
|
public static extern int shock_GetGPUUnlagged(IntPtr psx);
|
|
}
|
|
} |