diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 4d7a97e171..d20bcc266c 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -86,6 +86,7 @@ enum ButtonDataOffset static const u32 CELL_MAX_PADS = 127; static const u32 CELL_PAD_MAX_PORT_NUM = 7; static const u32 CELL_PAD_MAX_CODES = 64; +static const u32 CELL_PAD_MAX_CAPABILITY_INFO = 32; struct Button { diff --git a/rpcs3/Emu/SysCalls/FuncList.cpp b/rpcs3/Emu/SysCalls/FuncList.cpp index 9531ee7fad..c43e94330a 100644 --- a/rpcs3/Emu/SysCalls/FuncList.cpp +++ b/rpcs3/Emu/SysCalls/FuncList.cpp @@ -3041,7 +3041,7 @@ s64 SysCalls::DoFunc(const u32 id) case 0xd9a4f812: FUNC_LOG_ERROR("TODO: atoff"); case 0xda5a7eb8: FUNC_LOG_ERROR("TODO: strtoul"); case 0xdaeada07: FUNC_LOG_ERROR("TODO: mallopt"); - case 0xdbf4c59c: FUNC_LOG_ERROR("TODO: cellPadGetCapabilityInfo"); + //case 0xdbf4c59c: FUNC_LOG_ERROR("TODO: cellPadGetCapabilityInfo"); case 0xddbac025: FUNC_LOG_ERROR("TODO: strcasecmp_ascii"); case 0xddc71a75: FUNC_LOG_ERROR("TODO: _SCE_Assert"); case 0xde1bb092: FUNC_LOG_ERROR("TODO: init_by_array_TT800"); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_io.cpp b/rpcs3/Emu/SysCalls/Modules/sys_io.cpp index 5e7fe635c0..f83da94295 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_io.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_io.cpp @@ -20,6 +20,7 @@ void sys_io_init() sys_io.AddFunc(0x78200559, cellPadInfoSensorMode); sys_io.AddFunc(0xf83f8182, cellPadSetPressMode); sys_io.AddFunc(0xbe5be3ba, cellPadSetSensorMode); + sys_io.AddFunc(0xdbf4c59c, cellPadGetCapabilityInfo); sys_io.AddFunc(0x433f6ec0, cellKbInit); sys_io.AddFunc(0xbfce3285, cellKbEnd); diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 56ffd4443d..5793703a28 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -314,6 +314,7 @@ extern int cellPadInfoPressMode(u32 port_no); extern int cellPadInfoSensorMode(u32 port_no); extern int cellPadSetPressMode(u32 port_no, u32 mode); extern int cellPadSetSensorMode(u32 port_no, u32 mode); +extern int cellPadGetCapabilityInfo(u32 port_no, mem32_t info_addr); //cellKb extern int cellKbInit(u32 max_connect); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp index e7fec43e44..953348166a 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp @@ -45,6 +45,11 @@ struct CellPadInfo2 be_t device_type[CELL_PAD_MAX_PORT_NUM]; }; +struct CellCapabilityInfo +{ + be_t info[CELL_PAD_MAX_CAPABILITY_INFO]; +}; + int cellPadInit(u32 max_connect) { sys_io.Log("cellPadInit(max_connect=%d)", max_connect); @@ -240,6 +245,27 @@ int cellPadGetInfo2(u32 info_addr) return CELL_OK; } +int cellPadGetCapabilityInfo(u32 port_no, mem32_t info_addr) +{ + sys_io.Log("cellPadGetCapabilityInfo[port_no: %d, data_addr: 0x%x]", port_no, info_addr.GetAddr()); + if (!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; + const PadInfo& rinfo = Emu.GetPadManager().GetInfo(); + if (port_no >= rinfo.max_connect) return CELL_PAD_ERROR_INVALID_PARAMETER; + if (port_no >= rinfo.now_connect) return CELL_PAD_ERROR_NO_DEVICE; + + const std::vector& pads = Emu.GetPadManager().GetPads(); + + CellCapabilityInfo data; + memset(&data, 0, sizeof(CellCapabilityInfo)); + + //Should return the same as device capability mask, psl1ght has it backwards in pad.h + data.info[0] = pads[port_no].m_device_capability; + + Memory.WriteData(info_addr.GetAddr(), data); + + return CELL_OK; +} + int cellPadSetPortSetting(u32 port_no, u32 port_setting) { sys_io.Log("cellPadSetPortSetting(port_no=%d, port_setting=0x%x)", port_no, port_setting);