mupen64plus-rsp-cxd4/rsp.h

271 lines
9.6 KiB
C

/*******************************************************************************
* Common RSP plugin specifications: version #1.2 created by zilmar *
* Revised 2014 by Iconoclast for more compliance, portability and readability. *
* *
* All questions or suggestions should go through the EmuTalk plugin forum. *
* http://www.emutalk.net/forums/showforum.php?f=31 *
*******************************************************************************/
#ifndef _RSP_H_INCLUDED__
#define _RSP_H_INCLUDED__
#include "my_types.h"
#if defined(__cplusplus)
extern "C" {
#endif
#define PLUGIN_TYPE_RSP 1
#define PLUGIN_TYPE_GFX 2
#define PLUGIN_TYPE_AUDIO 3
#define PLUGIN_TYPE_CONTROLLER 4
#ifndef PLUGIN_API_VERSION
#define PLUGIN_API_VERSION 0x0102
#endif
/* old names from the original specification file */
#define hInst hinst
#define MemorySwapped MemoryBswaped
/*
* Declare RSP_INFO structure instance as: `RSP_INFO RSP_INFO_NAME;'
* ... for the ability to use the below convenience macros.
*
* Doing the traditional `RSP_INFO rsp_info' declaration has also worked but
* requires accessing the RCP registers in a less portable way, for example:
* `*(rsp_info).MI_INTR_REG |= MI_INTR_MASK_SP;'
* versus
* `GET_RCP_REG(MI_INTR_REG) |= MI_INTR_MASK_SP;'.
*/
#ifndef RSP_INFO_NAME
#define RSP_INFO_NAME RCP_info_SP
#define GET_RSP_INFO(member) ((RSP_INFO_NAME).member)
#define GET_RCP_REG(member) (*(RSP_INFO_NAME).member)
#endif
typedef struct {
i32 left;
i32 top;
i32 right;
i32 bottom;
} winapi_rect;
typedef struct {
p_void hdc;
int fErase;
winapi_rect rcPaint;
int fRestore;
int fIncUpdate;
u8 rgbReserved[32];
} winapi_paintstruct;
typedef struct {
u16 Version; /* Set to PLUGIN_API_VERSION. */
u16 Type; /* Set to PLUGIN_TYPE_RSP. */
char Name[100]; /* plugin title, to help the user select plugins */
/* If the plugin supports these memory options, then set them to true. */
int NormalMemory; /* a normal byte array */
int MemorySwapped; /* a normal byte array choosing the client-side,
native hardware's endian over the MIPS target's */
} PLUGIN_INFO;
typedef struct {
p_void hInst;
int MemorySwapped;
pu8 RDRAM; /* CPU-RCP dynamic RAM (sensitive to MemorySwapped flag) */
pu8 DMEM; /* high 4K of SP cache memory (sensitive to MemorySwapped flag) */
pu8 IMEM; /* low 4K of SP cache memory (sensitive to MemorySwapped flag) */
pu32 MI_INTR_REG;
pu32 SP_MEM_ADDR_REG;
pu32 SP_DRAM_ADDR_REG;
pu32 SP_RD_LEN_REG;
pu32 SP_WR_LEN_REG;
pu32 SP_STATUS_REG;
pu32 SP_DMA_FULL_REG;
pu32 SP_DMA_BUSY_REG;
pu32 SP_PC_REG; /* This was supposed to be defined AFTER semaphore. */
pu32 SP_SEMAPHORE_REG;
#if 0
pu32 SP_PC_REG; /* CPU-mapped between SP and DP command buffer regs */
#endif
pu32 DPC_START_REG;
pu32 DPC_END_REG;
pu32 DPC_CURRENT_REG;
pu32 DPC_STATUS_REG;
pu32 DPC_CLOCK_REG;
pu32 DPC_BUFBUSY_REG;
pu32 DPC_PIPEBUSY_REG;
pu32 DPC_TMEM_REG;
p_func CheckInterrupts;
p_func ProcessDList;
p_func ProcessAList;
p_func ProcessRdpList;
p_func ShowCFB;
} RSP_INFO;
typedef struct {
/* menu */
/* Items should have an ID between 5001 and 5100. */
p_void hRSPMenu;
void (*ProcessMenuItem)(int ID);
/* break points */
int UseBPoints;
char BPPanelName[20];
p_func Add_BPoint;
void (*CreateBPPanel)(p_void hDlg, winapi_rect rcBox);
p_func HideBPPanel;
void (*PaintBPPanel)(winapi_paintstruct ps);
p_void ShowBPPanel;
void (*RefreshBpoints)(p_void hList);
void (*RemoveBpoint)(p_void hList, int index);
p_void RemoveAllBpoint;
/* RSP command window */
p_func Enter_RSP_Commands_Window;
} RSPDEBUG_INFO;
typedef struct {
p_func UpdateBreakPoints;
p_func UpdateMemory;
p_func UpdateR4300iRegisters;
p_func Enter_BPoint_Window;
p_func Enter_R4300i_Commands_Window;
p_func Enter_R4300i_Register_Window;
p_func Enter_RSP_Commands_Window;
p_func Enter_Memory_Window;
} DEBUG_INFO;
/******************************************************************************
* name : CloseDLL
* optional : no
* call time: when the emulator is shutting down or chooses to free memory
* input : none
* output : none
*******************************************************************************/
EXPORT void CALL CloseDLL(void);
/******************************************************************************
* name : DllAbout
* optional : yes
* call time: upon a request to see information about the plugin (e.g., authors)
* input : a pointer to the window that called this function
* output : none
*******************************************************************************/
EXPORT void CALL DllAbout(p_void hParent);
/******************************************************************************
* name : DllConfig
* optional : yes
* call time: upon a request to configure the plugin (e.g., change settings)
* input : a pointer to the window that called this function
* output : none
*******************************************************************************/
EXPORT void CALL DllConfig(p_void hParent);
/******************************************************************************
* name : DllTest
* optional : yes
* call time: upon a request to test the plugin (e.g., system capabilities)
* input : a pointer to the window that called this function
* output : none
*******************************************************************************/
EXPORT void CALL DllTest(p_void hParent);
/******************************************************************************
* name : DoRspCycles
* optional : no
* call time: when the R4300 CPU alternates control to execute on the RSP
* input : number of cycles meant to be executed (for segmented execution)
* output : The number of cycles executed also was intended for cycle-timing
* attempts, much like Project64 itself originally was, and requires
* individual experiment. This value is ignored if the RSP CPU flow
* was halted when the function completed. In-depth debate:
* http://www.emutalk.net/showthread.php?t=43088
*******************************************************************************/
EXPORT u32 CALL DoRspCycles(u32 Cycles);
/******************************************************************************
* name : GetDllInfo
* optional : no
* call time: during the enumeration of valid plugins the emulator can load
* input : a pointer to a PLUGIN_INFO stucture used to determine support
* output : none
*******************************************************************************/
EXPORT void CALL GetDllInfo(PLUGIN_INFO * PluginInfo);
/******************************************************************************
* name : GetRspDebugInfo
* optional : yes
* call time: when the emulator requests information about what the RSP plugin
* is and is not programmed to debug
* input : a pointer to a RSPDEBUG_INFO stucture to determine capabilities
* output : none
*******************************************************************************/
EXPORT void CALL GetRspDebugInfo(RSPDEBUG_INFO * RSPDebugInfo);
/******************************************************************************
* name : InitiateRSP
* optional : no
* call time: after the emulator has successfully loaded the plugin but needs
* more information about it before proceeding to start emulation
* input : a RSP_INFO structure mostly for setting up the RCP memory map
* output : none
*******************************************************************************/
EXPORT void CALL InitiateRSP(RSP_INFO Rsp_Info, pu32 CycleCount);
/******************************************************************************
* name : InitiateRSPDebugger
* optional : yes
* call time: after plugin load, when the emulator is ready to supply an
* informational structure useful to the RSP plugin for integrating
* its debugger, if any, with the rest of the emulator
* input : a DEBUG_INFO structure offering debugger integration information
* output : none
*******************************************************************************/
EXPORT void CALL InitiateRSPDebugger(DEBUG_INFO DebugInfo);
/******************************************************************************
* name : RomClosed
* optional : no
* call time: when unloading the ROM (sometimes when emulation ends)
* input : none
* output : none
*******************************************************************************/
EXPORT void CALL RomClosed(void);
/*
* required?? in version #1.2 of the RSP plugin spec
* Have not tested a #1.2 implementation yet so shouldn't document them yet.
*
* Most of these functions were made to inhibit private plugin distribution
* from Project64 in its commercial state, and there is no documentation of
* these in the source to Project64 2.x as of yet.
*/
#if (PLUGIN_API_VERSION >= 0x0102)
EXPORT void CALL RomOpen(void);
EXPORT void CALL EnableDebugging(int Enabled);
EXPORT void CALL PluginLoaded(void);
#endif
/************ profiling **************/
#define Default_ProfilingOn 0
#define Default_IndvidualBlock 0
#define Default_ShowErrors 0
#define Default_AudioHle 0
#define InterpreterCPU 0
#define RecompilerCPU 1
#if defined(__cplusplus)
}
#endif
#endif