- 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_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[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;
+
+ int absX = pad->absoluteX; // 0-1023
+ int absY = pad->absoluteY;
+
+ if (absX == 65536 || absY == 65536) {
+ stdpar[4] = 0x01;
+ stdpar[5] = 0x00;
+ stdpar[6] = 0x0A;
+ stdpar[7] = 0x00;
+ }
+ else {
+ int y_ofs = 0, yres = 240;
+ GPU_getScreenInfo(&y_ofs, &yres);
+ int y_top = (Config.PsxType ? 0x30 : 0x19) + y_ofs;
+ int w = Config.PsxType ? 385 : 378;
+ int x = 0x40 + (w * absX >> 10);
+ int y = y_top + (yres * absY >> 10);
+ //printf("%3d %3d %4x %4x\n", absX, absY, x, y);
+
+ stdpar[4] = x;
+ stdpar[5] = x >> 8;
+ stdpar[6] = y;
+ stdpar[7] = y >> 8;
+ }
+
+ memcpy(buf, stdpar, 8);
+ respSize = 8;
+ break;
+ case PSE_PAD_TYPE_GUN: // GUN CONTROLLER - gun controller SLPH-00014 from Konami
+ stdpar[0] = 0x31;
+ stdpar[1] = 0x5a;
+ stdpar[2] = pad->buttonStatus & 0xff;
+ stdpar[3] = pad->buttonStatus >> 8;
+ memcpy(buf, stdpar, 4);
+ respSize = 4;
+ break;
+ case PSE_PAD_TYPE_ANALOGPAD: // scph1150
+ if (pad->ds.padMode == 0)
+ goto standard;
+ 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;
+ adjust_analog(stdpar);
+ 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;
+ adjust_analog(stdpar);
+ memcpy(buf, stdpar, 8);
+ respSize = 8;
+ break;
+ case PSE_PAD_TYPE_STANDARD:
+ standard:
+ stdpar[0] = 0x41;
+ stdpar[1] = 0x5a;
+ stdpar[2] = pad->buttonStatus & 0xff;
+ stdpar[3] = pad->buttonStatus >> 8;
+ memcpy(buf, stdpar, 4);
+ respSize = 4;
+ break;
+ default:
+ respSize = 0;
+ break;
+ }