| 1 | /***************************************************************************\r |
| 2 | * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team *\r |
| 3 | * *\r |
| 4 | * This program is free software; you can redistribute it and/or modify *\r |
| 5 | * it under the terms of the GNU General Public License as published by *\r |
| 6 | * the Free Software Foundation; either version 2 of the License, or *\r |
| 7 | * (at your option) any later version. *\r |
| 8 | * *\r |
| 9 | * This program is distributed in the hope that it will be useful, *\r |
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of *\r |
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *\r |
| 12 | * GNU General Public License for more details. *\r |
| 13 | * *\r |
| 14 | * You should have received a copy of the GNU General Public License *\r |
| 15 | * along with this program; if not, write to the *\r |
| 16 | * Free Software Foundation, Inc., *\r |
| 17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. *\r |
| 18 | ***************************************************************************/\r |
| 19 | \r |
| 20 | /*\r |
| 21 | * Plugin library callback/access functions.\r |
| 22 | */\r |
| 23 | \r |
| 24 | #include "plugins.h"\r |
| 25 | #include "cdriso.h"\r |
| 26 | \r |
| 27 | static char IsoFile[MAXPATHLEN] = "";\r |
| 28 | static s64 cdOpenCaseTime = 0;\r |
| 29 | \r |
| 30 | GPUupdateLace GPU_updateLace;\r |
| 31 | GPUinit GPU_init;\r |
| 32 | GPUshutdown GPU_shutdown; \r |
| 33 | GPUconfigure GPU_configure;\r |
| 34 | GPUtest GPU_test;\r |
| 35 | GPUabout GPU_about;\r |
| 36 | GPUopen GPU_open;\r |
| 37 | GPUclose GPU_close;\r |
| 38 | GPUreadStatus GPU_readStatus;\r |
| 39 | GPUreadData GPU_readData;\r |
| 40 | GPUreadDataMem GPU_readDataMem;\r |
| 41 | GPUwriteStatus GPU_writeStatus; \r |
| 42 | GPUwriteData GPU_writeData;\r |
| 43 | GPUwriteDataMem GPU_writeDataMem;\r |
| 44 | GPUdmaChain GPU_dmaChain;\r |
| 45 | GPUkeypressed GPU_keypressed;\r |
| 46 | GPUdisplayText GPU_displayText;\r |
| 47 | GPUmakeSnapshot GPU_makeSnapshot;\r |
| 48 | GPUfreeze GPU_freeze;\r |
| 49 | GPUgetScreenPic GPU_getScreenPic;\r |
| 50 | GPUshowScreenPic GPU_showScreenPic;\r |
| 51 | GPUclearDynarec GPU_clearDynarec;\r |
| 52 | GPUvBlank GPU_vBlank;\r |
| 53 | \r |
| 54 | CDRinit CDR_init;\r |
| 55 | CDRshutdown CDR_shutdown;\r |
| 56 | CDRopen CDR_open;\r |
| 57 | CDRclose CDR_close; \r |
| 58 | CDRtest CDR_test;\r |
| 59 | CDRgetTN CDR_getTN;\r |
| 60 | CDRgetTD CDR_getTD;\r |
| 61 | CDRreadTrack CDR_readTrack;\r |
| 62 | CDRgetBuffer CDR_getBuffer;\r |
| 63 | CDRplay CDR_play;\r |
| 64 | CDRstop CDR_stop;\r |
| 65 | CDRgetStatus CDR_getStatus;\r |
| 66 | CDRgetDriveLetter CDR_getDriveLetter;\r |
| 67 | CDRgetBufferSub CDR_getBufferSub;\r |
| 68 | CDRconfigure CDR_configure;\r |
| 69 | CDRabout CDR_about;\r |
| 70 | CDRsetfilename CDR_setfilename;\r |
| 71 | CDRreadCDDA CDR_readCDDA;\r |
| 72 | CDRgetTE CDR_getTE;\r |
| 73 | \r |
| 74 | SPUconfigure SPU_configure;\r |
| 75 | SPUabout SPU_about;\r |
| 76 | SPUinit SPU_init;\r |
| 77 | SPUshutdown SPU_shutdown;\r |
| 78 | SPUtest SPU_test;\r |
| 79 | SPUopen SPU_open;\r |
| 80 | SPUclose SPU_close;\r |
| 81 | SPUplaySample SPU_playSample;\r |
| 82 | SPUwriteRegister SPU_writeRegister;\r |
| 83 | SPUreadRegister SPU_readRegister;\r |
| 84 | SPUwriteDMA SPU_writeDMA;\r |
| 85 | SPUreadDMA SPU_readDMA;\r |
| 86 | SPUwriteDMAMem SPU_writeDMAMem;\r |
| 87 | SPUreadDMAMem SPU_readDMAMem;\r |
| 88 | SPUplayADPCMchannel SPU_playADPCMchannel;\r |
| 89 | SPUfreeze SPU_freeze;\r |
| 90 | SPUregisterCallback SPU_registerCallback;\r |
| 91 | SPUasync SPU_async;\r |
| 92 | SPUplayCDDAchannel SPU_playCDDAchannel;\r |
| 93 | \r |
| 94 | PADconfigure PAD1_configure;\r |
| 95 | PADabout PAD1_about;\r |
| 96 | PADinit PAD1_init;\r |
| 97 | PADshutdown PAD1_shutdown;\r |
| 98 | PADtest PAD1_test;\r |
| 99 | PADopen PAD1_open;\r |
| 100 | PADclose PAD1_close;\r |
| 101 | PADquery PAD1_query;\r |
| 102 | PADreadPort1 PAD1_readPort1;\r |
| 103 | PADkeypressed PAD1_keypressed;\r |
| 104 | PADstartPoll PAD1_startPoll;\r |
| 105 | PADpoll PAD1_poll;\r |
| 106 | PADsetSensitive PAD1_setSensitive;\r |
| 107 | \r |
| 108 | PADconfigure PAD2_configure;\r |
| 109 | PADabout PAD2_about;\r |
| 110 | PADinit PAD2_init;\r |
| 111 | PADshutdown PAD2_shutdown;\r |
| 112 | PADtest PAD2_test;\r |
| 113 | PADopen PAD2_open;\r |
| 114 | PADclose PAD2_close;\r |
| 115 | PADquery PAD2_query;\r |
| 116 | PADreadPort2 PAD2_readPort2;\r |
| 117 | PADkeypressed PAD2_keypressed;\r |
| 118 | PADstartPoll PAD2_startPoll;\r |
| 119 | PADpoll PAD2_poll;\r |
| 120 | PADsetSensitive PAD2_setSensitive;\r |
| 121 | \r |
| 122 | NETinit NET_init;\r |
| 123 | NETshutdown NET_shutdown;\r |
| 124 | NETopen NET_open;\r |
| 125 | NETclose NET_close; \r |
| 126 | NETtest NET_test;\r |
| 127 | NETconfigure NET_configure;\r |
| 128 | NETabout NET_about;\r |
| 129 | NETpause NET_pause;\r |
| 130 | NETresume NET_resume;\r |
| 131 | NETqueryPlayer NET_queryPlayer;\r |
| 132 | NETsendData NET_sendData;\r |
| 133 | NETrecvData NET_recvData;\r |
| 134 | NETsendPadData NET_sendPadData;\r |
| 135 | NETrecvPadData NET_recvPadData;\r |
| 136 | NETsetInfo NET_setInfo;\r |
| 137 | NETkeypressed NET_keypressed;\r |
| 138 | \r |
| 139 | #ifdef ENABLE_SIO1API\r |
| 140 | \r |
| 141 | SIO1init SIO1_init;\r |
| 142 | SIO1shutdown SIO1_shutdown;\r |
| 143 | SIO1open SIO1_open;\r |
| 144 | SIO1close SIO1_close; \r |
| 145 | SIO1test SIO1_test;\r |
| 146 | SIO1configure SIO1_configure;\r |
| 147 | SIO1about SIO1_about;\r |
| 148 | SIO1pause SIO1_pause;\r |
| 149 | SIO1resume SIO1_resume;\r |
| 150 | SIO1keypressed SIO1_keypressed;\r |
| 151 | SIO1writeData8 SIO1_writeData8;\r |
| 152 | SIO1writeData16 SIO1_writeData16;\r |
| 153 | SIO1writeData32 SIO1_writeData32;\r |
| 154 | SIO1writeStat16 SIO1_writeStat16;\r |
| 155 | SIO1writeStat32 SIO1_writeStat32;\r |
| 156 | SIO1writeMode16 SIO1_writeMode16;\r |
| 157 | SIO1writeMode32 SIO1_writeMode32;\r |
| 158 | SIO1writeCtrl16 SIO1_writeCtrl16;\r |
| 159 | SIO1writeCtrl32 SIO1_writeCtrl32;\r |
| 160 | SIO1writeBaud16 SIO1_writeBaud16;\r |
| 161 | SIO1writeBaud32 SIO1_writeBaud32;\r |
| 162 | SIO1readData8 SIO1_readData8;\r |
| 163 | SIO1readData16 SIO1_readData16;\r |
| 164 | SIO1readData32 SIO1_readData32;\r |
| 165 | SIO1readStat16 SIO1_readStat16;\r |
| 166 | SIO1readStat32 SIO1_readStat32;\r |
| 167 | SIO1readMode16 SIO1_readMode16;\r |
| 168 | SIO1readMode32 SIO1_readMode32;\r |
| 169 | SIO1readCtrl16 SIO1_readCtrl16;\r |
| 170 | SIO1readCtrl32 SIO1_readCtrl32;\r |
| 171 | SIO1readBaud16 SIO1_readBaud16;\r |
| 172 | SIO1readBaud32 SIO1_readBaud32;\r |
| 173 | SIO1registerCallback SIO1_registerCallback;\r |
| 174 | \r |
| 175 | #endif\r |
| 176 | \r |
| 177 | static const char *err;\r |
| 178 | \r |
| 179 | #define CheckErr(func) { \\r |
| 180 | err = SysLibError(); \\r |
| 181 | if (err != NULL) { SysMessage(_("Error loading %s: %s"), func, err); return -1; } \\r |
| 182 | }\r |
| 183 | \r |
| 184 | #define LoadSym(dest, src, name, checkerr) { \\r |
| 185 | dest = (src)SysLoadSym(drv, name); \\r |
| 186 | if (checkerr) { CheckErr(name); } else SysLibError(); \\r |
| 187 | }\r |
| 188 | \r |
| 189 | void *hGPUDriver = NULL;\r |
| 190 | \r |
| 191 | void CALLBACK GPU__displayText(char *pText) {\r |
| 192 | SysPrintf("%s\n", pText);\r |
| 193 | }\r |
| 194 | \r |
| 195 | long CALLBACK GPU__configure(void) { return 0; }\r |
| 196 | long CALLBACK GPU__test(void) { return 0; }\r |
| 197 | void CALLBACK GPU__about(void) {}\r |
| 198 | void CALLBACK GPU__makeSnapshot(void) {}\r |
| 199 | void CALLBACK GPU__keypressed(int key) {}\r |
| 200 | long CALLBACK GPU__getScreenPic(unsigned char *pMem) { return -1; }\r |
| 201 | long CALLBACK GPU__showScreenPic(unsigned char *pMem) { return -1; }\r |
| 202 | void CALLBACK GPU__clearDynarec(void (CALLBACK *callback)(void)) {}\r |
| 203 | void CALLBACK GPU__vBlank(int val) {}\r |
| 204 | \r |
| 205 | #define LoadGpuSym1(dest, name) \\r |
| 206 | LoadSym(GPU_##dest, GPU##dest, name, TRUE);\r |
| 207 | \r |
| 208 | #define LoadGpuSym0(dest, name) \\r |
| 209 | LoadSym(GPU_##dest, GPU##dest, name, FALSE); \\r |
| 210 | if (GPU_##dest == NULL) GPU_##dest = (GPU##dest) GPU__##dest;\r |
| 211 | \r |
| 212 | #define LoadGpuSymN(dest, name) \\r |
| 213 | LoadSym(GPU_##dest, GPU##dest, name, FALSE);\r |
| 214 | \r |
| 215 | static int LoadGPUplugin(const char *GPUdll) {\r |
| 216 | void *drv;\r |
| 217 | \r |
| 218 | hGPUDriver = SysLoadLibrary(GPUdll);\r |
| 219 | if (hGPUDriver == NULL) { \r |
| 220 | GPU_configure = NULL;\r |
| 221 | SysMessage (_("Could not load GPU plugin %s!"), GPUdll); return -1; \r |
| 222 | }\r |
| 223 | drv = hGPUDriver;\r |
| 224 | LoadGpuSym1(init, "GPUinit");\r |
| 225 | LoadGpuSym1(shutdown, "GPUshutdown");\r |
| 226 | LoadGpuSym1(open, "GPUopen");\r |
| 227 | LoadGpuSym1(close, "GPUclose");\r |
| 228 | LoadGpuSym1(readData, "GPUreadData");\r |
| 229 | LoadGpuSym1(readDataMem, "GPUreadDataMem");\r |
| 230 | LoadGpuSym1(readStatus, "GPUreadStatus");\r |
| 231 | LoadGpuSym1(writeData, "GPUwriteData");\r |
| 232 | LoadGpuSym1(writeDataMem, "GPUwriteDataMem");\r |
| 233 | LoadGpuSym1(writeStatus, "GPUwriteStatus");\r |
| 234 | LoadGpuSym1(dmaChain, "GPUdmaChain");\r |
| 235 | LoadGpuSym1(updateLace, "GPUupdateLace");\r |
| 236 | LoadGpuSym0(keypressed, "GPUkeypressed");\r |
| 237 | LoadGpuSym0(displayText, "GPUdisplayText");\r |
| 238 | LoadGpuSym0(makeSnapshot, "GPUmakeSnapshot");\r |
| 239 | LoadGpuSym1(freeze, "GPUfreeze");\r |
| 240 | LoadGpuSym0(getScreenPic, "GPUgetScreenPic");\r |
| 241 | LoadGpuSym0(showScreenPic, "GPUshowScreenPic");\r |
| 242 | LoadGpuSym0(clearDynarec, "GPUclearDynarec");\r |
| 243 | LoadGpuSym0(vBlank, "GPUvBlank");\r |
| 244 | LoadGpuSym0(configure, "GPUconfigure");\r |
| 245 | LoadGpuSym0(test, "GPUtest");\r |
| 246 | LoadGpuSym0(about, "GPUabout");\r |
| 247 | \r |
| 248 | return 0;\r |
| 249 | }\r |
| 250 | \r |
| 251 | void *hCDRDriver = NULL;\r |
| 252 | \r |
| 253 | long CALLBACK CDR__play(unsigned char *sector) { return 0; }\r |
| 254 | long CALLBACK CDR__stop(void) { return 0; }\r |
| 255 | \r |
| 256 | long CALLBACK CDR__getStatus(struct CdrStat *stat) {\r |
| 257 | if (cdOpenCaseTime < 0 || cdOpenCaseTime > (s64)time(NULL))\r |
| 258 | stat->Status = 0x10;\r |
| 259 | else\r |
| 260 | stat->Status = 0;\r |
| 261 | \r |
| 262 | return 0;\r |
| 263 | }\r |
| 264 | \r |
| 265 | char* CALLBACK CDR__getDriveLetter(void) { return NULL; }\r |
| 266 | long CALLBACK CDR__configure(void) { return 0; }\r |
| 267 | long CALLBACK CDR__test(void) { return 0; }\r |
| 268 | void CALLBACK CDR__about(void) {}\r |
| 269 | long CALLBACK CDR__setfilename(char*filename) { return 0; }\r |
| 270 | \r |
| 271 | #define LoadCdrSym1(dest, name) \\r |
| 272 | LoadSym(CDR_##dest, CDR##dest, name, TRUE);\r |
| 273 | \r |
| 274 | #define LoadCdrSym0(dest, name) \\r |
| 275 | LoadSym(CDR_##dest, CDR##dest, name, FALSE); \\r |
| 276 | if (CDR_##dest == NULL) CDR_##dest = (CDR##dest) CDR__##dest;\r |
| 277 | \r |
| 278 | #define LoadCdrSymN(dest, name) \\r |
| 279 | LoadSym(CDR_##dest, CDR##dest, name, FALSE);\r |
| 280 | \r |
| 281 | static int LoadCDRplugin(const char *CDRdll) {\r |
| 282 | void *drv;\r |
| 283 | \r |
| 284 | if (CDRdll == NULL) {\r |
| 285 | cdrIsoInit();\r |
| 286 | return 0;\r |
| 287 | }\r |
| 288 | \r |
| 289 | hCDRDriver = SysLoadLibrary(CDRdll);\r |
| 290 | if (hCDRDriver == NULL) {\r |
| 291 | CDR_configure = NULL;\r |
| 292 | SysMessage (_("Could not load CD-ROM plugin %s!"), CDRdll); return -1;\r |
| 293 | }\r |
| 294 | drv = hCDRDriver;\r |
| 295 | LoadCdrSym1(init, "CDRinit");\r |
| 296 | LoadCdrSym1(shutdown, "CDRshutdown");\r |
| 297 | LoadCdrSym1(open, "CDRopen");\r |
| 298 | LoadCdrSym1(close, "CDRclose");\r |
| 299 | LoadCdrSym1(getTN, "CDRgetTN");\r |
| 300 | LoadCdrSym1(getTD, "CDRgetTD");\r |
| 301 | LoadCdrSym1(readTrack, "CDRreadTrack");\r |
| 302 | LoadCdrSym1(getBuffer, "CDRgetBuffer");\r |
| 303 | LoadCdrSym1(getBufferSub, "CDRgetBufferSub");\r |
| 304 | LoadCdrSym0(play, "CDRplay");\r |
| 305 | LoadCdrSym0(stop, "CDRstop");\r |
| 306 | LoadCdrSym0(getStatus, "CDRgetStatus");\r |
| 307 | LoadCdrSym0(getDriveLetter, "CDRgetDriveLetter");\r |
| 308 | LoadCdrSym0(configure, "CDRconfigure");\r |
| 309 | LoadCdrSym0(test, "CDRtest");\r |
| 310 | LoadCdrSym0(about, "CDRabout");\r |
| 311 | LoadCdrSym0(setfilename, "CDRsetfilename");\r |
| 312 | LoadCdrSymN(readCDDA, "CDRreadCDDA");\r |
| 313 | LoadCdrSymN(getTE, "CDRgetTE");\r |
| 314 | \r |
| 315 | return 0;\r |
| 316 | }\r |
| 317 | \r |
| 318 | void *hSPUDriver = NULL;\r |
| 319 | \r |
| 320 | long CALLBACK SPU__configure(void) { return 0; }\r |
| 321 | void CALLBACK SPU__about(void) {}\r |
| 322 | long CALLBACK SPU__test(void) { return 0; }\r |
| 323 | \r |
| 324 | #define LoadSpuSym1(dest, name) \\r |
| 325 | LoadSym(SPU_##dest, SPU##dest, name, TRUE);\r |
| 326 | \r |
| 327 | #define LoadSpuSym0(dest, name) \\r |
| 328 | LoadSym(SPU_##dest, SPU##dest, name, FALSE); \\r |
| 329 | if (SPU_##dest == NULL) SPU_##dest = (SPU##dest) SPU__##dest;\r |
| 330 | \r |
| 331 | #define LoadSpuSymN(dest, name) \\r |
| 332 | LoadSym(SPU_##dest, SPU##dest, name, FALSE);\r |
| 333 | \r |
| 334 | static int LoadSPUplugin(const char *SPUdll) {\r |
| 335 | void *drv;\r |
| 336 | \r |
| 337 | hSPUDriver = SysLoadLibrary(SPUdll);\r |
| 338 | if (hSPUDriver == NULL) {\r |
| 339 | SPU_configure = NULL;\r |
| 340 | SysMessage (_("Could not load SPU plugin %s!"), SPUdll); return -1;\r |
| 341 | }\r |
| 342 | drv = hSPUDriver;\r |
| 343 | LoadSpuSym1(init, "SPUinit");\r |
| 344 | LoadSpuSym1(shutdown, "SPUshutdown");\r |
| 345 | LoadSpuSym1(open, "SPUopen");\r |
| 346 | LoadSpuSym1(close, "SPUclose");\r |
| 347 | LoadSpuSym0(configure, "SPUconfigure");\r |
| 348 | LoadSpuSym0(about, "SPUabout");\r |
| 349 | LoadSpuSym0(test, "SPUtest");\r |
| 350 | LoadSpuSym1(writeRegister, "SPUwriteRegister");\r |
| 351 | LoadSpuSym1(readRegister, "SPUreadRegister"); \r |
| 352 | LoadSpuSym1(writeDMA, "SPUwriteDMA");\r |
| 353 | LoadSpuSym1(readDMA, "SPUreadDMA");\r |
| 354 | LoadSpuSym1(writeDMAMem, "SPUwriteDMAMem");\r |
| 355 | LoadSpuSym1(readDMAMem, "SPUreadDMAMem");\r |
| 356 | LoadSpuSym1(playADPCMchannel, "SPUplayADPCMchannel");\r |
| 357 | LoadSpuSym1(freeze, "SPUfreeze");\r |
| 358 | LoadSpuSym1(registerCallback, "SPUregisterCallback");\r |
| 359 | LoadSpuSymN(async, "SPUasync");\r |
| 360 | LoadSpuSymN(playCDDAchannel, "SPUplayCDDAchannel");\r |
| 361 | \r |
| 362 | return 0;\r |
| 363 | }\r |
| 364 | \r |
| 365 | void *hPAD1Driver = NULL;\r |
| 366 | void *hPAD2Driver = NULL;\r |
| 367 | \r |
| 368 | static unsigned char buf[256];\r |
| 369 | unsigned char stdpar[10] = { 0x00, 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\r |
| 370 | unsigned char mousepar[8] = { 0x00, 0x12, 0x5a, 0xff, 0xff, 0xff, 0xff };\r |
| 371 | unsigned char analogpar[9] = { 0x00, 0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\r |
| 372 | \r |
| 373 | static int bufcount, bufc;\r |
| 374 | \r |
| 375 | PadDataS padd1, padd2;\r |
| 376 | \r |
| 377 | unsigned char _PADstartPoll(PadDataS *pad) {\r |
| 378 | bufc = 0;\r |
| 379 | \r |
| 380 | switch (pad->controllerType) {\r |
| 381 | case PSE_PAD_TYPE_MOUSE:\r |
| 382 | mousepar[3] = pad->buttonStatus & 0xff;\r |
| 383 | mousepar[4] = pad->buttonStatus >> 8;\r |
| 384 | mousepar[5] = pad->moveX;\r |
| 385 | mousepar[6] = pad->moveY;\r |
| 386 | \r |
| 387 | memcpy(buf, mousepar, 7);\r |
| 388 | bufcount = 6;\r |
| 389 | break;\r |
| 390 | case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069)\r |
| 391 | analogpar[1] = 0x23;\r |
| 392 | analogpar[3] = pad->buttonStatus & 0xff;\r |
| 393 | analogpar[4] = pad->buttonStatus >> 8;\r |
| 394 | analogpar[5] = pad->rightJoyX;\r |
| 395 | analogpar[6] = pad->rightJoyY;\r |
| 396 | analogpar[7] = pad->leftJoyX;\r |
| 397 | analogpar[8] = pad->leftJoyY;\r |
| 398 | \r |
| 399 | memcpy(buf, analogpar, 9);\r |
| 400 | bufcount = 8;\r |
| 401 | break;\r |
| 402 | case PSE_PAD_TYPE_ANALOGPAD: // scph1150\r |
| 403 | analogpar[1] = 0x73;\r |
| 404 | analogpar[3] = pad->buttonStatus & 0xff;\r |
| 405 | analogpar[4] = pad->buttonStatus >> 8;\r |
| 406 | analogpar[5] = pad->rightJoyX;\r |
| 407 | analogpar[6] = pad->rightJoyY;\r |
| 408 | analogpar[7] = pad->leftJoyX;\r |
| 409 | analogpar[8] = pad->leftJoyY;\r |
| 410 | \r |
| 411 | memcpy(buf, analogpar, 9);\r |
| 412 | bufcount = 8;\r |
| 413 | break;\r |
| 414 | case PSE_PAD_TYPE_ANALOGJOY: // scph1110\r |
| 415 | analogpar[1] = 0x53;\r |
| 416 | analogpar[3] = pad->buttonStatus & 0xff;\r |
| 417 | analogpar[4] = pad->buttonStatus >> 8;\r |
| 418 | analogpar[5] = pad->rightJoyX;\r |
| 419 | analogpar[6] = pad->rightJoyY;\r |
| 420 | analogpar[7] = pad->leftJoyX;\r |
| 421 | analogpar[8] = pad->leftJoyY;\r |
| 422 | \r |
| 423 | memcpy(buf, analogpar, 9);\r |
| 424 | bufcount = 8;\r |
| 425 | break;\r |
| 426 | case PSE_PAD_TYPE_STANDARD:\r |
| 427 | default:\r |
| 428 | stdpar[3] = pad->buttonStatus & 0xff;\r |
| 429 | stdpar[4] = pad->buttonStatus >> 8;\r |
| 430 | \r |
| 431 | memcpy(buf, stdpar, 5);\r |
| 432 | bufcount = 4;\r |
| 433 | }\r |
| 434 | \r |
| 435 | return buf[bufc++];\r |
| 436 | }\r |
| 437 | \r |
| 438 | unsigned char _PADpoll(unsigned char value) {\r |
| 439 | if (bufc > bufcount) return 0;\r |
| 440 | return buf[bufc++];\r |
| 441 | }\r |
| 442 | \r |
| 443 | unsigned char CALLBACK PAD1__startPoll(int pad) {\r |
| 444 | PadDataS padd;\r |
| 445 | \r |
| 446 | PAD1_readPort1(&padd);\r |
| 447 | \r |
| 448 | return _PADstartPoll(&padd);\r |
| 449 | }\r |
| 450 | \r |
| 451 | unsigned char CALLBACK PAD1__poll(unsigned char value) {\r |
| 452 | return _PADpoll(value);\r |
| 453 | }\r |
| 454 | \r |
| 455 | long CALLBACK PAD1__configure(void) { return 0; }\r |
| 456 | void CALLBACK PAD1__about(void) {}\r |
| 457 | long CALLBACK PAD1__test(void) { return 0; }\r |
| 458 | long CALLBACK PAD1__query(void) { return 3; }\r |
| 459 | long CALLBACK PAD1__keypressed() { return 0; }\r |
| 460 | \r |
| 461 | #define LoadPad1Sym1(dest, name) \\r |
| 462 | LoadSym(PAD1_##dest, PAD##dest, name, TRUE);\r |
| 463 | \r |
| 464 | #define LoadPad1SymN(dest, name) \\r |
| 465 | LoadSym(PAD1_##dest, PAD##dest, name, FALSE);\r |
| 466 | \r |
| 467 | #define LoadPad1Sym0(dest, name) \\r |
| 468 | LoadSym(PAD1_##dest, PAD##dest, name, FALSE); \\r |
| 469 | if (PAD1_##dest == NULL) PAD1_##dest = (PAD##dest) PAD1__##dest;\r |
| 470 | \r |
| 471 | static int LoadPAD1plugin(const char *PAD1dll) {\r |
| 472 | void *drv;\r |
| 473 | \r |
| 474 | hPAD1Driver = SysLoadLibrary(PAD1dll);\r |
| 475 | if (hPAD1Driver == NULL) {\r |
| 476 | PAD1_configure = NULL;\r |
| 477 | SysMessage (_("Could not load Controller 1 plugin %s!"), PAD1dll); return -1;\r |
| 478 | }\r |
| 479 | drv = hPAD1Driver;\r |
| 480 | LoadPad1Sym1(init, "PADinit");\r |
| 481 | LoadPad1Sym1(shutdown, "PADshutdown");\r |
| 482 | LoadPad1Sym1(open, "PADopen");\r |
| 483 | LoadPad1Sym1(close, "PADclose");\r |
| 484 | LoadPad1Sym0(query, "PADquery");\r |
| 485 | LoadPad1Sym1(readPort1, "PADreadPort1");\r |
| 486 | LoadPad1Sym0(configure, "PADconfigure");\r |
| 487 | LoadPad1Sym0(test, "PADtest");\r |
| 488 | LoadPad1Sym0(about, "PADabout");\r |
| 489 | LoadPad1Sym0(keypressed, "PADkeypressed");\r |
| 490 | LoadPad1Sym0(startPoll, "PADstartPoll");\r |
| 491 | LoadPad1Sym0(poll, "PADpoll");\r |
| 492 | LoadPad1SymN(setSensitive, "PADsetSensitive");\r |
| 493 | \r |
| 494 | return 0;\r |
| 495 | }\r |
| 496 | \r |
| 497 | unsigned char CALLBACK PAD2__startPoll(int pad) {\r |
| 498 | PadDataS padd;\r |
| 499 | \r |
| 500 | PAD2_readPort2(&padd);\r |
| 501 | \r |
| 502 | return _PADstartPoll(&padd);\r |
| 503 | }\r |
| 504 | \r |
| 505 | unsigned char CALLBACK PAD2__poll(unsigned char value) {\r |
| 506 | return _PADpoll(value);\r |
| 507 | }\r |
| 508 | \r |
| 509 | long CALLBACK PAD2__configure(void) { return 0; }\r |
| 510 | void CALLBACK PAD2__about(void) {}\r |
| 511 | long CALLBACK PAD2__test(void) { return 0; }\r |
| 512 | long CALLBACK PAD2__query(void) { return PSE_PAD_USE_PORT1 | PSE_PAD_USE_PORT2; }\r |
| 513 | long CALLBACK PAD2__keypressed() { return 0; }\r |
| 514 | \r |
| 515 | #define LoadPad2Sym1(dest, name) \\r |
| 516 | LoadSym(PAD2_##dest, PAD##dest, name, TRUE);\r |
| 517 | \r |
| 518 | #define LoadPad2Sym0(dest, name) \\r |
| 519 | LoadSym(PAD2_##dest, PAD##dest, name, FALSE); \\r |
| 520 | if (PAD2_##dest == NULL) PAD2_##dest = (PAD##dest) PAD2__##dest;\r |
| 521 | \r |
| 522 | #define LoadPad2SymN(dest, name) \\r |
| 523 | LoadSym(PAD2_##dest, PAD##dest, name, FALSE);\r |
| 524 | \r |
| 525 | static int LoadPAD2plugin(const char *PAD2dll) {\r |
| 526 | void *drv;\r |
| 527 | \r |
| 528 | hPAD2Driver = SysLoadLibrary(PAD2dll);\r |
| 529 | if (hPAD2Driver == NULL) {\r |
| 530 | PAD2_configure = NULL;\r |
| 531 | SysMessage (_("Could not load Controller 2 plugin %s!"), PAD2dll); return -1;\r |
| 532 | }\r |
| 533 | drv = hPAD2Driver;\r |
| 534 | LoadPad2Sym1(init, "PADinit");\r |
| 535 | LoadPad2Sym1(shutdown, "PADshutdown");\r |
| 536 | LoadPad2Sym1(open, "PADopen");\r |
| 537 | LoadPad2Sym1(close, "PADclose");\r |
| 538 | LoadPad2Sym0(query, "PADquery");\r |
| 539 | LoadPad2Sym1(readPort2, "PADreadPort2");\r |
| 540 | LoadPad2Sym0(configure, "PADconfigure");\r |
| 541 | LoadPad2Sym0(test, "PADtest");\r |
| 542 | LoadPad2Sym0(about, "PADabout");\r |
| 543 | LoadPad2Sym0(keypressed, "PADkeypressed");\r |
| 544 | LoadPad2Sym0(startPoll, "PADstartPoll");\r |
| 545 | LoadPad2Sym0(poll, "PADpoll");\r |
| 546 | LoadPad2SymN(setSensitive, "PADsetSensitive");\r |
| 547 | \r |
| 548 | return 0;\r |
| 549 | }\r |
| 550 | \r |
| 551 | void *hNETDriver = NULL;\r |
| 552 | \r |
| 553 | void CALLBACK NET__setInfo(netInfo *info) {}\r |
| 554 | void CALLBACK NET__keypressed(int key) {}\r |
| 555 | long CALLBACK NET__configure(void) { return 0; }\r |
| 556 | long CALLBACK NET__test(void) { return 0; }\r |
| 557 | void CALLBACK NET__about(void) {}\r |
| 558 | \r |
| 559 | #define LoadNetSym1(dest, name) \\r |
| 560 | LoadSym(NET_##dest, NET##dest, name, TRUE);\r |
| 561 | \r |
| 562 | #define LoadNetSymN(dest, name) \\r |
| 563 | LoadSym(NET_##dest, NET##dest, name, FALSE);\r |
| 564 | \r |
| 565 | #define LoadNetSym0(dest, name) \\r |
| 566 | LoadSym(NET_##dest, NET##dest, name, FALSE); \\r |
| 567 | if (NET_##dest == NULL) NET_##dest = (NET##dest) NET__##dest;\r |
| 568 | \r |
| 569 | static int LoadNETplugin(const char *NETdll) {\r |
| 570 | void *drv;\r |
| 571 | \r |
| 572 | hNETDriver = SysLoadLibrary(NETdll);\r |
| 573 | if (hNETDriver == NULL) {\r |
| 574 | SysMessage (_("Could not load NetPlay plugin %s!"), NETdll); return -1;\r |
| 575 | }\r |
| 576 | drv = hNETDriver;\r |
| 577 | LoadNetSym1(init, "NETinit");\r |
| 578 | LoadNetSym1(shutdown, "NETshutdown");\r |
| 579 | LoadNetSym1(open, "NETopen");\r |
| 580 | LoadNetSym1(close, "NETclose");\r |
| 581 | LoadNetSymN(sendData, "NETsendData");\r |
| 582 | LoadNetSymN(recvData, "NETrecvData");\r |
| 583 | LoadNetSym1(sendPadData, "NETsendPadData");\r |
| 584 | LoadNetSym1(recvPadData, "NETrecvPadData");\r |
| 585 | LoadNetSym1(queryPlayer, "NETqueryPlayer");\r |
| 586 | LoadNetSym1(pause, "NETpause");\r |
| 587 | LoadNetSym1(resume, "NETresume");\r |
| 588 | LoadNetSym0(setInfo, "NETsetInfo");\r |
| 589 | LoadNetSym0(keypressed, "NETkeypressed");\r |
| 590 | LoadNetSym0(configure, "NETconfigure");\r |
| 591 | LoadNetSym0(test, "NETtest");\r |
| 592 | LoadNetSym0(about, "NETabout");\r |
| 593 | \r |
| 594 | return 0;\r |
| 595 | }\r |
| 596 | \r |
| 597 | #ifdef ENABLE_SIO1API\r |
| 598 | \r |
| 599 | void *hSIO1Driver = NULL;\r |
| 600 | \r |
| 601 | long CALLBACK SIO1__init(void) { return 0; }\r |
| 602 | long CALLBACK SIO1__shutdown(void) { return 0; }\r |
| 603 | long CALLBACK SIO1__open(void) { return 0; }\r |
| 604 | long CALLBACK SIO1__close(void) { return 0; }\r |
| 605 | long CALLBACK SIO1__configure(void) { return 0; }\r |
| 606 | long CALLBACK SIO1__test(void) { return 0; }\r |
| 607 | void CALLBACK SIO1__about(void) {}\r |
| 608 | void CALLBACK SIO1__pause(void) {}\r |
| 609 | void CALLBACK SIO1__resume(void) {}\r |
| 610 | long CALLBACK SIO1__keypressed(int key) { return 0; }\r |
| 611 | void CALLBACK SIO1__writeData8(unsigned char val) {}\r |
| 612 | void CALLBACK SIO1__writeData16(unsigned short val) {}\r |
| 613 | void CALLBACK SIO1__writeData32(unsigned long val) {}\r |
| 614 | void CALLBACK SIO1__writeStat16(unsigned short val) {}\r |
| 615 | void CALLBACK SIO1__writeStat32(unsigned long val) {}\r |
| 616 | void CALLBACK SIO1__writeMode16(unsigned short val) {}\r |
| 617 | void CALLBACK SIO1__writeMode32(unsigned long val) {}\r |
| 618 | void CALLBACK SIO1__writeCtrl16(unsigned short val) {}\r |
| 619 | void CALLBACK SIO1__writeCtrl32(unsigned long val) {}\r |
| 620 | void CALLBACK SIO1__writeBaud16(unsigned short val) {}\r |
| 621 | void CALLBACK SIO1__writeBaud32(unsigned long val) {}\r |
| 622 | unsigned char CALLBACK SIO1__readData8(void) { return 0; }\r |
| 623 | unsigned short CALLBACK SIO1__readData16(void) { return 0; }\r |
| 624 | unsigned long CALLBACK SIO1__readData32(void) { return 0; }\r |
| 625 | unsigned short CALLBACK SIO1__readStat16(void) { return 0; }\r |
| 626 | unsigned long CALLBACK SIO1__readStat32(void) { return 0; }\r |
| 627 | unsigned short CALLBACK SIO1__readMode16(void) { return 0; }\r |
| 628 | unsigned long CALLBACK SIO1__readMode32(void) { return 0; }\r |
| 629 | unsigned short CALLBACK SIO1__readCtrl16(void) { return 0; }\r |
| 630 | unsigned long CALLBACK SIO1__readCtrl32(void) { return 0; }\r |
| 631 | unsigned short CALLBACK SIO1__readBaud16(void) { return 0; }\r |
| 632 | unsigned long CALLBACK SIO1__readBaud32(void) { return 0; }\r |
| 633 | void CALLBACK SIO1__registerCallback(void (CALLBACK *callback)(void)) {};\r |
| 634 | \r |
| 635 | void CALLBACK SIO1irq(void) {\r |
| 636 | psxHu32ref(0x1070) |= SWAPu32(0x100);\r |
| 637 | }\r |
| 638 | \r |
| 639 | #define LoadSio1Sym1(dest, name) \\r |
| 640 | LoadSym(SIO1_##dest, SIO1##dest, name, TRUE);\r |
| 641 | \r |
| 642 | #define LoadSio1SymN(dest, name) \\r |
| 643 | LoadSym(SIO1_##dest, SIO1##dest, name, FALSE);\r |
| 644 | \r |
| 645 | #define LoadSio1Sym0(dest, name) \\r |
| 646 | LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); \\r |
| 647 | if (SIO1_##dest == NULL) SIO1_##dest = (SIO1##dest) SIO1__##dest;\r |
| 648 | \r |
| 649 | static int LoadSIO1plugin(const char *SIO1dll) {\r |
| 650 | void *drv;\r |
| 651 | \r |
| 652 | hSIO1Driver = SysLoadLibrary(SIO1dll);\r |
| 653 | if (hSIO1Driver == NULL) {\r |
| 654 | SysMessage (_("Could not load SIO1 plugin %s!"), SIO1dll); return -1;\r |
| 655 | }\r |
| 656 | drv = hSIO1Driver;\r |
| 657 | \r |
| 658 | LoadSio1Sym0(init, "SIO1init");\r |
| 659 | LoadSio1Sym0(shutdown, "SIO1shutdown");\r |
| 660 | LoadSio1Sym0(open, "SIO1open");\r |
| 661 | LoadSio1Sym0(close, "SIO1close");\r |
| 662 | LoadSio1Sym0(pause, "SIO1pause");\r |
| 663 | LoadSio1Sym0(resume, "SIO1resume");\r |
| 664 | LoadSio1Sym0(keypressed, "SIO1keypressed");\r |
| 665 | LoadSio1Sym0(configure, "SIO1configure");\r |
| 666 | LoadSio1Sym0(test, "SIO1test");\r |
| 667 | LoadSio1Sym0(about, "SIO1about");\r |
| 668 | LoadSio1Sym0(writeData8, "SIO1writeData8");\r |
| 669 | LoadSio1Sym0(writeData16, "SIO1writeData16");\r |
| 670 | LoadSio1Sym0(writeData32, "SIO1writeData32");\r |
| 671 | LoadSio1Sym0(writeStat16, "SIO1writeStat16");\r |
| 672 | LoadSio1Sym0(writeStat32, "SIO1writeStat32");\r |
| 673 | LoadSio1Sym0(writeMode16, "SIO1writeMode16");\r |
| 674 | LoadSio1Sym0(writeMode32, "SIO1writeMode32");\r |
| 675 | LoadSio1Sym0(writeCtrl16, "SIO1writeCtrl16");\r |
| 676 | LoadSio1Sym0(writeCtrl32, "SIO1writeCtrl32");\r |
| 677 | LoadSio1Sym0(writeBaud16, "SIO1writeBaud16");\r |
| 678 | LoadSio1Sym0(writeBaud32, "SIO1writeBaud32");\r |
| 679 | LoadSio1Sym0(readData16, "SIO1readData16");\r |
| 680 | LoadSio1Sym0(readData32, "SIO1readData32");\r |
| 681 | LoadSio1Sym0(readStat16, "SIO1readStat16");\r |
| 682 | LoadSio1Sym0(readStat32, "SIO1readStat32");\r |
| 683 | LoadSio1Sym0(readMode16, "SIO1readMode16");\r |
| 684 | LoadSio1Sym0(readMode32, "SIO1readMode32");\r |
| 685 | LoadSio1Sym0(readCtrl16, "SIO1readCtrl16");\r |
| 686 | LoadSio1Sym0(readCtrl32, "SIO1readCtrl32");\r |
| 687 | LoadSio1Sym0(readBaud16, "SIO1readBaud16");\r |
| 688 | LoadSio1Sym0(readBaud32, "SIO1readBaud32");\r |
| 689 | LoadSio1Sym0(registerCallback, "SIO1registerCallback");\r |
| 690 | \r |
| 691 | return 0;\r |
| 692 | }\r |
| 693 | \r |
| 694 | #endif\r |
| 695 | \r |
| 696 | void CALLBACK clearDynarec(void) {\r |
| 697 | psxCpu->Reset();\r |
| 698 | }\r |
| 699 | \r |
| 700 | int LoadPlugins() {\r |
| 701 | int ret;\r |
| 702 | char Plugin[MAXPATHLEN];\r |
| 703 | \r |
| 704 | ReleasePlugins();\r |
| 705 | SysLibError();\r |
| 706 | \r |
| 707 | if (UsingIso()) {\r |
| 708 | LoadCDRplugin(NULL);\r |
| 709 | } else {\r |
| 710 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr);\r |
| 711 | if (LoadCDRplugin(Plugin) == -1) return -1;\r |
| 712 | }\r |
| 713 | \r |
| 714 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Gpu);\r |
| 715 | if (LoadGPUplugin(Plugin) == -1) return -1;\r |
| 716 | \r |
| 717 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Spu);\r |
| 718 | if (LoadSPUplugin(Plugin) == -1) return -1;\r |
| 719 | \r |
| 720 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad1);\r |
| 721 | if (LoadPAD1plugin(Plugin) == -1) return -1;\r |
| 722 | \r |
| 723 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad2);\r |
| 724 | if (LoadPAD2plugin(Plugin) == -1) return -1;\r |
| 725 | \r |
| 726 | if (strcmp("Disabled", Config.Net) == 0 || strcmp("", Config.Net) == 0)\r |
| 727 | Config.UseNet = FALSE;\r |
| 728 | else {\r |
| 729 | Config.UseNet = TRUE;\r |
| 730 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Net);\r |
| 731 | if (LoadNETplugin(Plugin) == -1) Config.UseNet = FALSE;\r |
| 732 | }\r |
| 733 | \r |
| 734 | #ifdef ENABLE_SIO1API\r |
| 735 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Sio1);\r |
| 736 | if (LoadSIO1plugin(Plugin) == -1) return -1;\r |
| 737 | #endif\r |
| 738 | \r |
| 739 | ret = CDR_init();\r |
| 740 | if (ret < 0) { SysMessage (_("Error initializing CD-ROM plugin: %d"), ret); return -1; }\r |
| 741 | ret = GPU_init();\r |
| 742 | if (ret < 0) { SysMessage (_("Error initializing GPU plugin: %d"), ret); return -1; }\r |
| 743 | ret = SPU_init();\r |
| 744 | if (ret < 0) { SysMessage (_("Error initializing SPU plugin: %d"), ret); return -1; }\r |
| 745 | ret = PAD1_init(1);\r |
| 746 | if (ret < 0) { SysMessage (_("Error initializing Controller 1 plugin: %d"), ret); return -1; }\r |
| 747 | ret = PAD2_init(2);\r |
| 748 | if (ret < 0) { SysMessage (_("Error initializing Controller 2 plugin: %d"), ret); return -1; }\r |
| 749 | \r |
| 750 | if (Config.UseNet) {\r |
| 751 | ret = NET_init();\r |
| 752 | if (ret < 0) { SysMessage (_("Error initializing NetPlay plugin: %d"), ret); return -1; }\r |
| 753 | }\r |
| 754 | \r |
| 755 | #ifdef ENABLE_SIO1API\r |
| 756 | ret = SIO1_init();\r |
| 757 | if (ret < 0) { SysMessage (_("Error initializing SIO1 plugin: %d"), ret); return -1; }\r |
| 758 | #endif\r |
| 759 | \r |
| 760 | SysPrintf(_("Plugins loaded.\n"));\r |
| 761 | return 0;\r |
| 762 | }\r |
| 763 | \r |
| 764 | void ReleasePlugins() {\r |
| 765 | if (Config.UseNet) {\r |
| 766 | int ret = NET_close();\r |
| 767 | if (ret < 0) Config.UseNet = FALSE;\r |
| 768 | }\r |
| 769 | NetOpened = FALSE;\r |
| 770 | \r |
| 771 | if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown();\r |
| 772 | if (hGPUDriver != NULL) GPU_shutdown();\r |
| 773 | if (hSPUDriver != NULL) SPU_shutdown();\r |
| 774 | if (hPAD1Driver != NULL) PAD1_shutdown();\r |
| 775 | if (hPAD2Driver != NULL) PAD2_shutdown();\r |
| 776 | \r |
| 777 | if (Config.UseNet && hNETDriver != NULL) NET_shutdown(); \r |
| 778 | \r |
| 779 | if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL;\r |
| 780 | if (hGPUDriver != NULL) SysCloseLibrary(hGPUDriver); hGPUDriver = NULL;\r |
| 781 | if (hSPUDriver != NULL) SysCloseLibrary(hSPUDriver); hSPUDriver = NULL;\r |
| 782 | if (hPAD1Driver != NULL) SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL;\r |
| 783 | if (hPAD2Driver != NULL) SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL;\r |
| 784 | \r |
| 785 | if (Config.UseNet && hNETDriver != NULL) {\r |
| 786 | SysCloseLibrary(hNETDriver); hNETDriver = NULL;\r |
| 787 | }\r |
| 788 | \r |
| 789 | #ifdef ENABLE_SIO1API\r |
| 790 | if (hSIO1Driver != NULL) {\r |
| 791 | SIO1_shutdown();\r |
| 792 | SysCloseLibrary(hSIO1Driver);\r |
| 793 | hSIO1Driver = NULL;\r |
| 794 | }\r |
| 795 | #endif\r |
| 796 | }\r |
| 797 | \r |
| 798 | // for CD swap\r |
| 799 | int ReloadCdromPlugin()\r |
| 800 | {\r |
| 801 | if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown();\r |
| 802 | if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL;\r |
| 803 | \r |
| 804 | if (UsingIso()) {\r |
| 805 | LoadCDRplugin(NULL);\r |
| 806 | } else {\r |
| 807 | char Plugin[MAXPATHLEN];\r |
| 808 | sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr);\r |
| 809 | if (LoadCDRplugin(Plugin) == -1) return -1;\r |
| 810 | }\r |
| 811 | \r |
| 812 | return CDR_init();\r |
| 813 | }\r |
| 814 | \r |
| 815 | void SetIsoFile(const char *filename) {\r |
| 816 | if (filename == NULL) {\r |
| 817 | IsoFile[0] = '\0';\r |
| 818 | return;\r |
| 819 | }\r |
| 820 | strncpy(IsoFile, filename, MAXPATHLEN);\r |
| 821 | }\r |
| 822 | \r |
| 823 | const char *GetIsoFile(void) {\r |
| 824 | return IsoFile;\r |
| 825 | }\r |
| 826 | \r |
| 827 | boolean UsingIso(void) {\r |
| 828 | return (IsoFile[0] != '\0');\r |
| 829 | }\r |
| 830 | \r |
| 831 | void SetCdOpenCaseTime(s64 time) {\r |
| 832 | cdOpenCaseTime = time;\r |
| 833 | }\r |