451ab91e |
1 | [http://mupen64plus.retrouprising.com Project page] |
2 | |
3 | == m64p_types.h == |
4 | /* ----------------------------------------- */ |
5 | /* Platform-specific stuff */ |
6 | /* ----------------------------------------- */ |
7 | |
8 | /* necessary headers */ |
9 | #if defined(WIN32) |
10 | #include <windows.h> |
11 | #endif |
12 | |
13 | /* DLL handles and function declaration specifiers */ |
14 | #if defined(WIN32) |
15 | #define IMPORT extern "C" __declspec(dllimport) |
16 | #define EXPORT __declspec(dllexport) |
17 | #define CALL __cdecl |
18 | typedef HMODULE m64p_dynlib_handle; |
19 | #else |
20 | #define IMPORT extern "C" |
21 | #define EXPORT __attribute__((visibility("default"))) |
22 | #define CALL |
23 | typedef void * m64p_dynlib_handle; |
24 | #endif |
25 | |
26 | /* ----------------------------------------- */ |
27 | /* Structures and Types for Core library API */ |
28 | /* ----------------------------------------- */ |
29 | |
30 | typedef void * m64p_handle; |
31 | |
32 | typedef void (*m64p_frame_callback)(unsigned int FrameIndex); |
33 | typedef void (*m64p_input_callback)(void); |
34 | typedef void (*m64p_audio_callback)(void); |
35 | typedef void (*m64p_vi_callback)(void); |
36 | |
37 | typedef enum { |
38 | M64TYPE_INT = 1, |
39 | M64TYPE_FLOAT, |
40 | M64TYPE_BOOL, |
41 | M64TYPE_STRING |
42 | } m64p_type; |
43 | |
44 | typedef enum { |
45 | M64MSG_ERROR = 1, |
46 | M64MSG_WARNING, |
47 | M64MSG_INFO, |
48 | M64MSG_STATUS, |
49 | M64MSG_VERBOSE |
50 | } m64p_msg_level; |
51 | |
52 | typedef enum { |
53 | M64ERR_SUCCESS = 0, |
54 | M64ERR_NOT_INIT, /* Function is disallowed before InitMupen64Plus() is called */ |
55 | M64ERR_ALREADY_INIT, /* InitMupen64Plus() was called twice */ |
56 | M64ERR_INCOMPATIBLE, /* API versions between components are incompatible */ |
57 | M64ERR_INPUT_ASSERT, /* Invalid parameters for function call, such as ParamValue=NULL for GetCoreParameter() */ |
58 | M64ERR_INPUT_INVALID, /* Invalid input data, such as ParamValue="maybe" for SetCoreParameter() to set a BOOL-type value */ |
59 | M64ERR_INPUT_NOT_FOUND, /* The input parameter(s) specified a particular item which was not found */ |
60 | M64ERR_NO_MEMORY, /* Memory allocation failed */ |
61 | M64ERR_FILES, /* Error opening, creating, reading, or writing to a file */ |
62 | M64ERR_INTERNAL, /* Internal error (bug) */ |
63 | M64ERR_INVALID_STATE, /* Current program state does not allow operation */ |
64 | M64ERR_PLUGIN_FAIL, /* A plugin function returned a fatal error */ |
65 | M64ERR_SYSTEM_FAIL, /* A system function call, such as an SDL or file operation, failed */ |
66 | M64ERR_UNSUPPORTED, /* Function call is not supported (ie, core not built with debugger) */ |
67 | M64ERR_WRONG_TYPE /* A given input type parameter cannot be used for desired operation */ |
68 | } m64p_error; |
69 | |
70 | typedef enum { |
71 | M64CAPS_DYNAREC = 1, |
72 | M64CAPS_DEBUGGER = 2, |
73 | M64CAPS_CORE_COMPARE = 4 |
74 | } m64p_core_caps; |
75 | |
76 | typedef enum { |
77 | M64PLUGIN_NULL = 0, |
78 | M64PLUGIN_RSP = 1, |
79 | M64PLUGIN_GFX, |
80 | M64PLUGIN_AUDIO, |
81 | M64PLUGIN_INPUT, |
82 | M64PLUGIN_CORE |
83 | } m64p_plugin_type; |
84 | |
85 | typedef enum { |
86 | M64EMU_STOPPED = 1, |
87 | M64EMU_RUNNING, |
88 | M64EMU_PAUSED |
89 | } m64p_emu_state; |
90 | |
91 | typedef enum { |
92 | M64VIDEO_NONE = 1, |
93 | M64VIDEO_WINDOWED, |
94 | M64VIDEO_FULLSCREEN |
95 | } m64p_video_mode; |
96 | |
97 | typedef enum { |
98 | M64VIDEOFLAG_SUPPORT_RESIZING = 1 |
99 | } m64p_video_flags; |
100 | |
101 | typedef enum { |
102 | M64CORE_EMU_STATE = 1, |
103 | M64CORE_VIDEO_MODE, |
104 | M64CORE_SAVESTATE_SLOT, |
105 | M64CORE_SPEED_FACTOR, |
106 | M64CORE_SPEED_LIMITER, |
107 | M64CORE_VIDEO_SIZE, |
108 | M64CORE_AUDIO_VOLUME, |
109 | M64CORE_AUDIO_MUTE, |
110 | M64CORE_INPUT_GAMESHARK, |
111 | M64CORE_STATE_LOADCOMPLETE, |
112 | M64CORE_STATE_SAVECOMPLETE |
113 | } m64p_core_param; |
114 | |
115 | typedef enum { |
116 | M64CMD_NOP = 0, |
117 | M64CMD_ROM_OPEN, |
118 | M64CMD_ROM_CLOSE, |
119 | M64CMD_ROM_GET_HEADER, |
120 | M64CMD_ROM_GET_SETTINGS, |
121 | M64CMD_EXECUTE, |
122 | M64CMD_STOP, |
123 | M64CMD_PAUSE, |
124 | M64CMD_RESUME, |
125 | M64CMD_CORE_STATE_QUERY, |
126 | M64CMD_STATE_LOAD, |
127 | M64CMD_STATE_SAVE, |
128 | M64CMD_STATE_SET_SLOT, |
129 | M64CMD_SEND_SDL_KEYDOWN, |
130 | M64CMD_SEND_SDL_KEYUP, |
131 | M64CMD_SET_FRAME_CALLBACK, |
132 | M64CMD_TAKE_NEXT_SCREENSHOT, |
133 | M64CMD_CORE_STATE_SET, |
134 | M64CMD_READ_SCREEN, |
135 | M64CMD_RESET, |
136 | M64CMD_ADVANCE_FRAME |
137 | } m64p_command; |
138 | |
139 | typedef struct { |
140 | unsigned int address; |
141 | int value; |
142 | } m64p_cheat_code; |
143 | |
144 | /* ----------------------------------------- */ |
145 | /* Structures to hold ROM image information */ |
146 | /* ----------------------------------------- */ |
147 | |
148 | typedef enum |
149 | { |
150 | SYSTEM_NTSC = 0, |
151 | SYSTEM_PAL, |
152 | SYSTEM_MPAL |
153 | } m64p_system_type; |
154 | |
155 | typedef struct |
156 | { |
157 | unsigned char init_PI_BSB_DOM1_LAT_REG; /* 0x00 */ |
158 | unsigned char init_PI_BSB_DOM1_PGS_REG; /* 0x01 */ |
159 | unsigned char init_PI_BSB_DOM1_PWD_REG; /* 0x02 */ |
160 | unsigned char init_PI_BSB_DOM1_PGS_REG2; /* 0x03 */ |
161 | unsigned int ClockRate; /* 0x04 */ |
162 | unsigned int PC; /* 0x08 */ |
163 | unsigned int Release; /* 0x0C */ |
164 | unsigned int CRC1; /* 0x10 */ |
165 | unsigned int CRC2; /* 0x14 */ |
166 | unsigned int Unknown[2]; /* 0x18 */ |
167 | unsigned char Name[20]; /* 0x20 */ |
168 | unsigned int unknown; /* 0x34 */ |
169 | unsigned int Manufacturer_ID; /* 0x38 */ |
170 | unsigned short Cartridge_ID; /* 0x3C - Game serial number */ |
171 | unsigned short Country_code; /* 0x3E */ |
172 | } m64p_rom_header; |
173 | |
174 | typedef struct |
175 | { |
176 | char goodname[256]; |
177 | char MD5[33]; |
178 | unsigned char savetype; |
179 | unsigned char status; /* Rom status on a scale from 0-5. */ |
180 | unsigned char players; /* Local players 0-4, 2/3/4 way Netplay indicated by 5/6/7. */ |
181 | unsigned char rumble; /* 0 - No, 1 - Yes boolean for rumble support. */ |
182 | } m64p_rom_settings; |
183 | |
184 | /* ----------------------------------------- */ |
185 | /* Structures and Types for the Debugger */ |
186 | /* ----------------------------------------- */ |
187 | |
188 | typedef enum { |
189 | M64P_DBG_RUN_STATE = 1, |
190 | M64P_DBG_PREVIOUS_PC, |
191 | M64P_DBG_NUM_BREAKPOINTS, |
192 | M64P_DBG_CPU_DYNACORE, |
193 | M64P_DBG_CPU_NEXT_INTERRUPT |
194 | } m64p_dbg_state; |
195 | |
196 | typedef enum { |
197 | M64P_DBG_MEM_TYPE = 1, |
198 | M64P_DBG_MEM_FLAGS, |
199 | M64P_DBG_MEM_HAS_RECOMPILED, |
200 | M64P_DBG_MEM_NUM_RECOMPILED, |
201 | M64P_DBG_RECOMP_OPCODE = 16, |
202 | M64P_DBG_RECOMP_ARGS, |
203 | M64P_DBG_RECOMP_ADDR |
204 | } m64p_dbg_mem_info; |
205 | |
206 | typedef enum { |
207 | M64P_MEM_NOMEM = 0, |
208 | M64P_MEM_NOTHING, |
209 | M64P_MEM_RDRAM, |
210 | M64P_MEM_RDRAMREG, |
211 | M64P_MEM_RSPMEM, |
212 | M64P_MEM_RSPREG, |
213 | M64P_MEM_RSP, |
214 | M64P_MEM_DP, |
215 | M64P_MEM_DPS, |
216 | M64P_MEM_VI, |
217 | M64P_MEM_AI, |
218 | M64P_MEM_PI, |
219 | M64P_MEM_RI, |
220 | M64P_MEM_SI, |
221 | M64P_MEM_FLASHRAMSTAT, |
222 | M64P_MEM_ROM, |
223 | M64P_MEM_PIF, |
224 | M64P_MEM_MI, |
225 | M64P_MEM_BREAKPOINT |
226 | } m64p_dbg_mem_type; |
227 | |
228 | typedef enum { |
229 | M64P_MEM_FLAG_READABLE = 0x01, |
230 | M64P_MEM_FLAG_WRITABLE = 0x02, |
231 | M64P_MEM_FLAG_READABLE_EMUONLY = 0x04, // the EMUONLY flags signify that emulated code can read/write here, but debugger cannot |
232 | M64P_MEM_FLAG_WRITABLE_EMUONLY = 0x08 |
233 | } m64p_dbg_mem_flags; |
234 | |
235 | typedef enum { |
236 | M64P_DBG_PTR_RDRAM = 1, |
237 | M64P_DBG_PTR_PI_REG, |
238 | M64P_DBG_PTR_SI_REG, |
239 | M64P_DBG_PTR_VI_REG, |
240 | M64P_DBG_PTR_RI_REG, |
241 | M64P_DBG_PTR_AI_REG |
242 | } m64p_dbg_memptr_type; |
243 | |
244 | typedef enum { |
245 | M64P_CPU_PC = 1, |
246 | M64P_CPU_REG_REG, |
247 | M64P_CPU_REG_HI, |
248 | M64P_CPU_REG_LO, |
249 | M64P_CPU_REG_COP0, |
250 | M64P_CPU_REG_COP1_DOUBLE_PTR, |
251 | M64P_CPU_REG_COP1_SIMPLE_PTR, |
252 | M64P_CPU_REG_COP1_FGR_64, |
253 | M64P_CPU_TLB |
254 | } m64p_dbg_cpu_data; |
255 | |
256 | typedef enum { |
257 | M64P_BKP_CMD_ADD_ADDR = 1, |
258 | M64P_BKP_CMD_ADD_STRUCT, |
259 | M64P_BKP_CMD_REPLACE, |
260 | M64P_BKP_CMD_REMOVE_ADDR, |
261 | M64P_BKP_CMD_REMOVE_IDX, |
262 | M64P_BKP_CMD_ENABLE, |
263 | M64P_BKP_CMD_DISABLE, |
264 | M64P_BKP_CMD_CHECK |
265 | } m64p_dbg_bkp_command; |
266 | |
267 | #define M64P_MEM_INVALID 0xFFFFFFFF // invalid memory read will return this |
268 | |
269 | #define BREAKPOINTS_MAX_NUMBER 128 |
270 | |
271 | #define BPT_FLAG_ENABLED 0x01 |
272 | #define BPT_FLAG_CONDITIONAL 0x02 |
273 | #define BPT_FLAG_COUNTER 0x04 |
274 | #define BPT_FLAG_READ 0x08 |
275 | #define BPT_FLAG_WRITE 0x10 |
276 | #define BPT_FLAG_EXEC 0x20 |
277 | #define BPT_FLAG_LOG 0x40 //Log to the console when this breakpoint hits. |
278 | |
279 | #define BPT_CHECK_FLAG(a, b) ((a.flags & b) == b) |
280 | #define BPT_SET_FLAG(a, b) a.flags = (a.flags | b); |
281 | #define BPT_CLEAR_FLAG(a, b) a.flags = (a.flags & (~b)); |
282 | #define BPT_TOGGLE_FLAG(a, b) a.flags = (a.flags ^ b); |
283 | |
284 | typedef struct _breakpoint { |
285 | unsigned int address; |
286 | unsigned int endaddr; |
287 | unsigned int flags; |
288 | //unsigned int condition; //Placeholder for breakpoint condition |
289 | } breakpoint; |
290 | |
291 | /* ------------------------------------------------- */ |
292 | /* Structures and Types for Core Video Extension API */ |
293 | /* ------------------------------------------------- */ |
294 | |
295 | typedef struct { |
296 | unsigned int uiWidth; |
297 | unsigned int uiHeight; |
298 | } m64p_2d_size; |
299 | |
300 | typedef enum { |
301 | M64P_GL_DOUBLEBUFFER = 1, |
302 | M64P_GL_BUFFER_SIZE, |
303 | M64P_GL_DEPTH_SIZE, |
304 | M64P_GL_RED_SIZE, |
305 | M64P_GL_GREEN_SIZE, |
306 | M64P_GL_BLUE_SIZE, |
307 | M64P_GL_ALPHA_SIZE, |
308 | M64P_GL_SWAP_CONTROL, |
309 | M64P_GL_MULTISAMPLEBUFFERS, |
310 | M64P_GL_MULTISAMPLESAMPLES |
311 | } m64p_GLattr; |
312 | |
313 | typedef struct { |
314 | unsigned int Functions; |
315 | m64p_error (*VidExtFuncInit)(void); |
316 | m64p_error (*VidExtFuncQuit)(void); |
317 | m64p_error (*VidExtFuncListModes)(m64p_2d_size *, int *); |
318 | m64p_error (*VidExtFuncSetMode)(int, int, int, int, int); |
319 | void * (*VidExtFuncGLGetProc)(const char*); |
320 | m64p_error (*VidExtFuncGLSetAttr)(m64p_GLattr, int); |
321 | m64p_error (*VidExtFuncGLGetAttr)(m64p_GLattr, int *); |
322 | m64p_error (*VidExtFuncGLSwapBuf)(void); |
323 | m64p_error (*VidExtFuncSetCaption)(const char *); |
324 | m64p_error (*VidExtFuncToggleFS)(void); |
325 | m64p_error (*VidExtFuncResizeWindow)(int, int); |
326 | } m64p_video_extension_functions; |
327 | |