mirror of
https://github.com/mupen64plus-ae/mupen64plus-rsp-cxd4.git
synced 2024-11-23 05:29:50 +00:00
277 lines
9.7 KiB
C
277 lines
9.7 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
|
|
#ifdef M64P_PLUGIN_API
|
|
#define RSP_INFO_NAME RSP_info
|
|
#else
|
|
#define RSP_INFO_NAME RCP_info_SP
|
|
#endif
|
|
#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;
|
|
|
|
#if !defined(M64P_PLUGIN_API)
|
|
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;
|
|
#endif
|
|
|
|
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) && !defined(M64P_PLUGIN_API)
|
|
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
|