From 9b7f43db04953c6c8f5c5cda7a2d2ca0b159e206 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 23 Dec 2015 23:15:15 -0800 Subject: [PATCH] Add additional button defines. Not yet functional (overlap with virtkeys.) --- Common/KeyMap.cpp | 9 +++++++++ Core/HLE/sceCtrl.cpp | 40 +++++++++++++++++++++++----------------- Core/HLE/sceCtrl.h | 20 +++++++++++++++++++- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/Common/KeyMap.cpp b/Common/KeyMap.cpp index 44a90043a4..2c028e85ef 100644 --- a/Common/KeyMap.cpp +++ b/Common/KeyMap.cpp @@ -664,6 +664,15 @@ const KeyMap_IntStrPair psp_button_names[] = { {VIRTKEY_AXIS_SWAP, "AxisSwap"}, {VIRTKEY_DEVMENU, "DevMenu"}, + + {CTRL_HOME, "Home"}, + {CTRL_HOLD, "Hold"}, + {CTRL_WLAN, "Wlan"}, + {CTRL_REMOTE_HOLD, "Remote hold"}, + {CTRL_VOL_UP, "Vol +"}, + {CTRL_VOL_DOWN, "Vol -"}, + {CTRL_SCREEN, "Screen"}, + {CTRL_NOTE, "Note"}, }; const int AXIS_BIND_NKCODE_START = 4000; diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index 705bf6590a..d5b1484011 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -207,6 +207,8 @@ static int __CtrlReadSingleBuffer(PSPPointer<_ctrl_data> data, bool negative) *data = ctrlBufs[ctrlBufRead]; ctrlBufRead = (ctrlBufRead + 1) % NUM_CTRL_BUFFERS; + // Mask out buttons games aren't allowed to see. + data->buttons &= CTRL_MASK_USER; if (negative) data->buttons = ~data->buttons; @@ -500,24 +502,28 @@ static int sceCtrlPeekBufferNegative(u32 ctrlDataPtr, u32 nBufs) return done; } -static u32 sceCtrlPeekLatch(u32 latchDataPtr) -{ - DEBUG_LOG(SCECTRL, "sceCtrlPeekLatch(%08x)", latchDataPtr); - - if (Memory::IsValidAddress(latchDataPtr)) - Memory::WriteStruct(latchDataPtr, &latch); - - return ctrlLatchBufs; +void __CtrlWriteUserLatch(CtrlLatch *userLatch) { + *userLatch = latch; + userLatch->btnBreak &= CTRL_MASK_USER; + userLatch->btnMake &= CTRL_MASK_USER; + userLatch->btnPress &= CTRL_MASK_USER; + userLatch->btnRelease &= CTRL_MASK_USER; } -static u32 sceCtrlReadLatch(u32 latchDataPtr) -{ - DEBUG_LOG(SCECTRL, "sceCtrlReadLatch(%08x)", latchDataPtr); +static u32 sceCtrlPeekLatch(u32 latchDataPtr) { + auto userLatch = PSPPointer::Create(latchDataPtr); + if (userLatch.IsValid()) { + __CtrlWriteUserLatch(userLatch); + } + return hleLogSuccessI(SCECTRL, ctrlLatchBufs); +} - if (Memory::IsValidAddress(latchDataPtr)) - Memory::WriteStruct(latchDataPtr, &latch); - - return __CtrlResetLatch(); +static u32 sceCtrlReadLatch(u32 latchDataPtr) { + auto userLatch = PSPPointer::Create(latchDataPtr); + if (userLatch.IsValid()) { + __CtrlWriteUserLatch(userLatch); + } + return hleLogSuccessI(SCECTRL, __CtrlResetLatch()); } static const HLEFunction sceCtrl[] = @@ -531,8 +537,8 @@ static const HLEFunction sceCtrl[] = {0X3A622550, &WrapI_UU, "sceCtrlPeekBufferPositive", 'i', "xx"}, {0XC152080A, &WrapI_UU, "sceCtrlPeekBufferNegative", 'i', "xx"}, {0X60B81F86, &WrapI_UU, "sceCtrlReadBufferNegative", 'i', "xx"}, - {0XB1D0E5CD, &WrapU_U, "sceCtrlPeekLatch", 'x', "x" }, - {0X0B588501, &WrapU_U, "sceCtrlReadLatch", 'x', "x" }, + {0XB1D0E5CD, &WrapU_U, "sceCtrlPeekLatch", 'i', "x" }, + {0X0B588501, &WrapU_U, "sceCtrlReadLatch", 'i', "x" }, {0X348D99D4, nullptr, "sceCtrlSetSuspendingExtraSamples", '?', "" }, {0XAF5960F3, nullptr, "sceCtrlGetSuspendingExtraSamples", '?', "" }, {0XA68FD260, nullptr, "sceCtrlClearRapidFire", '?', "" }, diff --git a/Core/HLE/sceCtrl.h b/Core/HLE/sceCtrl.h index d6c1ef7beb..524240ebf6 100644 --- a/Core/HLE/sceCtrl.h +++ b/Core/HLE/sceCtrl.h @@ -40,7 +40,25 @@ const int CTRL_STICK_RIGHT = 1; #define CTRL_LTRIGGER 0x0100 #define CTRL_RTRIGGER 0x0200 -#define CTRL_ALL_BUTTONS 0xF3F9 +// System-ish buttons. Not generally used by games. +#define CTRL_HOME 0x00010000 +#define CTRL_HOLD 0x00020000 +#define CTRL_WLAN 0x00040000 +#define CTRL_REMOTE_HOLD 0x00080000 +#define CTRL_VOL_UP 0x00100000 +#define CTRL_VOL_DOWN 0x00200000 +#define CTRL_SCREEN 0x00400000 +#define CTRL_NOTE 0x00800000 +#define CTRL_DISC 0x01000000 +#define CTRL_MEMSTICK 0x02000000 +#define CTRL_FORWARD 0x10000000 +#define CTRL_BACK 0x20000000 +#define CTRL_PLAYPAUSE 0x40000000 + +#define CTRL_MASK_DPAD (CTRL_UP | CTRL_DOWN | CTRL_LEFT | CTRL_RIGHT) +#define CTRL_MASK_ACTION (CTRL_SQUARE | CTRL_TRIANGLE | CTRL_CIRCLE | CTRL_CROSS) +#define CTRL_MASK_TRIGGER (CTRL_LTRIGGER | CTRL_RTRIGGER) +#define CTRL_MASK_USER (CTRL_MASK_DPAD | CTRL_MASK_ACTION | CTRL_START | CTRL_SELECT | CTRL_MASK_TRIGGER | CTRL_HOME | CTRL_HOLD) void __CtrlInit(); void __CtrlDoState(PointerWrap &p);