second implementation of multitap
[pcsx_rearmed.git] / libpcsxcore / plugins.c
index f965e0d..3d0ed3c 100644 (file)
@@ -88,6 +88,7 @@ SPUreadDMAMem         SPU_readDMAMem;
 SPUplayADPCMchannel   SPU_playADPCMchannel;\r
 SPUfreeze             SPU_freeze;\r
 SPUregisterCallback   SPU_registerCallback;\r
+SPUregisterScheduleCb SPU_registerScheduleCb;\r
 SPUasync              SPU_async;\r
 SPUplayCDDAchannel    SPU_playCDDAchannel;\r
 \r
@@ -320,6 +321,7 @@ void *hSPUDriver = NULL;
 long CALLBACK SPU__configure(void) { return 0; }\r
 void CALLBACK SPU__about(void) {}\r
 long CALLBACK SPU__test(void) { return 0; }\r
+void CALLBACK SPU__registerScheduleCb(void (CALLBACK *cb)(unsigned int)) {}\r
 \r
 #define LoadSpuSym1(dest, name) \\r
        LoadSym(SPU_##dest, SPU##dest, name, TRUE);\r
@@ -356,6 +358,7 @@ static int LoadSPUplugin(const char *SPUdll) {
        LoadSpuSym1(playADPCMchannel, "SPUplayADPCMchannel");\r
        LoadSpuSym1(freeze, "SPUfreeze");\r
        LoadSpuSym1(registerCallback, "SPUregisterCallback");\r
+       LoadSpuSym0(registerScheduleCb, "SPUregisterScheduleCb");\r
        LoadSpuSymN(async, "SPUasync");\r
        LoadSpuSymN(playCDDAchannel, "SPUplayCDDAchannel");\r
 \r
@@ -365,16 +368,89 @@ 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
+unsigned char multitappar[35] = { 0x00, 0x80, 0x5a, 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+                                                                                                       0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+                                                                                                       0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+                                                                                                       0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
 \r
 static int bufcount, bufc;\r
 \r
-PadDataS padd1, padd2;\r
+//PadDataS padd1, padd2;\r
+unsigned char _PADstartPollMultitap(PadDataS padd[4]) {\r
+       int i=0;\r
+       int decallage=2;\r
+    bufc = 0;\r
+    PadDataS pad;\r
+    for(i=0;i<4;i++){\r
+       decallage = 2 + (i*8);\r
+       pad = padd[i];\r
+               switch (pad.controllerType) {\r
+                       case PSE_PAD_TYPE_MOUSE:\r
+                               multitappar[decallage+1] = 0x12;\r
+                               multitappar[decallage+2] = 0x5a;\r
+                               multitappar[decallage+3] = pad.buttonStatus & 0xff;\r
+                               multitappar[decallage+4] = pad.buttonStatus >> 8;\r
+                               multitappar[decallage+5] = pad.moveX;\r
+                               multitappar[decallage+6] = pad.moveY;\r
+\r
+                               break;\r
+                       case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069)\r
+                               multitappar[decallage+1] = 0x23;\r
+                               multitappar[decallage+2] = 0x5a;\r
+                               multitappar[decallage+3] = pad.buttonStatus & 0xff;\r
+                               multitappar[decallage+4] = pad.buttonStatus >> 8;\r
+                               multitappar[decallage+5] = pad.rightJoyX;\r
+                               multitappar[decallage+6] = pad.rightJoyY;\r
+                               multitappar[decallage+7] = pad.leftJoyX;\r
+                               multitappar[decallage+8] = pad.leftJoyY;\r
+\r
+                               break;\r
+                       case PSE_PAD_TYPE_ANALOGPAD: // scph1150\r
+                               multitappar[decallage+1] = 0x73;\r
+                               multitappar[decallage+2] = 0x5a;\r
+                               multitappar[decallage+3] = pad.buttonStatus & 0xff;\r
+                               multitappar[decallage+4] = pad.buttonStatus >> 8;\r
+                               multitappar[decallage+5] = pad.rightJoyX;\r
+                               multitappar[decallage+6] = pad.rightJoyY;\r
+                               multitappar[decallage+7] = pad.leftJoyX;\r
+                               multitappar[decallage+8] = pad.leftJoyY;\r
+\r
+                               break;\r
+                       case PSE_PAD_TYPE_ANALOGJOY: // scph1110\r
+                               multitappar[decallage+1] = 0x53;\r
+                               multitappar[decallage+2] = 0x5a;\r
+                               multitappar[decallage+3] = pad.buttonStatus & 0xff;\r
+                               multitappar[decallage+4] = pad.buttonStatus >> 8;\r
+                               multitappar[decallage+5] = pad.rightJoyX;\r
+                               multitappar[decallage+6] = pad.rightJoyY;\r
+                               multitappar[decallage+7] = pad.leftJoyX;\r
+                               multitappar[decallage+8] = pad.leftJoyY;\r
+\r
+                               break;\r
+                       case PSE_PAD_TYPE_STANDARD:\r
+                       default:\r
+                               multitappar[decallage+1] = 0x41;\r
+                               multitappar[decallage+2] = 0x5a;\r
+                               multitappar[decallage+3] = pad.buttonStatus & 0xff;\r
+                               multitappar[decallage+4] = pad.buttonStatus >> 8;\r
+               }\r
+    }\r
+\r
+    memcpy(buf, multitappar, 35);\r
+    bufcount = 34;\r
+\r
+    return buf[bufc++];\r
+}\r
 \r
 unsigned char _PADstartPoll(PadDataS *pad) {\r
+\r
     bufc = 0;\r
 \r
     switch (pad->controllerType) {\r
@@ -427,29 +503,64 @@ unsigned char _PADstartPoll(PadDataS *pad) {
         default:\r
             stdpar[3] = pad->buttonStatus & 0xff;\r
             stdpar[4] = pad->buttonStatus >> 8;\r
-\r
-            memcpy(buf, stdpar, 5);\r
-            bufcount = 4;\r
+               memcpy(buf, stdpar, 5);\r
+               bufcount = 4;\r
     }\r
 \r
     return buf[bufc++];\r
 }\r
 \r
 unsigned char _PADpoll(unsigned char value) {\r
-    if (bufc > bufcount) return 0;\r
+       if (bufc > bufcount) return 0;\r
     return buf[bufc++];\r
 }\r
 \r
+// 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
-    PadDataS padd;\r
-\r
-    PAD1_readPort1(&padd);\r
-\r
-    return _PADstartPoll(&padd);\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
 }\r
 \r
 unsigned char CALLBACK PAD1__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(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
@@ -495,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
@@ -702,6 +854,7 @@ int LoadPlugins() {
        char Plugin[MAXPATHLEN];\r
 \r
        ReleasePlugins();\r
+       SysLibError();\r
 \r
        if (UsingIso()) {\r
                LoadCDRplugin(NULL);\r
@@ -794,6 +947,23 @@ void ReleasePlugins() {
 #endif\r
 }\r
 \r
+// for CD swap\r
+int ReloadCdromPlugin()\r
+{\r
+       if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown();\r
+       if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL;\r
+\r
+       if (UsingIso()) {\r
+               LoadCDRplugin(NULL);\r
+       } else {\r
+               char Plugin[MAXPATHLEN];\r
+               sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr);\r
+               if (LoadCDRplugin(Plugin) == -1) return -1;\r
+       }\r
+\r
+       return CDR_init();\r
+}\r
+\r
 void SetIsoFile(const char *filename) {\r
        if (filename == NULL) {\r
                IsoFile[0] = '\0';\r