From 29cd11ad06188eecd31c4a26bb376416552499df Mon Sep 17 00:00:00 2001 From: Jake Date: Mon, 5 May 2014 20:49:20 -0500 Subject: [PATCH 1/9] Added in some more error codes to Cellpad functions --- rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp index 5e82b75a60..62b03c1adf 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp @@ -49,6 +49,7 @@ int cellPadInit(u32 max_connect) { sys_io.Log("cellPadInit(max_connect=%d)", max_connect); if(Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_ALREADY_INITIALIZED; + if (max_connect > CELL_PAD_MAX_PORT_NUM) return CELL_PAD_ERROR_INVALID_PARAMETER; Emu.GetPadManager().Init(max_connect); return CELL_OK; } @@ -77,7 +78,10 @@ int cellPadGetData(u32 port_no, u32 data_addr) sys_io.Log("cellPadGetData[port_no: %d, data_addr: 0x%x]", port_no, data_addr); std::vector& pads = Emu.GetPadManager().GetPads(); if(!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; - if(port_no >= pads.size()) return CELL_PAD_ERROR_INVALID_PARAMETER; + const PadInfo& rinfo = Emu.GetPadManager().GetInfo(); + if(port_no >= rinfo.max_connect) return CELL_PAD_ERROR_INVALID_PARAMETER; + //We have a choice here of NO_DEVICE or READ_FAILED...lets try no device for now + if(port_no >= rinfo.now_connect) return CELL_PAD_ERROR_NO_DEVICE; Pad& pad = pads[port_no]; CellPadData data; From 199845a9d1d416e7103d4a4e19fc965b3680f85c Mon Sep 17 00:00:00 2001 From: Jake Date: Mon, 5 May 2014 21:58:49 -0500 Subject: [PATCH 2/9] Fixed 'Assign_changes' usage for cellpad / padhandler --- rpcs3/Emu/Io/PadHandler.h | 5 ++--- rpcs3/Emu/Io/Windows/WindowsPadHandler.h | 4 +++- rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp | 9 +++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index e099e2ef37..4d7a97e171 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -215,7 +215,8 @@ public: if(button.m_keyCode != code) continue; - pad.m_port_status |= CELL_PAD_STATUS_ASSIGN_CHANGES; + //This is for reporting when a controller connects/disconnects, shouldn't be here + //pad.m_port_status |= CELL_PAD_STATUS_ASSIGN_CHANGES; if(button.m_pressed && !pressed) { @@ -232,8 +233,6 @@ public: if (stick.m_keyCodeMax != code && stick.m_keyCodeMin != code) continue; - pad.m_port_status |= CELL_PAD_STATUS_ASSIGN_CHANGES; - if (stick.m_keyCodeMax == code) { stick.m_min_pressed = false; //!!! need fix !!! diff --git a/rpcs3/Emu/Io/Windows/WindowsPadHandler.h b/rpcs3/Emu/Io/Windows/WindowsPadHandler.h index 74f8e2ee4f..e67b659c30 100644 --- a/rpcs3/Emu/Io/Windows/WindowsPadHandler.h +++ b/rpcs3/Emu/Io/Windows/WindowsPadHandler.h @@ -33,8 +33,10 @@ public: void LoadSettings() { + //Fixed assign change, default is both sensor and press off m_pads.emplace_back( - CELL_PAD_STATUS_CONNECTED, CELL_PAD_SETTING_PRESS_ON | CELL_PAD_SETTING_SENSOR_OFF, + CELL_PAD_STATUS_CONNECTED | CELL_PAD_STATUS_ASSIGN_CHANGES, + CELL_PAD_SETTING_PRESS_OFF | CELL_PAD_SETTING_SENSOR_OFF, CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE, CELL_PAD_DEV_TYPE_STANDARD); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp index 62b03c1adf..e7fec43e44 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp @@ -90,8 +90,6 @@ int cellPadGetData(u32 port_no, u32 data_addr) u16 d1 = 0; u16 d2 = 0; - pad.m_port_status &= ~CELL_PAD_STATUS_ASSIGN_CHANGES; - for(Button& button : pad.m_buttons) { switch(button.m_offset) @@ -191,7 +189,8 @@ int cellPadGetInfo(u32 info_addr) info.now_connect = rinfo.now_connect; info.system_info = rinfo.system_info; - const std::vector& pads = Emu.GetPadManager().GetPads(); + //Can't have this as const, we need to reset Assign Changes Flag here + std::vector& pads = Emu.GetPadManager().GetPads(); for(u32 i=0; i& pads = Emu.GetPadManager().GetPads(); + std::vector& pads = Emu.GetPadManager().GetPads(); for(u32 i=0; i Date: Tue, 6 May 2014 22:46:18 -0500 Subject: [PATCH 3/9] Add in cellPadGetCapabilityInfo function --- rpcs3/Emu/Io/PadHandler.h | 1 + rpcs3/Emu/SysCalls/FuncList.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sys_io.cpp | 1 + rpcs3/Emu/SysCalls/SysCalls.h | 1 + rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp | 26 ++++++++++++++++++++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) 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); From 0d4e950769fe8dd4a0dfdbe1df082ce6778c0b62 Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 6 May 2014 22:54:41 -0500 Subject: [PATCH 4/9] Implemented more cellPad functions, fixed some cellpad error returns --- rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp | 70 ++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp index 953348166a..cb2a716e0e 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp @@ -169,7 +169,10 @@ int cellPadGetDataExtra(u32 port_no, u32 device_type_addr, u32 data_addr) { sys_io.Log("cellPadGetDataExtra(port_no=%d, device_type_addr=0x%x, device_type_addr=0x%x)", port_no, device_type_addr, data_addr); if(!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; - if(port_no >= Emu.GetPadManager().GetPads().size()) return CELL_PAD_ERROR_INVALID_PARAMETER; + 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; + return CELL_OK; } @@ -177,7 +180,10 @@ int cellPadSetActDirect(u32 port_no, u32 param_addr) { sys_io.Log("cellPadSetActDirect(port_no=%d, param_addr=0x%x)", port_no, param_addr); if(!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; - if(port_no >= Emu.GetPadManager().GetPads().size()) return CELL_PAD_ERROR_INVALID_PARAMETER; + 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; + return CELL_OK; } @@ -270,9 +276,13 @@ int cellPadSetPortSetting(u32 port_no, u32 port_setting) { sys_io.Log("cellPadSetPortSetting(port_no=%d, port_setting=0x%x)", port_no, port_setting); if(!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; - std::vector& pads = Emu.GetPadManager().GetPads(); - if(port_no >= pads.size()) return CELL_PAD_ERROR_INVALID_PARAMETER; + if ((port_setting < CELL_PAD_SETTING_PRESS_ON) || port_setting >(CELL_PAD_SETTING_PRESS_ON | CELL_PAD_SETTING_SENSOR_ON) && port_setting != 0) + return CELL_PAD_ERROR_INVALID_PARAMETER; + 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; + std::vector& pads = Emu.GetPadManager().GetPads(); pads[port_no].m_port_setting = port_setting; return CELL_OK; @@ -280,24 +290,64 @@ int cellPadSetPortSetting(u32 port_no, u32 port_setting) int cellPadInfoPressMode(u32 port_no) { - sys_io.Error("cellPadInfoPressMode(port_no=%d)", port_no); - return CELL_OK; + sys_io.Log("cellPadInfoPressMode(port_no=%d)", port_no); + 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(); + + return (pads[port_no].m_device_capability & CELL_PAD_CAPABILITY_PRESS_MODE) > 0; } int cellPadInfoSensorMode(u32 port_no) { - sys_io.Error("cellPadInfoSensorMode(port_no=%d)", port_no); - return CELL_OK; + sys_io.Log("cellPadInfoSensorMode(port_no=%d)", port_no); + 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(); + + return (pads[port_no].m_device_capability & CELL_PAD_CAPABILITY_SENSOR_MODE) > 0; } int cellPadSetPressMode(u32 port_no, u32 mode) { - sys_io.Error("cellPadSetPressMode(port_no=%d)", port_no); + sys_io.Log("cellPadSetPressMode(port_no=%d)", port_no); + if (!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; + if (mode != 0 || mode != 1) return CELL_PAD_ERROR_INVALID_PARAMETER; + 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; + + std::vector& pads = Emu.GetPadManager().GetPads(); + + if (mode) + pads[port_no].m_port_setting |= CELL_PAD_SETTING_PRESS_ON; + else + pads[port_no].m_port_setting &= ~CELL_PAD_SETTING_PRESS_ON; + return CELL_OK; } int cellPadSetSensorMode(u32 port_no, u32 mode) { - sys_io.Error("cellPadSetPressMode(port_no=%d)", port_no); + sys_io.Log("cellPadSetPressMode(port_no=%d)", port_no); + if (!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; + if (mode != 0 || mode != 1) return CELL_PAD_ERROR_INVALID_PARAMETER; + 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; + + std::vector& pads = Emu.GetPadManager().GetPads(); + + if (mode) + pads[port_no].m_port_setting |= CELL_PAD_SETTING_SENSOR_ON; + else + pads[port_no].m_port_setting &= ~CELL_PAD_SETTING_SENSOR_ON; + return CELL_OK; } \ No newline at end of file From 387eac4d08aee57cc54cf81d91748a2aa64fcb24 Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 6 May 2014 23:04:47 -0500 Subject: [PATCH 5/9] Added pressure support for keys, redid analog 'key' stick support --- rpcs3/Emu/Io/PadHandler.h | 69 ++++++++++++++++++++------- rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp | 78 ++++++++++++++++++++----------- 2 files changed, 101 insertions(+), 46 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index d20bcc266c..3c9b936cb5 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -93,6 +93,7 @@ struct Button u32 m_offset; u32 m_keyCode; u32 m_outKeyCode; + u16 m_value; bool m_pressed; bool m_flush; @@ -102,6 +103,7 @@ struct Button , m_offset(offset) , m_keyCode(keyCode) , m_outKeyCode(outKeyCode) + , m_value(0) { } }; @@ -111,15 +113,17 @@ struct AnalogStick u32 m_offset; u32 m_keyCodeMin; u32 m_keyCodeMax; - bool m_min_pressed; - bool m_max_pressed; + u16 m_value; + //bool m_min_pressed; + //bool m_max_pressed; AnalogStick(u32 offset, u32 keyCodeMin, u32 keyCodeMax) - : m_min_pressed(false) - , m_max_pressed(false) - , m_offset(offset) + :// m_min_pressed(false) + //, m_max_pressed(false) + m_offset(offset) , m_keyCodeMin(keyCodeMin) , m_keyCodeMax(keyCodeMax) + , m_value(128) { } }; @@ -134,10 +138,15 @@ struct Pad std::vector