X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fplugins.c;h=87b574d442a7895dcf08ae3954ab412b28484496;hb=6fe8a1d4501485790b5a58f1a4c62130dd70afb4;hp=fc2ce044aa60cfacf415a3ee6cd2f0b7c2067546;hpb=d9176559431d6ffcb29ffb247eced5be0003ac32;p=pcsx_rearmed.git diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index fc2ce044..87b574d4 100644 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -242,7 +242,7 @@ static int LoadGPUplugin(const char *GPUdll) { LoadGpuSym0(getScreenPic, "GPUgetScreenPic"); LoadGpuSym0(showScreenPic, "GPUshowScreenPic"); LoadGpuSym0(clearDynarec, "GPUclearDynarec"); - LoadGpuSym0(vBlank, "GPUvBlank"); + LoadGpuSym0(vBlank, "GPUvBlank"); LoadGpuSym0(configure, "GPUconfigure"); LoadGpuSym0(test, "GPUtest"); LoadGpuSym0(about, "GPUabout"); @@ -366,6 +366,8 @@ static int LoadSPUplugin(const char *SPUdll) { return 0; } +extern int in_type[8]; + void *hPAD1Driver = NULL; void *hPAD2Driver = NULL; @@ -376,6 +378,7 @@ static PadDataS pad[8]; static int reqPos, respSize, req; static int ledStateReq44[8]; +static int PadMode[8]; /* 0 : digital 1: analog */ static unsigned char buf[256]; static unsigned char bufMulti[34] = { 0x80, 0x5a, @@ -507,16 +510,20 @@ enum { REQ4F = 0x4F }; + + + //NO MULTITAP -static void initBufForRequest(int padIndex, char value) { - switch (value) { +void initBufForRequest(int padIndex, char value){ + switch (value){ //Pad keystate already in buffer //case CMD_READ_DATA_AND_VIBRATE : // break; case CMD_CONFIG_MODE : if (pad[padIndex].configMode == 1) { memcpy(buf, resp43, 8); + break; } //else, not in config mode, pad keystate return (already in the buffer) break; @@ -525,6 +532,7 @@ static void initBufForRequest(int padIndex, char value) { break; case CMD_QUERY_MODEL_AND_MODE : memcpy(buf, resp45, 8); + buf[4] = PadMode[padIndex]; break; case CMD_QUERY_ACT : memcpy(buf, resp46_00, 8); @@ -562,8 +570,11 @@ static void initBufForRequest(int padIndex, char value) { } } -static void reqIndex2Treatment(int padIndex, char value) { - switch (value) { + + + +void reqIndex2Treatment(int padIndex, char value){ + switch (req){ case CMD_CONFIG_MODE : //0x43 if (value == 0) { @@ -577,6 +588,7 @@ static void reqIndex2Treatment(int padIndex, char value) { //0x01 analog ON //0x00 analog OFF ledStateReq44[padIndex] = value; + PadMode[padIndex] = value; break; case CMD_QUERY_ACT : //0x46 @@ -600,7 +612,7 @@ static void reqIndex2Treatment(int padIndex, char value) { } } -void vibrate(int padIndex) { +void vibrate(int padIndex){ if (pad[padIndex].Vib[0] != pad[padIndex].VibF[0] || pad[padIndex].Vib[1] != pad[padIndex].VibF[1]) { //value is different update Value and call libretro for vibration pad[padIndex].VibF[0] = pad[padIndex].Vib[0]; @@ -610,91 +622,165 @@ void vibrate(int padIndex) { } } + + + //Build response for 0x42 request Pad in port void _PADstartPoll(PadDataS *pad) { - switch (pad->controllerType) { - case PSE_PAD_TYPE_MOUSE: + switch (pad->controllerType) { + case PSE_PAD_TYPE_MOUSE: stdpar[0] = 0x12; - stdpar[2] = pad->buttonStatus & 0xff; - stdpar[3] = pad->buttonStatus >> 8; - stdpar[4] = pad->moveX; - stdpar[5] = pad->moveY; - memcpy(buf, stdpar, 6); - respSize = 6; - break; - case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069) - stdpar[0] = 0x23; - stdpar[2] = pad->buttonStatus & 0xff; - stdpar[3] = pad->buttonStatus >> 8; - stdpar[4] = pad->rightJoyX; - stdpar[5] = pad->rightJoyY; - stdpar[6] = pad->leftJoyX; - stdpar[7] = pad->leftJoyY; - memcpy(buf, stdpar, 8); - respSize = 8; - break; - case PSE_PAD_TYPE_ANALOGPAD: // scph1150 - stdpar[0] = 0x73; - stdpar[2] = pad->buttonStatus & 0xff; - stdpar[3] = pad->buttonStatus >> 8; - stdpar[4] = pad->rightJoyX; - stdpar[5] = pad->rightJoyY; - stdpar[6] = pad->leftJoyX; - stdpar[7] = pad->leftJoyY; - memcpy(buf, stdpar, 8); - respSize = 8; - break; - case PSE_PAD_TYPE_ANALOGJOY: // scph1110 - stdpar[0] = 0x53; - stdpar[2] = pad->buttonStatus & 0xff; - stdpar[3] = pad->buttonStatus >> 8; - stdpar[4] = pad->rightJoyX; - stdpar[5] = pad->rightJoyY; - stdpar[6] = pad->leftJoyX; - stdpar[7] = pad->leftJoyY; - memcpy(buf, stdpar, 8); - respSize = 8; - break; - case PSE_PAD_TYPE_STANDARD: - default: - stdpar[0] = 0x41; - stdpar[2] = pad->buttonStatus & 0xff; - stdpar[3] = pad->buttonStatus >> 8; - //avoid analog value in multitap mode if change pad type in game. - stdpar[4] = 0xff; - stdpar[5] = 0xff; - stdpar[6] = 0xff; - stdpar[7] = 0xff; - memcpy(buf, stdpar, 8); - respSize = 8; - } + stdpar[1] = 0x5a; + stdpar[2] = pad->buttonStatus & 0xff; + stdpar[3] = pad->buttonStatus >> 8; + stdpar[4] = pad->moveX; + stdpar[5] = pad->moveY; + memcpy(buf, stdpar, 6); + respSize = 6; + break; + case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069) + stdpar[0] = 0x23; + stdpar[1] = 0x5a; + stdpar[2] = pad->buttonStatus & 0xff; + stdpar[3] = pad->buttonStatus >> 8; + stdpar[4] = pad->rightJoyX; + stdpar[5] = pad->rightJoyY; + stdpar[6] = pad->leftJoyX; + stdpar[7] = pad->leftJoyY; + memcpy(buf, stdpar, 8); + respSize = 8; + break; + case PSE_PAD_TYPE_GUNCON: // GUNCON - gun controller SLPH-00034 from Namco + stdpar[0] = 0x63; + stdpar[1] = 0x5a; + stdpar[2] = pad->buttonStatus & 0xff; + stdpar[3] = pad->buttonStatus >> 8; + + //This code assumes an X resolution of 256 and a Y resolution of 240 + int xres = 256; + int yres = 240; + + //The code wants an input range for x and y of 0-1023 we passed in -32767 -> 32767 + int absX = (pad->absoluteX / 64) + 512; + int absY = (pad->absoluteY / 64) + 512; + + //Keep within limits + if (absX > 1023) absX = 1023; + if (absX < 0) absX = 0; + if (absY > 1023) absY = 1023; + if (absY < 0) absY = 0; + + stdpar[4] = 0x5a - (xres - 256) / 3 + (((xres - 256) / 3 + 356) * absX >> 10); + stdpar[5] = (0x5a - (xres - 256) / 3 + (((xres - 256) / 3 + 356) * absX >> 10)) >> 8; + stdpar[6] = 0x20 + (yres * absY >> 10); + stdpar[7] = (0x20 + (yres * absY >> 10)) >> 8; + + //Offscreen - Point at the side of the screen so PSX thinks you are pointing offscreen + //Required as a mouse can't be offscreen + //Coordinates X=0001h, Y=000Ah indicates "no light" + //This will mean you cannot shoot the very each of the screen + //ToDo read offscreen range from settings if useful to change + int OffscreenRange = 2; + if (absX < (OffscreenRange) || absX > (1023 - OffscreenRange) || absY < (OffscreenRange) || absY > (1023 - OffscreenRange)) { + stdpar[4] = 0x01; + stdpar[5] = 0x00; + stdpar[6] = 0x0A; + stdpar[7] = 0x00; + } + + memcpy(buf, stdpar, 8); + respSize = 8; + break; + case PSE_PAD_TYPE_ANALOGPAD: // scph1150 + stdpar[0] = 0x73; + stdpar[1] = 0x5a; + stdpar[2] = pad->buttonStatus & 0xff; + stdpar[3] = pad->buttonStatus >> 8; + stdpar[4] = pad->rightJoyX; + stdpar[5] = pad->rightJoyY; + stdpar[6] = pad->leftJoyX; + stdpar[7] = pad->leftJoyY; + memcpy(buf, stdpar, 8); + respSize = 8; + break; + case PSE_PAD_TYPE_ANALOGJOY: // scph1110 + stdpar[0] = 0x53; + stdpar[1] = 0x5a; + stdpar[2] = pad->buttonStatus & 0xff; + stdpar[3] = pad->buttonStatus >> 8; + stdpar[4] = pad->rightJoyX; + stdpar[5] = pad->rightJoyY; + stdpar[6] = pad->leftJoyX; + stdpar[7] = pad->leftJoyY; + memcpy(buf, stdpar, 8); + respSize = 8; + break; + case PSE_PAD_TYPE_STANDARD: + stdpar[0] = 0x41; + stdpar[1] = 0x5a; + stdpar[2] = pad->buttonStatus & 0xff; + stdpar[3] = pad->buttonStatus >> 8; + //avoid analog value in multitap mode if change pad type in game. + stdpar[4] = 0xff; + stdpar[5] = 0xff; + stdpar[6] = 0xff; + stdpar[7] = 0xff; + memcpy(buf, stdpar, 8); + respSize = 8; + break; + default: + stdpar[0] = 0xff; + stdpar[1] = 0xff; + stdpar[2] = 0xff; + stdpar[3] = 0xff; + stdpar[4] = 0xff; + stdpar[5] = 0xff; + stdpar[6] = 0xff; + stdpar[7] = 0xff; + memcpy(buf, stdpar, 8); + respSize = 8; + break; + } } + //Build response for 0x42 request Multitap in port //Response header for multitap : 0x80, 0x5A, (Pad information port 1-2A), (Pad information port 1-2B), (Pad information port 1-2C), (Pad information port 1-2D) void _PADstartPollMultitap(PadDataS* padd) { int i, offset; for(i = 0; i < 4; i++) { offset = 2 + (i * 8); - _PADstartPoll(&padd[i]); - memcpy(multitappar+offset, stdpar, 8); + _PADstartPoll(&padd[i]); + memcpy(multitappar+offset, stdpar, 8); } memcpy(bufMulti, multitappar, 34); respSize = 34; } + unsigned char _PADpoll(int port, unsigned char value) { if (reqPos == 0) { //mem the request number req = value; - //copy the default value of request response in buffer instead of the keystate - initBufForRequest(port, value); + + // Don't enable Analog/Vibration for a standard pad + if (in_type[port] == PSE_PAD_TYPE_STANDARD || + in_type[port] == PSE_PAD_TYPE_NEGCON) { + ; // Pad keystate already in buffer + } + else + { + //copy the default value of request response in buffer instead of the keystate + initBufForRequest(port, value); + } } //if no new request the pad return 0xff, for signaling connected - if (reqPos >= respSize) return 0xff; + if (reqPos >= respSize + && writeok + ) return 0xff; - switch(reqPos) { + switch(reqPos){ case 2: reqIndex2Treatment(port, value); break; @@ -706,6 +792,10 @@ unsigned char _PADpoll(int port, unsigned char value) { case CMD_READ_DATA_AND_VIBRATE: //mem the vibration value for Large motor; pad[port].Vib[1] = value; + + if (in_type[port] != PSE_PAD_TYPE_ANALOGPAD) + break; + //vibration vibrate(port); break; @@ -715,13 +805,13 @@ unsigned char _PADpoll(int port, unsigned char value) { return buf[reqPos++]; } -unsigned char _PADpollMultitap(int port, unsigned char value) { - if (reqPos >= respSize) - return 0xff; +unsigned char _PADpollMultitap(int port, unsigned char value) { + if (reqPos >= respSize) return 0xff; return bufMulti[reqPos++]; } + // refresh the button state on port 1. // int pad is not needed. unsigned char CALLBACK PAD1__startPoll(int pad) { @@ -765,6 +855,7 @@ unsigned char CALLBACK PAD1__poll(unsigned char value) { } + long CALLBACK PAD1__configure(void) { return 0; } void CALLBACK PAD1__about(void) {} long CALLBACK PAD1__test(void) { return 0; } @@ -985,62 +1076,62 @@ unsigned long CALLBACK SIO1__readBaud32(void) { return 0; } void CALLBACK SIO1__registerCallback(void (CALLBACK *callback)(void)) {}; void CALLBACK SIO1irq(void) { - psxHu32ref(0x1070) |= SWAPu32(0x100); + psxHu32ref(0x1070) |= SWAPu32(0x100); } #define LoadSio1Sym1(dest, name) \ - LoadSym(SIO1_##dest, SIO1##dest, name, TRUE); + LoadSym(SIO1_##dest, SIO1##dest, name, TRUE); #define LoadSio1SymN(dest, name) \ - LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); + LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); #define LoadSio1Sym0(dest, name) \ - LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); \ - if (SIO1_##dest == NULL) SIO1_##dest = (SIO1##dest) SIO1__##dest; + LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); \ + if (SIO1_##dest == NULL) SIO1_##dest = (SIO1##dest) SIO1__##dest; static int LoadSIO1plugin(const char *SIO1dll) { - void *drv; - - hSIO1Driver = SysLoadLibrary(SIO1dll); - if (hSIO1Driver == NULL) { - SysMessage (_("Could not load SIO1 plugin %s!"), SIO1dll); return -1; - } - drv = hSIO1Driver; - - LoadSio1Sym0(init, "SIO1init"); - LoadSio1Sym0(shutdown, "SIO1shutdown"); - LoadSio1Sym0(open, "SIO1open"); - LoadSio1Sym0(close, "SIO1close"); - LoadSio1Sym0(pause, "SIO1pause"); - LoadSio1Sym0(resume, "SIO1resume"); - LoadSio1Sym0(keypressed, "SIO1keypressed"); - LoadSio1Sym0(configure, "SIO1configure"); - LoadSio1Sym0(test, "SIO1test"); - LoadSio1Sym0(about, "SIO1about"); - LoadSio1Sym0(writeData8, "SIO1writeData8"); - LoadSio1Sym0(writeData16, "SIO1writeData16"); - LoadSio1Sym0(writeData32, "SIO1writeData32"); - LoadSio1Sym0(writeStat16, "SIO1writeStat16"); - LoadSio1Sym0(writeStat32, "SIO1writeStat32"); - LoadSio1Sym0(writeMode16, "SIO1writeMode16"); - LoadSio1Sym0(writeMode32, "SIO1writeMode32"); - LoadSio1Sym0(writeCtrl16, "SIO1writeCtrl16"); - LoadSio1Sym0(writeCtrl32, "SIO1writeCtrl32"); - LoadSio1Sym0(writeBaud16, "SIO1writeBaud16"); - LoadSio1Sym0(writeBaud32, "SIO1writeBaud32"); - LoadSio1Sym0(readData16, "SIO1readData16"); - LoadSio1Sym0(readData32, "SIO1readData32"); - LoadSio1Sym0(readStat16, "SIO1readStat16"); - LoadSio1Sym0(readStat32, "SIO1readStat32"); - LoadSio1Sym0(readMode16, "SIO1readMode16"); - LoadSio1Sym0(readMode32, "SIO1readMode32"); - LoadSio1Sym0(readCtrl16, "SIO1readCtrl16"); - LoadSio1Sym0(readCtrl32, "SIO1readCtrl32"); - LoadSio1Sym0(readBaud16, "SIO1readBaud16"); - LoadSio1Sym0(readBaud32, "SIO1readBaud32"); - LoadSio1Sym0(registerCallback, "SIO1registerCallback"); - - return 0; + void *drv; + + hSIO1Driver = SysLoadLibrary(SIO1dll); + if (hSIO1Driver == NULL) { + SysMessage (_("Could not load SIO1 plugin %s!"), SIO1dll); return -1; + } + drv = hSIO1Driver; + + LoadSio1Sym0(init, "SIO1init"); + LoadSio1Sym0(shutdown, "SIO1shutdown"); + LoadSio1Sym0(open, "SIO1open"); + LoadSio1Sym0(close, "SIO1close"); + LoadSio1Sym0(pause, "SIO1pause"); + LoadSio1Sym0(resume, "SIO1resume"); + LoadSio1Sym0(keypressed, "SIO1keypressed"); + LoadSio1Sym0(configure, "SIO1configure"); + LoadSio1Sym0(test, "SIO1test"); + LoadSio1Sym0(about, "SIO1about"); + LoadSio1Sym0(writeData8, "SIO1writeData8"); + LoadSio1Sym0(writeData16, "SIO1writeData16"); + LoadSio1Sym0(writeData32, "SIO1writeData32"); + LoadSio1Sym0(writeStat16, "SIO1writeStat16"); + LoadSio1Sym0(writeStat32, "SIO1writeStat32"); + LoadSio1Sym0(writeMode16, "SIO1writeMode16"); + LoadSio1Sym0(writeMode32, "SIO1writeMode32"); + LoadSio1Sym0(writeCtrl16, "SIO1writeCtrl16"); + LoadSio1Sym0(writeCtrl32, "SIO1writeCtrl32"); + LoadSio1Sym0(writeBaud16, "SIO1writeBaud16"); + LoadSio1Sym0(writeBaud32, "SIO1writeBaud32"); + LoadSio1Sym0(readData16, "SIO1readData16"); + LoadSio1Sym0(readData32, "SIO1readData32"); + LoadSio1Sym0(readStat16, "SIO1readStat16"); + LoadSio1Sym0(readStat32, "SIO1readStat32"); + LoadSio1Sym0(readMode16, "SIO1readMode16"); + LoadSio1Sym0(readMode32, "SIO1readMode32"); + LoadSio1Sym0(readCtrl16, "SIO1readCtrl16"); + LoadSio1Sym0(readCtrl32, "SIO1readCtrl32"); + LoadSio1Sym0(readBaud16, "SIO1readBaud16"); + LoadSio1Sym0(readBaud32, "SIO1readBaud32"); + LoadSio1Sym0(registerCallback, "SIO1registerCallback"); + + return 0; } #endif @@ -1051,7 +1142,7 @@ void CALLBACK clearDynarec(void) { int LoadPlugins() { int ret; - char Plugin[MAXPATHLEN]; + char Plugin[MAXPATHLEN * 2]; ReleasePlugins(); SysLibError(); @@ -1128,11 +1219,11 @@ void ReleasePlugins() { if (Config.UseNet && hNETDriver != NULL) NET_shutdown(); - if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; - if (hGPUDriver != NULL) SysCloseLibrary(hGPUDriver); hGPUDriver = NULL; - if (hSPUDriver != NULL) SysCloseLibrary(hSPUDriver); hSPUDriver = NULL; - if (hPAD1Driver != NULL) SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL; - if (hPAD2Driver != NULL) SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL; + if (hCDRDriver != NULL) { SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; } + if (hGPUDriver != NULL) { SysCloseLibrary(hGPUDriver); hGPUDriver = NULL; } + if (hSPUDriver != NULL) { SysCloseLibrary(hSPUDriver); hSPUDriver = NULL; } + if (hPAD1Driver != NULL) { SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL; } + if (hPAD2Driver != NULL) { SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL; } if (Config.UseNet && hNETDriver != NULL) { SysCloseLibrary(hNETDriver); hNETDriver = NULL; @@ -1151,12 +1242,12 @@ void ReleasePlugins() { int ReloadCdromPlugin() { if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown(); - if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; + if (hCDRDriver != NULL) { SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; } if (UsingIso()) { LoadCDRplugin(NULL); } else { - char Plugin[MAXPATHLEN]; + char Plugin[MAXPATHLEN * 2]; sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr); if (LoadCDRplugin(Plugin) == -1) return -1; } @@ -1169,7 +1260,7 @@ void SetIsoFile(const char *filename) { IsoFile[0] = '\0'; return; } - strncpy(IsoFile, filename, MAXPATHLEN); + strncpy(IsoFile, filename, MAXPATHLEN - 1); } const char *GetIsoFile(void) {