void InputDevice_DualShock::UpdateInput(const void *data) { uint8 *d8 = (uint8 *)data; buttons[0] = d8[0]; buttons[1] = d8[1]; cur_ana_button_state = d8[2] & 0x01; for(int stick = 0; stick < 2; stick++) { for(int axis = 0; axis < 2; axis++) { int32 tmp; tmp = 32768 + MDFN_de32lsb((const uint8 *)data + stick * 16 + axis * 8 + 4) - ((int32)MDFN_de32lsb((const uint8 *)data + stick * 16 + axis * 8 + 8) * 32768 / 32767); tmp >>= 8; axes[stick][axis] = tmp; } } if(da_rumble_compat == false) { uint8 sneaky_weaky = 0; if(rumble_param[0] == 0x01) sneaky_weaky = 0xFF; MDFN_en32lsb(&d8[4 + 32 + 0], (sneaky_weaky << 0) | (rumble_param[1] << 8)); } else { uint8 sneaky_weaky = 0; if(((rumble_param[0] & 0xC0) == 0x40) && ((rumble_param[1] & 0x01) == 0x01)) sneaky_weaky = 0xFF; MDFN_en32lsb(&d8[4 + 32 + 0], sneaky_weaky << 0); } //printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); // // // CheckManualAnaModeChange(); if(am_prev_info != analog_mode || aml_prev_info != analog_mode_locked) { MDFN_DispMessage(_("%s: Analog mode is %s(%s)."), gp_name.c_str(), analog_mode ? _("on") : _("off"), analog_mode_locked ? _("locked") : _("unlocked")); } am_prev_info = analog_mode; aml_prev_info = analog_mode_locked; }
void InputDevice_DualShock::SetDTR(bool new_dtr) { const bool old_dtr = dtr; dtr = new_dtr; // Set it to new state before we call CheckManualAnaModeChange(). if(!old_dtr && dtr) { command_phase = 0; bitpos = 0; transmit_pos = 0; transmit_count = 0; } else if(old_dtr && !dtr) { CheckManualAnaModeChange(); //if(bitpos || transmit_count) // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); } }
void InputDevice_DualShock::UpdateInput(const void *data) { uint8 *d8 = (uint8 *)data; uint8* const rumb_dp = &d8[3 + 16]; buttons[0] = d8[0]; buttons[1] = d8[1]; cur_ana_button_state = d8[2] & 0x01; for(int stick = 0; stick < 2; stick++) { for(int axis = 0; axis < 2; axis++) { const uint8* aba = &d8[3] + stick * 8 + axis * 4; int32 tmp; //revert to 0.9.33, should be fixed on libretro side instead //tmp = 32767 + MDFN_de16lsb(&aba[0]) - MDFN_de16lsb(&aba[2]); //tmp = (tmp * 0x100) / 0xFFFF; tmp = 32768 + MDFN_de32lsb((const uint8 *)data + stick * 16 + axis * 8 + 4) - ((int32)MDFN_de32lsb((const uint8 *)data + stick * 16 + axis * 8 + 8) * 32768 / 32767); tmp >>= 8; axes[stick][axis] = tmp; } } //printf("%3d:%3d, %3d:%3d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); //printf("RUMBLE: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", rumble_magic[0], rumble_magic[1], rumble_magic[2], rumble_magic[3], rumble_magic[4], rumble_magic[5]); //printf("%d, 0x%02x 0x%02x\n", da_rumble_compat, rumble_param[0], rumble_param[1]); if(da_rumble_compat == false) { uint8 sneaky_weaky = 0; if(rumble_param[0] == 0x01) sneaky_weaky = 0xFF; //revert to 0.9.33, should be fixed on libretro side instead //MDFN_en16lsb(rumb_dp, (sneaky_weaky << 0) | (rumble_param[1] << 8)); MDFN_en32lsb(&d8[4 + 32 + 0], (sneaky_weaky << 0) | (rumble_param[1] << 8)); } else { uint8 sneaky_weaky = 0; if(((rumble_param[0] & 0xC0) == 0x40) && ((rumble_param[1] & 0x01) == 0x01)) sneaky_weaky = 0xFF; //revert to 0.9.33, should be fixed on libretro side instead //MDFN_en16lsb(rumb_dp, sneaky_weaky << 0); MDFN_en32lsb(&d8[4 + 32 + 0], sneaky_weaky << 0); } //printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); // // // CheckManualAnaModeChange(); if(am_prev_info != analog_mode || aml_prev_info != analog_mode_locked) { //MDFN_DispMessage(_("%s: Analog mode is %s(%s)."), gp_name.c_str(), analog_mode ? _("on") : _("off"), analog_mode_locked ? _("locked") : _("unlocked")); MDFN_DispMessage(_("%s: Analog toggle is %s, sticks are %s"), gp_name.c_str(), amct_enabled ? _("ENABLED") : _("DISABLED"), analog_mode ? _("ON") : _("OFF")); } aml_prev_info = analog_mode_locked; am_prev_info = analog_mode; }
void InputDevice_DualShock::UpdateInput(const void *data) { uint8 *d8 = (uint8 *)data; uint8* const rumb_dp = &d8[3 + 16]; buttons[0] = d8[0]; buttons[1] = d8[1]; cur_ana_button_state = d8[2] & 0x01; for(int stick = 0; stick < 2; stick++) { for(int axis = 0; axis < 2; axis++) { const uint8* aba = &d8[3] + stick * 8 + axis * 4; int32 tmp; tmp = 32767 + MDFN_de16lsb(&aba[0]) - MDFN_de16lsb(&aba[2]); tmp = (tmp * 0x100) / 0xFFFF; axes[stick][axis] = tmp; } } //printf("%3d:%3d, %3d:%3d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); //printf("RUMBLE: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", rumble_magic[0], rumble_magic[1], rumble_magic[2], rumble_magic[3], rumble_magic[4], rumble_magic[5]); //printf("%d, 0x%02x 0x%02x\n", da_rumble_compat, rumble_param[0], rumble_param[1]); if(da_rumble_compat == false) { uint8 sneaky_weaky = 0; if(rumble_param[0] == 0x01) sneaky_weaky = 0xFF; MDFN_en16lsb(rumb_dp, (sneaky_weaky << 0) | (rumble_param[1] << 8)); } else { uint8 sneaky_weaky = 0; if(((rumble_param[0] & 0xC0) == 0x40) && ((rumble_param[1] & 0x01) == 0x01)) sneaky_weaky = 0xFF; MDFN_en16lsb(rumb_dp, sneaky_weaky << 0); } //printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); // // // CheckManualAnaModeChange(); // // Encode analog mode state last. // d8[2] &= ~0x6; d8[2] |= (analog_mode ? 0x02 : 0x00); d8[2] |= (analog_mode_locked ? 0x04 : 0x00); }