LoadGpuSym0(getScreenPic, "GPUgetScreenPic");
LoadGpuSym0(showScreenPic, "GPUshowScreenPic");
LoadGpuSym0(clearDynarec, "GPUclearDynarec");
- LoadGpuSym0(vBlank, "GPUvBlank");
+ LoadGpuSym0(vBlank, "GPUvBlank");
LoadGpuSym0(configure, "GPUconfigure");
LoadGpuSym0(test, "GPUtest");
LoadGpuSym0(about, "GPUabout");
return 0;
}
+extern int in_type[8];
+
void *hPAD1Driver = NULL;
void *hPAD2Driver = NULL;
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,
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;
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);
}
}
-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) {
//0x01 analog ON
//0x00 analog OFF
ledStateReq44[padIndex] = value;
+ PadMode[padIndex] = value;
break;
case CMD_QUERY_ACT :
//0x46
}
}
-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];
}
}
+
+
+
//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;
- switch(reqPos) {
+ switch(reqPos){
case 2:
reqIndex2Treatment(port, value);
break;
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_STANDARD &&
+ in_type[port] == PSE_PAD_TYPE_NEGCON)
+ break;
+
//vibration
vibrate(port);
break;
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) {
}
+
long CALLBACK PAD1__configure(void) { return 0; }
void CALLBACK PAD1__about(void) {}
long CALLBACK PAD1__test(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
int LoadPlugins() {
int ret;
- char Plugin[MAXPATHLEN];
+ char Plugin[MAXPATHLEN * 2];
ReleasePlugins();
SysLibError();
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;
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;
}
IsoFile[0] = '\0';
return;
}
- strncpy(IsoFile, filename, MAXPATHLEN);
+ strncpy(IsoFile, filename, MAXPATHLEN - 1);
}
const char *GetIsoFile(void) {