diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index d1e6c9edb551..c425b5904fd1 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -100,6 +100,11 @@ void cellPad_NotifyStateChange(usz index, u64 /*state*/, bool locked) const auto& pads = handler->GetPads(); const auto& pad = pads[index]; + if (pad->is_fake_move) + { + return; + } + pad_data_internal& reported_info = info->reported_info[index]; const u32 old_status = reported_info.port_status; @@ -193,7 +198,7 @@ error_code cellPadInit(ppu_thread& ppu, u32 max_connect) for (usz i = 0; i < config.get_max_connect(); ++i) { - if (pads[i]->m_port_status & CELL_PAD_STATUS_CONNECTED) + if (!pads[i]->is_fake_move && (pads[i]->m_port_status & CELL_PAD_STATUS_CONNECTED)) { send_sys_io_connect_event(i, CELL_PAD_STATUS_CONNECTED); } @@ -259,7 +264,7 @@ error_code cellPadClearBuf(u32 port_no) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); clear_pad_buffer(pad); @@ -620,7 +625,7 @@ error_code cellPadGetData(u32 port_no, vm::ptr data) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); pad_get_data(port_no, data.get_ptr()); @@ -700,7 +705,7 @@ error_code cellPadPeriphGetData(u32 port_no, vm::ptr data) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); pad_get_data(port_no, &data->cellpad_data, true); @@ -732,7 +737,7 @@ error_code cellPadGetRawData(u32 port_no, vm::ptr data) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); // ? @@ -796,7 +801,7 @@ error_code cellPadSetActDirect(u32 port_no, vm::ptr param) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); // TODO: find out if this is checked here or later or at all @@ -923,7 +928,7 @@ error_code cellPadGetCapabilityInfo(u32 port_no, vm::ptr const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); // Should return the same as device capability mask, psl1ght has it backwards in pad->h @@ -979,7 +984,7 @@ error_code cellPadInfoPressMode(u32 port_no) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); return not_an_error((pad->m_device_capability & CELL_PAD_CAPABILITY_PRESS_MODE) ? 1 : 0); @@ -1006,7 +1011,7 @@ error_code cellPadInfoSensorMode(u32 port_no) const auto& pads = handler->GetPads(); const auto& pad = pads[port_no]; - if (!config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) + if (pad->is_fake_move || !config.is_reportedly_connected(port_no) || !(pad->m_port_status & CELL_PAD_STATUS_CONNECTED)) return not_an_error(CELL_PAD_ERROR_NO_DEVICE); return not_an_error((pad->m_device_capability & CELL_PAD_CAPABILITY_SENSOR_MODE) ? 1 : 0); diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index 3dc42e769ced..c56e7d33126d 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -748,7 +748,7 @@ void PadHandlerBase::process() pad->m_port_status |= CELL_PAD_STATUS_CONNECTED + CELL_PAD_STATUS_ASSIGN_CHANGES; - if (m_emulation) + if (m_emulation && !pad->is_fake_move) { pad_state_notify_state_change(i, CELL_PAD_STATUS_CONNECTED); } @@ -776,7 +776,7 @@ void PadHandlerBase::process() pad->m_port_status |= CELL_PAD_STATUS_CONNECTED + CELL_PAD_STATUS_ASSIGN_CHANGES; - if (m_emulation) + if (m_emulation && !pad->is_fake_move) { pad_state_notify_state_change(i, CELL_PAD_STATUS_CONNECTED); } diff --git a/rpcs3/Emu/Io/pad_types.h b/rpcs3/Emu/Io/pad_types.h index 13c3fe8f3463..8a709c0876ab 100644 --- a/rpcs3/Emu/Io/pad_types.h +++ b/rpcs3/Emu/Io/pad_types.h @@ -498,6 +498,8 @@ struct Pad bool ldd{false}; CellPadData ldd_data{}; + bool is_fake_move = false; + explicit Pad(pad_handler handler, u32 port_status, u32 device_capability, u32 device_type) : m_pad_handler(handler) , m_port_status(port_status) diff --git a/rpcs3/Input/pad_thread.cpp b/rpcs3/Input/pad_thread.cpp index 2a6127dcd57f..e3c3305e5cd6 100644 --- a/rpcs3/Input/pad_thread.cpp +++ b/rpcs3/Input/pad_thread.cpp @@ -22,6 +22,7 @@ #include "Emu/system_config.h" #include "Emu/RSX/Overlays/HomeMenu/overlay_home_menu.h" #include "Emu/RSX/Overlays/overlay_message.h" +#include "Emu/Cell/Modules/cellGem.h" #include "Utilities/Thread.h" #include "util/atomic.hpp" @@ -169,6 +170,7 @@ void pad_thread::Init() cur_pad_handler->Init(); m_pads[i] = std::make_shared(handler_type, CELL_PAD_STATUS_DISCONNECTED, pad_settings[i].device_capability, pad_settings[i].device_type); + m_pads[i]->is_fake_move = (g_cfg.io.move == move_handler::fake && i >= (CELL_PAD_MAX_PORT_NUM - CELL_GEM_MAX_NUM)); if (pad_settings[i].is_ldd_pad) {