1 /***************************************************************************
2  *   Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team              *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA.           *
18  ***************************************************************************/
19 
20 #ifndef __PLUGINS_H__
21 #define __PLUGINS_H__
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #include "psxcommon.h"
28 
29 //#define ENABLE_SIO1API 1
30 
31 #ifndef _WIN32
32 
33 typedef void* HWND;
34 #define CALLBACK
35 
36 #else
37 
38 #define WIN32_LEAN_AND_MEAN
39 #include <windows.h>
40 
41 #endif
42 
43 typedef long (CALLBACK *GPUopen)(unsigned long *, char *, char *);
44 typedef long (CALLBACK *SPUopen)(void);
45 typedef long (CALLBACK *PADopen)(unsigned long *);
46 typedef long (CALLBACK *NETopen)(unsigned long *);
47 typedef long (CALLBACK *SIO1open)(unsigned long *);
48 
49 #include "spu.h"
50 
51 #include "psemu_plugin_defs.h"
52 #include "decode_xa.h"
53 
54 int LoadPlugins();
55 void ReleasePlugins();
56 int OpenPlugins();
57 void ClosePlugins();
58 int ReloadCdromPlugin();
59 
60 typedef unsigned long (CALLBACK* PSEgetLibType)(void);
61 typedef unsigned long (CALLBACK* PSEgetLibVersion)(void);
62 typedef char *(CALLBACK* PSEgetLibName)(void);
63 
64 // GPU Functions
65 typedef long (CALLBACK* GPUinit)(void);
66 typedef long (CALLBACK* GPUshutdown)(void);
67 typedef long (CALLBACK* GPUclose)(void);
68 typedef void (CALLBACK* GPUwriteStatus)(uint32_t);
69 typedef void (CALLBACK* GPUwriteData)(uint32_t);
70 typedef void (CALLBACK* GPUwriteDataMem)(uint32_t *, int);
71 typedef uint32_t (CALLBACK* GPUreadStatus)(void);
72 typedef uint32_t (CALLBACK* GPUreadData)(void);
73 typedef void (CALLBACK* GPUreadDataMem)(uint32_t *, int);
74 typedef long (CALLBACK* GPUdmaChain)(uint32_t *,uint32_t);
75 typedef void (CALLBACK* GPUupdateLace)(void);
76 typedef long (CALLBACK* GPUconfigure)(void);
77 typedef long (CALLBACK* GPUtest)(void);
78 typedef void (CALLBACK* GPUabout)(void);
79 typedef void (CALLBACK* GPUmakeSnapshot)(void);
80 typedef void (CALLBACK* GPUkeypressed)(int);
81 typedef void (CALLBACK* GPUdisplayText)(char *);
82 typedef struct {
83 	uint32_t ulFreezeVersion;
84 	uint32_t ulStatus;
85 	uint32_t ulControl[256];
86 	unsigned char psxVRam[1024*512*2];
87 } GPUFreeze_t;
88 typedef long (CALLBACK* GPUfreeze)(uint32_t, GPUFreeze_t *);
89 typedef long (CALLBACK* GPUgetScreenPic)(unsigned char *);
90 typedef long (CALLBACK* GPUshowScreenPic)(unsigned char *);
91 typedef void (CALLBACK* GPUclearDynarec)(void (CALLBACK *callback)(void));
92 typedef void (CALLBACK* GPUvBlank)(int, int);
93 
94 // GPU function pointers
95 extern GPUupdateLace    GPU_updateLace;
96 extern GPUinit          GPU_init;
97 extern GPUshutdown      GPU_shutdown;
98 extern GPUconfigure     GPU_configure;
99 extern GPUtest          GPU_test;
100 extern GPUabout         GPU_about;
101 extern GPUopen          GPU_open;
102 extern GPUclose         GPU_close;
103 extern GPUreadStatus    GPU_readStatus;
104 extern GPUreadData      GPU_readData;
105 extern GPUreadDataMem   GPU_readDataMem;
106 extern GPUwriteStatus   GPU_writeStatus;
107 extern GPUwriteData     GPU_writeData;
108 extern GPUwriteDataMem  GPU_writeDataMem;
109 extern GPUdmaChain      GPU_dmaChain;
110 extern GPUkeypressed    GPU_keypressed;
111 extern GPUdisplayText   GPU_displayText;
112 extern GPUmakeSnapshot  GPU_makeSnapshot;
113 extern GPUfreeze        GPU_freeze;
114 extern GPUgetScreenPic  GPU_getScreenPic;
115 extern GPUshowScreenPic GPU_showScreenPic;
116 extern GPUclearDynarec  GPU_clearDynarec;
117 extern GPUvBlank        GPU_vBlank;
118 
119 // CD-ROM Functions
120 typedef long (CALLBACK* CDRinit)(void);
121 typedef long (CALLBACK* CDRshutdown)(void);
122 typedef long (CALLBACK* CDRopen)(void);
123 typedef long (CALLBACK* CDRclose)(void);
124 typedef long (CALLBACK* CDRgetTN)(unsigned char *);
125 typedef long (CALLBACK* CDRgetTD)(unsigned char, unsigned char *);
126 typedef long (CALLBACK* CDRreadTrack)(unsigned char *);
127 typedef unsigned char* (CALLBACK* CDRgetBuffer)(void);
128 typedef unsigned char* (CALLBACK* CDRgetBufferSub)(void);
129 typedef long (CALLBACK* CDRconfigure)(void);
130 typedef long (CALLBACK* CDRtest)(void);
131 typedef void (CALLBACK* CDRabout)(void);
132 typedef long (CALLBACK* CDRplay)(unsigned char *);
133 typedef long (CALLBACK* CDRstop)(void);
134 typedef long (CALLBACK* CDRsetfilename)(char *);
135 struct CdrStat {
136 	uint32_t Type;
137 	uint32_t Status;
138 	unsigned char Time[3];
139 };
140 typedef long (CALLBACK* CDRgetStatus)(struct CdrStat *);
141 typedef char* (CALLBACK* CDRgetDriveLetter)(void);
142 struct SubQ {
143 	char res0[12];
144 	unsigned char ControlAndADR;
145 	unsigned char TrackNumber;
146 	unsigned char IndexNumber;
147 	unsigned char TrackRelativeAddress[3];
148 	unsigned char Filler;
149 	unsigned char AbsoluteAddress[3];
150 	unsigned char CRC[2];
151 	char res1[72];
152 };
153 typedef long (CALLBACK* CDRreadCDDA)(unsigned char, unsigned char, unsigned char, unsigned char *);
154 typedef long (CALLBACK* CDRgetTE)(unsigned char, unsigned char *, unsigned char *, unsigned char *);
155 
156 // CD-ROM function pointers
157 extern CDRinit               CDR_init;
158 extern CDRshutdown           CDR_shutdown;
159 extern CDRopen               CDR_open;
160 extern CDRclose              CDR_close;
161 extern CDRtest               CDR_test;
162 extern CDRgetTN              CDR_getTN;
163 extern CDRgetTD              CDR_getTD;
164 extern CDRreadTrack          CDR_readTrack;
165 extern CDRgetBuffer          CDR_getBuffer;
166 extern CDRgetBufferSub       CDR_getBufferSub;
167 extern CDRplay               CDR_play;
168 extern CDRstop               CDR_stop;
169 extern CDRgetStatus          CDR_getStatus;
170 extern CDRgetDriveLetter     CDR_getDriveLetter;
171 extern CDRconfigure          CDR_configure;
172 extern CDRabout              CDR_about;
173 extern CDRsetfilename        CDR_setfilename;
174 extern CDRreadCDDA           CDR_readCDDA;
175 extern CDRgetTE              CDR_getTE;
176 
177 // SPU Functions
178 typedef long (CALLBACK* SPUinit)(void);
179 typedef long (CALLBACK* SPUshutdown)(void);
180 typedef long (CALLBACK* SPUclose)(void);
181 typedef void (CALLBACK* SPUplaySample)(unsigned char);
182 typedef void (CALLBACK* SPUwriteRegister)(unsigned long, unsigned short, unsigned int);
183 typedef unsigned short (CALLBACK* SPUreadRegister)(unsigned long);
184 typedef void (CALLBACK* SPUwriteDMA)(unsigned short);
185 typedef unsigned short (CALLBACK* SPUreadDMA)(void);
186 typedef void (CALLBACK* SPUwriteDMAMem)(unsigned short *, int, unsigned int);
187 typedef void (CALLBACK* SPUreadDMAMem)(unsigned short *, int, unsigned int);
188 typedef void (CALLBACK* SPUplayADPCMchannel)(xa_decode_t *);
189 typedef void (CALLBACK* SPUregisterCallback)(void (CALLBACK *callback)(void));
190 typedef void (CALLBACK* SPUregisterScheduleCb)(void (CALLBACK *callback)(unsigned int cycles_after));
191 typedef long (CALLBACK* SPUconfigure)(void);
192 typedef long (CALLBACK* SPUtest)(void);
193 typedef void (CALLBACK* SPUabout)(void);
194 typedef struct {
195 	unsigned char PluginName[8];
196 	uint32_t PluginVersion;
197 	uint32_t Size;
198 	unsigned char SPUPorts[0x200];
199 	unsigned char SPURam[0x80000];
200 	xa_decode_t xa;
201 	unsigned char *SPUInfo;
202 } SPUFreeze_t;
203 typedef long (CALLBACK* SPUfreeze)(uint32_t, SPUFreeze_t *, uint32_t);
204 typedef void (CALLBACK* SPUasync)(uint32_t, uint32_t);
205 typedef int  (CALLBACK* SPUplayCDDAchannel)(short *, int);
206 
207 // SPU function pointers
208 extern SPUconfigure        SPU_configure;
209 extern SPUabout            SPU_about;
210 extern SPUinit             SPU_init;
211 extern SPUshutdown         SPU_shutdown;
212 extern SPUtest             SPU_test;
213 extern SPUopen             SPU_open;
214 extern SPUclose            SPU_close;
215 extern SPUplaySample       SPU_playSample;
216 extern SPUwriteRegister    SPU_writeRegister;
217 extern SPUreadRegister     SPU_readRegister;
218 extern SPUwriteDMA         SPU_writeDMA;
219 extern SPUreadDMA          SPU_readDMA;
220 extern SPUwriteDMAMem      SPU_writeDMAMem;
221 extern SPUreadDMAMem       SPU_readDMAMem;
222 extern SPUplayADPCMchannel SPU_playADPCMchannel;
223 extern SPUfreeze           SPU_freeze;
224 extern SPUregisterCallback SPU_registerCallback;
225 extern SPUregisterScheduleCb SPU_registerScheduleCb;
226 extern SPUasync            SPU_async;
227 extern SPUplayCDDAchannel  SPU_playCDDAchannel;
228 
229 // PAD Functions
230 typedef long (CALLBACK* PADconfigure)(void);
231 typedef void (CALLBACK* PADabout)(void);
232 typedef long (CALLBACK* PADinit)(long);
233 typedef long (CALLBACK* PADshutdown)(void);
234 typedef long (CALLBACK* PADtest)(void);
235 typedef long (CALLBACK* PADclose)(void);
236 typedef long (CALLBACK* PADquery)(void);
237 typedef long (CALLBACK* PADreadPort1)(PadDataS*);
238 typedef long (CALLBACK* PADreadPort2)(PadDataS*);
239 typedef long (CALLBACK* PADkeypressed)(void);
240 typedef unsigned char (CALLBACK* PADstartPoll)(int);
241 typedef unsigned char (CALLBACK* PADpoll)(unsigned char);
242 typedef void (CALLBACK* PADsetSensitive)(int);
243 
244 // PAD function pointers
245 extern PADconfigure        PAD1_configure;
246 extern PADabout            PAD1_about;
247 extern PADinit             PAD1_init;
248 extern PADshutdown         PAD1_shutdown;
249 extern PADtest             PAD1_test;
250 extern PADopen             PAD1_open;
251 extern PADclose            PAD1_close;
252 extern PADquery            PAD1_query;
253 extern PADreadPort1        PAD1_readPort1;
254 extern PADkeypressed       PAD1_keypressed;
255 extern PADstartPoll        PAD1_startPoll;
256 extern PADpoll             PAD1_poll;
257 extern PADsetSensitive     PAD1_setSensitive;
258 
259 extern PADconfigure        PAD2_configure;
260 extern PADabout            PAD2_about;
261 extern PADinit             PAD2_init;
262 extern PADshutdown         PAD2_shutdown;
263 extern PADtest             PAD2_test;
264 extern PADopen             PAD2_open;
265 extern PADclose            PAD2_close;
266 extern PADquery            PAD2_query;
267 extern PADreadPort2        PAD2_readPort2;
268 extern PADkeypressed       PAD2_keypressed;
269 extern PADstartPoll        PAD2_startPoll;
270 extern PADpoll             PAD2_poll;
271 extern PADsetSensitive     PAD2_setSensitive;
272 
273 // NET Functions
274 typedef long (CALLBACK* NETinit)(void);
275 typedef long (CALLBACK* NETshutdown)(void);
276 typedef long (CALLBACK* NETclose)(void);
277 typedef long (CALLBACK* NETconfigure)(void);
278 typedef long (CALLBACK* NETtest)(void);
279 typedef void (CALLBACK* NETabout)(void);
280 typedef void (CALLBACK* NETpause)(void);
281 typedef void (CALLBACK* NETresume)(void);
282 typedef long (CALLBACK* NETqueryPlayer)(void);
283 typedef long (CALLBACK* NETsendData)(void *, int, int);
284 typedef long (CALLBACK* NETrecvData)(void *, int, int);
285 typedef long (CALLBACK* NETsendPadData)(void *, int);
286 typedef long (CALLBACK* NETrecvPadData)(void *, int);
287 
288 typedef struct {
289 	char EmuName[32];
290 	char CdromID[9];	// ie. 'SCPH12345', no \0 trailing character
291 	char CdromLabel[11];
292 	void *psxMem;
293 	GPUshowScreenPic GPU_showScreenPic;
294 	GPUdisplayText GPU_displayText;
295 	PADsetSensitive PAD_setSensitive;
296 	char GPUpath[256];	// paths must be absolute
297 	char SPUpath[256];
298 	char CDRpath[256];
299 	char MCD1path[256];
300 	char MCD2path[256];
301 	char BIOSpath[256];	// 'HLE' for internal bios
302 	char Unused[1024];
303 } netInfo;
304 
305 typedef long (CALLBACK* NETsetInfo)(netInfo *);
306 typedef long (CALLBACK* NETkeypressed)(int);
307 
308 // NET function pointers
309 extern NETinit               NET_init;
310 extern NETshutdown           NET_shutdown;
311 extern NETopen               NET_open;
312 extern NETclose              NET_close;
313 extern NETtest               NET_test;
314 extern NETconfigure          NET_configure;
315 extern NETabout              NET_about;
316 extern NETpause              NET_pause;
317 extern NETresume             NET_resume;
318 extern NETqueryPlayer        NET_queryPlayer;
319 extern NETsendData           NET_sendData;
320 extern NETrecvData           NET_recvData;
321 extern NETsendPadData        NET_sendPadData;
322 extern NETrecvPadData        NET_recvPadData;
323 extern NETsetInfo            NET_setInfo;
324 extern NETkeypressed         NET_keypressed;
325 
326 #ifdef ENABLE_SIO1API
327 
328 // SIO1 Functions (link cable)
329 typedef long (CALLBACK* SIO1init)(void);
330 typedef long (CALLBACK* SIO1shutdown)(void);
331 typedef long (CALLBACK* SIO1close)(void);
332 typedef long (CALLBACK* SIO1configure)(void);
333 typedef long (CALLBACK* SIO1test)(void);
334 typedef void (CALLBACK* SIO1about)(void);
335 typedef void (CALLBACK* SIO1pause)(void);
336 typedef void (CALLBACK* SIO1resume)(void);
337 typedef long (CALLBACK* SIO1keypressed)(int);
338 typedef void (CALLBACK* SIO1writeData8)(unsigned char);
339 typedef void (CALLBACK* SIO1writeData16)(unsigned short);
340 typedef void (CALLBACK* SIO1writeData32)(unsigned long);
341 typedef void (CALLBACK* SIO1writeStat16)(unsigned short);
342 typedef void (CALLBACK* SIO1writeStat32)(unsigned long);
343 typedef void (CALLBACK* SIO1writeMode16)(unsigned short);
344 typedef void (CALLBACK* SIO1writeMode32)(unsigned long);
345 typedef void (CALLBACK* SIO1writeCtrl16)(unsigned short);
346 typedef void (CALLBACK* SIO1writeCtrl32)(unsigned long);
347 typedef void (CALLBACK* SIO1writeBaud16)(unsigned short);
348 typedef void (CALLBACK* SIO1writeBaud32)(unsigned long);
349 typedef unsigned char (CALLBACK* SIO1readData8)(void);
350 typedef unsigned short (CALLBACK* SIO1readData16)(void);
351 typedef unsigned long (CALLBACK* SIO1readData32)(void);
352 typedef unsigned short (CALLBACK* SIO1readStat16)(void);
353 typedef unsigned long (CALLBACK* SIO1readStat32)(void);
354 typedef unsigned short (CALLBACK* SIO1readMode16)(void);
355 typedef unsigned long (CALLBACK* SIO1readMode32)(void);
356 typedef unsigned short (CALLBACK* SIO1readCtrl16)(void);
357 typedef unsigned long (CALLBACK* SIO1readCtrl32)(void);
358 typedef unsigned short (CALLBACK* SIO1readBaud16)(void);
359 typedef unsigned long (CALLBACK* SIO1readBaud32)(void);
360 typedef void (CALLBACK* SIO1registerCallback)(void (CALLBACK *callback)(void));
361 
362 // SIO1 function pointers
363 extern SIO1init               SIO1_init;
364 extern SIO1shutdown           SIO1_shutdown;
365 extern SIO1open               SIO1_open;
366 extern SIO1close              SIO1_close;
367 extern SIO1test               SIO1_test;
368 extern SIO1configure          SIO1_configure;
369 extern SIO1about              SIO1_about;
370 extern SIO1pause              SIO1_pause;
371 extern SIO1resume             SIO1_resume;
372 extern SIO1keypressed         SIO1_keypressed;
373 extern SIO1writeData8         SIO1_writeData8;
374 extern SIO1writeData16        SIO1_writeData16;
375 extern SIO1writeData32        SIO1_writeData32;
376 extern SIO1writeStat16        SIO1_writeStat16;
377 extern SIO1writeStat32        SIO1_writeStat32;
378 extern SIO1writeMode16        SIO1_writeMode16;
379 extern SIO1writeMode32        SIO1_writeMode32;
380 extern SIO1writeCtrl16        SIO1_writeCtrl16;
381 extern SIO1writeCtrl32        SIO1_writeCtrl32;
382 extern SIO1writeBaud16        SIO1_writeBaud16;
383 extern SIO1writeBaud32        SIO1_writeBaud32;
384 extern SIO1readData8          SIO1_readData8;
385 extern SIO1readData16         SIO1_readData16;
386 extern SIO1readData32         SIO1_readData32;
387 extern SIO1readStat16         SIO1_readStat16;
388 extern SIO1readStat32         SIO1_readStat32;
389 extern SIO1readMode16         SIO1_readMode16;
390 extern SIO1readMode32         SIO1_readMode32;
391 extern SIO1readCtrl16         SIO1_readCtrl16;
392 extern SIO1readCtrl32         SIO1_readCtrl32;
393 extern SIO1readBaud16         SIO1_readBaud16;
394 extern SIO1readBaud32         SIO1_readBaud32;
395 extern SIO1registerCallback   SIO1_registerCallback;
396 
397 #endif
398 
399 void CALLBACK clearDynarec(void);
400 
401 void SetIsoFile(const char *filename);
402 const char *GetIsoFile(void);
403 boolean UsingIso(void);
404 void SetCdOpenCaseTime(s64 time);
405 
406 #ifdef __cplusplus
407 }
408 #endif
409 #endif
410