Merge pull request #724 from StormedBubbles/guncon_framing
[pcsx_rearmed.git] / libpcsxcore / plugins.c
index 19de72c..13ab297 100644 (file)
@@ -371,8 +371,8 @@ extern int in_type[8];
 void *hPAD1Driver = NULL;
 void *hPAD2Driver = NULL;
 
-static int multitap1 = -1;
-static int multitap2 = -1;
+static int multitap1;
+static int multitap2;
 //Pad information, keystate, mode, config mode, vibration
 static PadDataS pad[8];
 
@@ -630,6 +630,7 @@ void _PADstartPoll(PadDataS *pad) {
        switch (pad->controllerType) {
                case PSE_PAD_TYPE_MOUSE:
                        stdpar[0] = 0x12;
+                       stdpar[1] = 0x5a;
                        stdpar[2] = pad->buttonStatus & 0xff;
                        stdpar[3] = pad->buttonStatus >> 8;
                        stdpar[4] = pad->moveX;
@@ -639,6 +640,7 @@ void _PADstartPoll(PadDataS *pad) {
                        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;
@@ -648,7 +650,7 @@ void _PADstartPoll(PadDataS *pad) {
                        memcpy(buf, stdpar, 8);
                        respSize = 8;
                        break;
-       case PSE_PAD_TYPE_GUNCON: // GUNCON - gun controller SLPH-00034 from Namco
+               case PSE_PAD_TYPE_GUNCON: // GUNCON - gun controller SLPH-00034 from Namco
                        stdpar[0] = 0x63;
                        stdpar[1] = 0x5a;
                        stdpar[2] = pad->buttonStatus & 0xff;
@@ -662,28 +664,17 @@ void _PADstartPoll(PadDataS *pad) {
                        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;
+                       if (absX == 65536 || absY == 65536) {
+                          stdpar[4] = 0x01;
+                          stdpar[5] = 0x00;
+                          stdpar[6] = 0x0A;
+                          stdpar[7] = 0x00;
+                       }
+                       else {
+                          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;
                        }
 
                        memcpy(buf, stdpar, 8);
@@ -691,6 +682,7 @@ void _PADstartPoll(PadDataS *pad) {
                        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;
@@ -702,6 +694,7 @@ void _PADstartPoll(PadDataS *pad) {
                        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;
@@ -712,8 +705,8 @@ void _PADstartPoll(PadDataS *pad) {
                        respSize = 8;
                        break;
                case PSE_PAD_TYPE_STANDARD:
-               default:
                        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.
@@ -723,6 +716,19 @@ void _PADstartPoll(PadDataS *pad) {
                        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;
        }
 }
 
@@ -747,7 +753,8 @@ unsigned char _PADpoll(int port, unsigned char value) {
                req = value;
 
                // Don't enable Analog/Vibration for a standard pad
-               if (in_type[port] == PSE_PAD_TYPE_STANDARD) {
+               if (in_type[port] == PSE_PAD_TYPE_STANDARD ||
+                       in_type[port] == PSE_PAD_TYPE_NEGCON) {
                        ; // Pad keystate already in buffer
                }
                else
@@ -758,7 +765,8 @@ unsigned char _PADpoll(int port, unsigned char value) {
        }
 
        //if no new request the pad return 0xff, for signaling connected
-       if (reqPos >= respSize) return 0xff;
+       if (reqPos >= respSize)
+               return 0xff;
 
        switch(reqPos){
                case 2:
@@ -772,9 +780,12 @@ 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
-                               if (in_type[port] != PSE_PAD_TYPE_STANDARD)
-                                       vibrate(port);
+                               vibrate(port);
                                break;
                        }
                break;
@@ -794,12 +805,6 @@ unsigned char _PADpollMultitap(int port, unsigned char value) {
 unsigned char CALLBACK PAD1__startPoll(int pad) {
        reqPos = 0;
        // first call the pad provide if a multitap is connected between the psx and himself
-       if (multitap1 == -1) {
-               PadDataS padd;
-               padd.requestPadIndex = 0;
-               PAD1_readPort1(&padd);
-               multitap1 = padd.portMultitap;
-       }
        // just one pad is on port 1 : NO MULTITAP
        if (multitap1 == 0) {
                PadDataS padd;
@@ -850,6 +855,7 @@ long CALLBACK PAD1__keypressed() { return 0; }
        if (PAD1_##dest == NULL) PAD1_##dest = (PAD##dest) PAD1__##dest;
 
 static int LoadPAD1plugin(const char *PAD1dll) {
+       PadDataS padd;
        void *drv;
 
        hPAD1Driver = SysLoadLibrary(PAD1dll);
@@ -872,6 +878,10 @@ static int LoadPAD1plugin(const char *PAD1dll) {
        LoadPad1Sym0(poll, "PADpoll");
        LoadPad1SymN(setSensitive, "PADsetSensitive");
 
+       padd.requestPadIndex = 0;
+       PAD1_readPort1(&padd);
+       multitap1 = padd.portMultitap;
+
        return 0;
 }
 
@@ -887,14 +897,6 @@ unsigned char CALLBACK PAD2__startPoll(int pad) {
                pad_index = 0;
        }
 
-       //first call the pad provide if a multitap is connected between the psx and himself
-       if (multitap2 == -1) {
-               PadDataS padd;
-               padd.requestPadIndex = pad_index;
-               PAD2_readPort2(&padd);
-               multitap2 = padd.portMultitap;
-       }
-
        // just one pad is on port 1 : NO MULTITAP
        if (multitap2 == 0) {
                PadDataS padd;
@@ -943,6 +945,7 @@ long CALLBACK PAD2__keypressed() { return 0; }
        LoadSym(PAD2_##dest, PAD##dest, name, FALSE);
 
 static int LoadPAD2plugin(const char *PAD2dll) {
+       PadDataS padd;
        void *drv;
 
        hPAD2Driver = SysLoadLibrary(PAD2dll);
@@ -965,6 +968,10 @@ static int LoadPAD2plugin(const char *PAD2dll) {
        LoadPad2Sym0(poll, "PADpoll");
        LoadPad2SymN(setSensitive, "PADsetSensitive");
 
+       padd.requestPadIndex = 0;
+       PAD2_readPort2(&padd);
+       multitap2 = padd.portMultitap;
+
        return 0;
 }