From 278050f8d0dbc417056755b283bcfbe37cbd114c Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 29 Sep 2019 09:58:21 +0200 Subject: [PATCH] add cellPadFilter functions --- rpcs3/Emu/Cell/Modules/cellPad.cpp | 38 ++++++++++++++++++++++++++++++ rpcs3/Emu/Cell/Modules/cellPad.h | 24 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/Cell/Modules/cellPad.cpp b/rpcs3/Emu/Cell/Modules/cellPad.cpp index ca59595bf4..aa37e43852 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPad.cpp @@ -31,6 +31,20 @@ void fmt_class_string::format(std::string& out, u64 arg) }); } +template<> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto error) + { + switch (error) + { + STR_CASE(CELL_PADFILTER_ERROR_INVALID_PARAMETER); + } + + return unknown; + }); +} + error_code cellPadInit(u32 max_connect) { sys_io.warning("cellPadInit(max_connect=%d)", max_connect); @@ -989,6 +1003,27 @@ error_code cellPadLddUnregisterController(s32 handle) return CELL_OK; } +error_code cellPadFilterIIRInit(vm::ptr pSos, s32 cutoff) +{ + sys_io.todo("cellPadFilterIIRInit(pSos=*0x%x, cutoff=%d)", pSos, cutoff); + + if (!pSos) // TODO: does this check for cutoff > 2 ? + { + return CELL_PADFILTER_ERROR_INVALID_PARAMETER; + } + + return CELL_OK; +} + +u32 cellPadFilterIIRFilter(vm::ptr pSos, u32 filterIn) +{ + sys_io.todo("cellPadFilterIIRFilter(pSos=*0x%x, filterIn=%d)", pSos, filterIn); + + // TODO: apply filter + + return std::clamp(filterIn, 0u, 1023u); +} + s32 sys_io_3733EA3C(u32 port_no, vm::ptr device_type, vm::ptr data) { // Used by the ps1 emulator built into the firmware @@ -1021,5 +1056,8 @@ void cellPad_init() REG_FUNC(sys_io, cellPadLddGetPortNo); REG_FUNC(sys_io, cellPadLddUnregisterController); + REG_FUNC(sys_io, cellPadFilterIIRInit); + REG_FUNC(sys_io, cellPadFilterIIRFilter); + REG_FNID(sys_io, 0x3733EA3C, sys_io_3733EA3C); } diff --git a/rpcs3/Emu/Cell/Modules/cellPad.h b/rpcs3/Emu/Cell/Modules/cellPad.h index 685831ad60..7dd0828217 100644 --- a/rpcs3/Emu/Cell/Modules/cellPad.h +++ b/rpcs3/Emu/Cell/Modules/cellPad.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Emu/Io/PadHandler.h" #include "Utilities/BEType.h" @@ -18,6 +18,11 @@ enum CellPadError : u32 CELL_PAD_ERROR_EBUSY = 0x8012110a, }; +enum CellPadFilterError : u32 +{ + CELL_PADFILTER_ERROR_INVALID_PARAMETER = 0x80121401, +}; + // Controller types enum { @@ -38,6 +43,13 @@ enum CELL_PAD_LEN_CHANGE_SENSOR_ON = 24, }; +enum +{ + CELL_PADFILTER_IIR_CUTOFF_2ND_LPF_BT_050 = 0, // 50% Nyquist frequency + CELL_PADFILTER_IIR_CUTOFF_2ND_LPF_BT_020 = 1, // 20% Nyquist frequency + CELL_PADFILTER_IIR_CUTOFF_2ND_LPF_BT_010 = 2, // 10% Nyquist frequency +}; + struct CellPadData { be_t len; @@ -96,6 +108,16 @@ struct CellPadActParam u8 reserved[6]; }; +struct CellPadFilterIIRSos +{ + be_t u[3]; + be_t a1; + be_t a2; + be_t b0; + be_t b1; + be_t b2; +}; + struct pad_info { atomic_t max_connect = 0;