second implementation of multitap
authoralexis-puska <a.puska@ile-noire.com>
Wed, 11 May 2016 23:45:26 +0000 (01:45 +0200)
committercbransden <chris.bransden@objectway.com>
Fri, 13 May 2016 17:29:58 +0000 (18:29 +0100)
add game/core option to enabled or disabled multitap.
Test with micro machine V3 and 5 devices, 2 multitap enabled, all
device react good i can’t test the 6 7 8 select player but i can select
8 gamer. The 2 multitap works fine.

i detect a bug, when we change the game pad type to analog, the library
crash, see it next time

frontend/libretro.c
frontend/plugin.c
frontend/plugin_lib.c
frontend/plugin_lib.h
include/psemu_plugin_defs.h
libpcsxcore/plugins.c
libpcsxcore/plugins.h

index 4486b95..361695c 100644 (file)
@@ -58,8 +58,8 @@ int in_type[8];
 int in_analog_left[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }};
 int in_analog_right[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }};
 unsigned short in_keystate[8];
-int multitap1;
-int multitap2;
+int multitap1 = 0;
+int multitap2 = 0;
 int in_enable_vibration = 1;
 
 /* PSX max resolution is 640x512, but with enhancement it's 1024x512 */
index d713452..cf93df8 100644 (file)
@@ -49,10 +49,14 @@ extern void CALLBACK SPUasync(unsigned int, unsigned int);
 extern int  CALLBACK SPUplayCDDAchannel(short *, int);
 
 /* PAD */
-static long PADreadPort1(PadDataS *pad, int pad_index)
-{
+static long PADreadPort1(PadDataS *pad, int pad_index) {
     pad->controllerType = in_type[pad_index];
     pad->buttonStatus = ~in_keystate[pad_index];
+    if(multitap1==1){
+       pad->portMultitap=1;
+    }else{
+       pad->portMultitap=0;
+    }
     if (in_type[pad_index] == PSE_PAD_TYPE_ANALOGPAD || in_type[pad_index] == PSE_PAD_TYPE_NEGCON) {
         pad->leftJoyX = in_analog_left[pad_index][0];
         pad->leftJoyY = in_analog_left[pad_index][1];
@@ -62,15 +66,19 @@ static long PADreadPort1(PadDataS *pad, int pad_index)
     return 0;
 }
 
-static long PADreadPort2(PadDataS *pad)
-{
-    pad->controllerType = in_type[4];
-    pad->buttonStatus = ~in_keystate[4];
-    if (in_type[4] == PSE_PAD_TYPE_ANALOGPAD || in_type[4] == PSE_PAD_TYPE_NEGCON) {
-        pad->leftJoyX = in_analog_left[4][0];
-        pad->leftJoyY = in_analog_left[4][1];
-        pad->rightJoyX = in_analog_right[4][0];
-        pad->rightJoyY = in_analog_right[4][1];
+static long PADreadPort2(PadDataS *pad, int pad_index) {
+       pad->controllerType = in_type[pad_index];
+    pad->buttonStatus = ~in_keystate[pad_index];
+    if(multitap2==1){
+       pad->portMultitap=2;
+    }else{
+       pad->portMultitap=0;
+    }
+    if (in_type[pad_index] == PSE_PAD_TYPE_ANALOGPAD || in_type[pad_index] == PSE_PAD_TYPE_NEGCON) {
+        pad->leftJoyX = in_analog_left[pad_index][0];
+        pad->leftJoyY = in_analog_left[pad_index][1];
+        pad->rightJoyX = in_analog_right[pad_index][0];
+        pad->rightJoyY = in_analog_right[pad_index][1];
     }
     return 0;
 }
index ff3518e..ad2f49b 100644 (file)
@@ -37,6 +37,8 @@
 #define HUD_HEIGHT 10
 
 int in_type[8];
+int multitap1;
+int multitap2;
 int in_analog_left[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }};
 int in_analog_right[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }};
 int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }};
index 50fcf9e..ad27fc2 100644 (file)
@@ -17,8 +17,10 @@ enum {
        DKEY_CROSS,
        DKEY_SQUARE,
 };
-extern int  in_state_gun;
+extern int in_state_gun;
 extern int in_type[8];
+extern int multitap1;
+extern int multitap2;
 extern int in_analog_left[8][2];
 extern int in_analog_right[8][2];
 unsigned short in_keystate[8];
index 9986654..7232d03 100644 (file)
@@ -194,6 +194,11 @@ typedef struct
        // controler type - fill it withe predefined values above
        unsigned char controllerType;
 
+       //0 : No multitap between psx and pad
+       //1 : multitap between psx and pad on port 1
+       //2 : multitap between psx and pad on port 2
+       int portMultitap;
+
        // status of buttons - every controller fills this field
        unsigned short buttonStatus;
 
index 372fdd0..3d0ed3c 100644 (file)
@@ -368,7 +368,10 @@ static int LoadSPUplugin(const char *SPUdll) {
 void *hPAD1Driver = NULL;\r
 void *hPAD2Driver = NULL;\r
 \r
-static unsigned char buf[256];\r
+static int multitap1 = -1;\r
+static int multitap2 = -1;\r
+\r
+static unsigned char buf[512];\r
 unsigned char stdpar[10] = { 0x00, 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\r
 unsigned char mousepar[8] = { 0x00, 0x12, 0x5a, 0xff, 0xff, 0xff, 0xff };\r
 unsigned char analogpar[9] = { 0x00, 0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\r
@@ -380,7 +383,7 @@ unsigned char multitappar[35] = { 0x00, 0x80, 0x5a, 0x41, 0x5a, 0xff, 0xff, 0xff
 static int bufcount, bufc;\r
 \r
 //PadDataS padd1, padd2;\r
-unsigned char _PADstartPollPort1(PadDataS padd[4]) {\r
+unsigned char _PADstartPollMultitap(PadDataS padd[4]) {\r
        int i=0;\r
        int decallage=2;\r
     bufc = 0;\r
@@ -515,16 +518,29 @@ unsigned char _PADpoll(unsigned char value) {
 // rafraichissement de l'état des boutons sur port 1,\r
 // int pad dans le code d'origine ne sert a rien...\r
 unsigned char CALLBACK PAD1__startPoll(int pad) {\r
-       int i=0;\r
-       PadDataS padd[4];\r
-       for(i=0;i<4;i++){\r
-               PAD1_readPort1(&padd[i],i);\r
+       //first call the pad provide if a multitap is connected between the psx and himself\r
+       if(multitap1 == -1){\r
+               PadDataS padd;\r
+               PAD1_readPort1(&padd,0);\r
+               multitap1 = padd.portMultitap;\r
+       }\r
+       // just one pad is on port 1 : NO MULTITAP\r
+       if (multitap1 == 0){\r
+               PadDataS padd;\r
+               PAD1_readPort1(&padd,0);\r
+               return _PADstartPoll(&padd);\r
+       }else{\r
+               //a multitap is plugged : refresh all pad.\r
+               int i=0;\r
+               PadDataS padd[4];\r
+               for(i=0;i<4;i++){\r
+                       PAD1_readPort1(&padd[i],i);\r
+               }\r
+               return _PADstartPollMultitap(padd);\r
        }\r
-       return _PADstartPollPort1(padd);\r
 }\r
 \r
 unsigned char CALLBACK PAD1__poll(unsigned char value) {\r
-\r
 //     if(value !=0){\r
 //             int i;\r
 //             printf("%2x  %c\n", value, value);\r
@@ -533,23 +549,24 @@ unsigned char CALLBACK PAD1__poll(unsigned char value) {
 //             }\r
 //             printf("\n");\r
 //             }\r
-\r
-       if(value==42){\r
-               unsigned char bufmultitap[256];\r
-           memcpy(bufmultitap, multitappar, 3);\r
-           bufcount = 2;\r
-           return bufmultitap[bufc++];\r
-       }else{\r
+       if(multitap1==0){\r
                return _PADpoll(value);\r
+       }else{\r
+               if(value==42){\r
+                       unsigned char bufmultitap[256];\r
+                       memcpy(bufmultitap, multitappar, 3);\r
+                       bufcount = 2;\r
+                       return bufmultitap[bufc++];\r
+               }else{\r
+                       return _PADpoll(value);\r
+               }\r
        }\r
 }\r
 \r
 long CALLBACK PAD1__configure(void) { return 0; }\r
 void CALLBACK PAD1__about(void) {}\r
 long CALLBACK PAD1__test(void) { return 0; }\r
-long CALLBACK PAD1__query(void) {\r
-       printf("PAD1__query");\r
-       return 3; }\r
+long CALLBACK PAD1__query(void) { return 3; }\r
 long CALLBACK PAD1__keypressed() { return 0; }\r
 \r
 #define LoadPad1Sym1(dest, name) \\r
@@ -589,15 +606,56 @@ static int LoadPAD1plugin(const char *PAD1dll) {
 }\r
 \r
 unsigned char CALLBACK PAD2__startPoll(int pad) {\r
-       PadDataS padd;\r
+       int pad_index = 0;\r
+       if(multitap1 == 1){\r
+               pad_index+=4;\r
+       }else{\r
+               pad_index=1;\r
+       }\r
+       //first call the pad provide if a multitap is connected between the psx and himself\r
+       if(multitap2 == -1){\r
+               PadDataS padd;\r
+               PAD2_readPort2(&padd,pad_index);\r
+               multitap2 = padd.portMultitap;\r
+       }\r
 \r
-       PAD2_readPort2(&padd);\r
-    \r
-       return _PADstartPoll(&padd);\r
+       // just one pad is on port 2 : NO MULTITAP\r
+       if (multitap2 == 0){\r
+               PadDataS padd;\r
+               PAD2_readPort2(&padd,pad_index);\r
+               return _PADstartPoll(&padd);\r
+       }else{\r
+               //a multitap is plugged : refresh all pad.\r
+               int i=pad_index;\r
+               PadDataS padd[4];\r
+               for(i=0;i<4;i++){\r
+                       PAD2_readPort2(&padd[i],i+pad_index);\r
+               }\r
+               return _PADstartPollMultitap(padd);\r
+       }\r
 }\r
 \r
 unsigned char CALLBACK PAD2__poll(unsigned char value) {\r
-       return _PADpoll(value);\r
+//     if(value !=0){\r
+//             int i;\r
+//             printf("%2x  %c\n", value, value);\r
+//             for (i = 0; i < 35; i++) {\r
+//               printf("%2x", buf[i]);\r
+//             }\r
+//             printf("\n");\r
+//             }\r
+       if(multitap2==0){\r
+               return _PADpoll(value);\r
+       }else {\r
+               if(value==42){\r
+                       unsigned char bufmultitap[256];\r
+                       memcpy(bufmultitap, multitappar, 3);\r
+                       bufcount = 2;\r
+                       return bufmultitap[bufc++];\r
+               }else{\r
+                       return _PADpoll(value);\r
+               }\r
+       }\r
 }\r
 \r
 long CALLBACK PAD2__configure(void) { return 0; }\r
index 4f0c4fa..626939b 100644 (file)
@@ -235,7 +235,7 @@ typedef long (CALLBACK* PADtest)(void);
 typedef long (CALLBACK* PADclose)(void);\r
 typedef long (CALLBACK* PADquery)(void);\r
 typedef long (CALLBACK* PADreadPort1)(PadDataS*, int pad_index);\r
-typedef long (CALLBACK* PADreadPort2)(PadDataS*);\r
+typedef long (CALLBACK* PADreadPort2)(PadDataS*, int pad_index);\r
 typedef long (CALLBACK* PADkeypressed)(void);\r
 typedef unsigned char (CALLBACK* PADstartPoll)(int);\r
 typedef unsigned char (CALLBACK* PADpoll)(unsigned char);\r