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
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
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
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 offset = 2;\r
+ bufc = 0;\r
+ PadDataS pad;\r
+ for(i = 0; i < 4; i++) {\r
+ offset = 2 + (i * 8);\r
+ pad = padd[i];\r
+ switch (pad.controllerType) {\r
+ case PSE_PAD_TYPE_MOUSE:\r
+ multitappar[offset + 1] = 0x12;\r
+ multitappar[offset + 2] = 0x5a;\r
+ multitappar[offset + 3] = pad.buttonStatus & 0xff;\r
+ multitappar[offset + 4] = pad.buttonStatus >> 8;\r
+ multitappar[offset + 5] = pad.moveX;\r
+ multitappar[offset + 6] = pad.moveY;\r
+\r
+ break;\r
+ case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069)\r
+ multitappar[offset + 1] = 0x23;\r
+ multitappar[offset + 2] = 0x5a;\r
+ multitappar[offset + 3] = pad.buttonStatus & 0xff;\r
+ multitappar[offset + 4] = pad.buttonStatus >> 8;\r
+ multitappar[offset + 5] = pad.rightJoyX;\r
+ multitappar[offset + 6] = pad.rightJoyY;\r
+ multitappar[offset + 7] = pad.leftJoyX;\r
+ multitappar[offset + 8] = pad.leftJoyY;\r
+\r
+ break;\r
+ case PSE_PAD_TYPE_ANALOGPAD: // scph1150\r
+ multitappar[offset + 1] = 0x73;\r
+ multitappar[offset + 2] = 0x5a;\r
+ multitappar[offset + 3] = pad.buttonStatus & 0xff;\r
+ multitappar[offset + 4] = pad.buttonStatus >> 8;\r
+ multitappar[offset + 5] = pad.rightJoyX;\r
+ multitappar[offset + 6] = pad.rightJoyY;\r
+ multitappar[offset + 7] = pad.leftJoyX;\r
+ multitappar[offset + 8] = pad.leftJoyY;\r
+\r
+ break;\r
+ case PSE_PAD_TYPE_ANALOGJOY: // scph1110\r
+ multitappar[offset + 1] = 0x53;\r
+ multitappar[offset + 2] = 0x5a;\r
+ multitappar[offset + 3] = pad.buttonStatus & 0xff;\r
+ multitappar[offset + 4] = pad.buttonStatus >> 8;\r
+ multitappar[offset + 5] = pad.rightJoyX;\r
+ multitappar[offset + 6] = pad.rightJoyY;\r
+ multitappar[offset + 7] = pad.leftJoyX;\r
+ multitappar[offset + 8] = pad.leftJoyY;\r
+\r
+ break;\r
+ case PSE_PAD_TYPE_STANDARD:\r
+ default:\r
+ multitappar[offset + 1] = 0x41;\r
+ multitappar[offset + 2] = 0x5a;\r
+ multitappar[offset + 3] = pad.buttonStatus & 0xff;\r
+ multitappar[offset + 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
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
+// refresh the button state on port 1.\r
+// int pad is not needed.\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
+ {\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
+ {\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 (multitap1 == 0)\r
+ {\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
}\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=0;\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