diff --git a/input.cpp b/input.cpp index 5e9ca5c..b198838 100644 --- a/input.cpp +++ b/input.cpp @@ -1033,7 +1033,6 @@ typedef struct } devInput; static devInput input[NUMDEV] = {}; -static int pd_mode[NUMDEV] = {}; #define BTN_NUM (sizeof(devInput::map) / sizeof(devInput::map[0])) @@ -2172,8 +2171,8 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int int found = 0; for (int i = 0; i < NUMDEV; i++) { - // paddles overlay on top of other gamepad - if ((input[dev].quirk != QUIRK_PDSP) || (input[i].quirk == QUIRK_PDSP)) + // paddles/spinners overlay on top of other gamepad + if (!((input[dev].quirk == QUIRK_PDSP) ^ (input[i].quirk == QUIRK_PDSP))) { found = (input[i].num == num); if (found) break; @@ -2188,15 +2187,6 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int } } - if (input[dev].quirk == QUIRK_PDSP) - { - if (ev->code == 0x120) pd_mode[input[dev].num] = 1; - } - else - { - pd_mode[input[dev].num] = 0; - } - if (input[dev].lightgun_req && !user_io_osd_is_visible()) { if (osd_event == 1) @@ -2469,8 +2459,20 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int case EV_ABS: if (!user_io_osd_is_visible()) { - // allow analog either from overlaid paddle or gamepad - if (pd_mode[input[dev].num] ^ (input[dev].quirk == QUIRK_PDSP)) break; + int value = ev->value; + if (ev->value < absinfo->minimum) value = absinfo->minimum; + else if (ev->value > absinfo->maximum) value = absinfo->maximum; + + if (input[dev].quirk == QUIRK_PDSP) + { + if (input[dev].num) + { + value -= absinfo->minimum; + value = (value * 255) / (absinfo->maximum - absinfo->minimum); + user_io_analog_joystick(((input[dev].num - 1) << 4) | 7, value, 0); + } + break; + } int hrange = (absinfo->maximum - absinfo->minimum) / 2; int dead = hrange/63; @@ -2485,10 +2487,6 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int dead = 10; } - int value = ev->value; - if (ev->value < absinfo->minimum) value = absinfo->minimum; - else if (ev->value > absinfo->maximum) value = absinfo->maximum; - // normalize to -range/2...+range/2 value = value - (absinfo->minimum + absinfo->maximum) / 2; diff --git a/user_io.cpp b/user_io.cpp index 9286eb4..1fafb5b 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -942,7 +942,7 @@ int user_io_get_joyswap() void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY) { - uint8_t joy = (joystick>1 || !joyswap) ? joystick : joystick^1; + uint8_t joy = (joystick > 1 || !joyswap) ? joystick : (joystick >= 7) ? (joystick ^ 16) : (joystick ^ 1); if (core_type == CORE_TYPE_8BIT) {