mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 00:22:57 -05:00
271 lines
9.2 KiB
C++
271 lines
9.2 KiB
C++
#include <array>
|
|
#include <cstdint>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#include "SceTypes.hpp"
|
|
#include "prx/libc/include/General.hpp"
|
|
|
|
namespace {
|
|
constexpr int kErrInvalidAddress = static_cast<int>(0x80BC0031u);
|
|
constexpr int kErrInvalidUserId = static_cast<int>(0x80BC0010u);
|
|
constexpr std::array<std::uint16_t, 256> BaseVirtualKeys = {
|
|
255, 255, 255, 255, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
|
|
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 49, 50,
|
|
51, 52, 53, 54, 55, 56, 57, 48, 13, 27, 8, 9, 32, 187, 219, 221,
|
|
186, 191, 191, 192, 222, 220, 188, 190, 189, 20, 112, 113, 114, 115, 116, 117,
|
|
118, 119, 120, 121, 122, 123, 44, 145, 19, 45, 36, 33, 46, 35, 34, 39,
|
|
37, 40, 38, 144, 111, 106, 109, 107, 13, 97, 98, 99, 100, 101, 102, 103,
|
|
104, 105, 96, 110, 226, 93, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255,
|
|
162, 160, 164, 91, 163, 161, 165, 92, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
};
|
|
|
|
constexpr auto VirtualKeys = [] {
|
|
std::array<std::array<std::uint16_t, 256>, 39> layouts{};
|
|
for (auto& layout : layouts) layout = BaseVirtualKeys;
|
|
layouts[1][28] = 90;
|
|
layouts[1][29] = 89;
|
|
layouts[1][45] = 189;
|
|
layouts[1][46] = 221;
|
|
layouts[1][47] = 186;
|
|
layouts[1][48] = 187;
|
|
layouts[2][28] = 90;
|
|
layouts[2][29] = 89;
|
|
layouts[2][45] = 219;
|
|
layouts[2][46] = 221;
|
|
layouts[2][47] = 186;
|
|
layouts[2][48] = 192;
|
|
layouts[2][49] = 223;
|
|
layouts[2][50] = 223;
|
|
layouts[2][51] = 222;
|
|
layouts[2][52] = 220;
|
|
layouts[2][53] = 191;
|
|
layouts[3][45] = 189;
|
|
layouts[3][46] = 187;
|
|
layouts[3][47] = 219;
|
|
layouts[3][48] = 221;
|
|
layouts[3][49] = 220;
|
|
layouts[3][50] = 220;
|
|
layouts[3][51] = 186;
|
|
layouts[3][53] = 192;
|
|
layouts[3][56] = 191;
|
|
layouts[3][100] = 255;
|
|
layouts[4][45] = 189;
|
|
layouts[4][46] = 187;
|
|
layouts[4][47] = 219;
|
|
layouts[4][48] = 221;
|
|
layouts[4][49] = 222;
|
|
layouts[4][50] = 222;
|
|
layouts[4][51] = 186;
|
|
layouts[4][52] = 192;
|
|
layouts[4][53] = 223;
|
|
layouts[4][56] = 191;
|
|
layouts[5][45] = 219;
|
|
layouts[5][46] = 221;
|
|
layouts[5][47] = 186;
|
|
layouts[5][48] = 187;
|
|
layouts[6][45] = 219;
|
|
layouts[6][46] = 221;
|
|
layouts[6][47] = 186;
|
|
layouts[6][48] = 187;
|
|
layouts[6][100] = 255;
|
|
layouts[8][4] = 81;
|
|
layouts[8][16] = 188;
|
|
layouts[8][20] = 65;
|
|
layouts[8][26] = 90;
|
|
layouts[8][29] = 87;
|
|
layouts[8][45] = 219;
|
|
layouts[8][46] = 187;
|
|
layouts[8][49] = 220;
|
|
layouts[8][50] = 220;
|
|
layouts[8][51] = 77;
|
|
layouts[8][52] = 192;
|
|
layouts[8][53] = 222;
|
|
layouts[8][54] = 190;
|
|
layouts[8][55] = 191;
|
|
layouts[8][56] = 223;
|
|
layouts[9][4] = 81;
|
|
layouts[9][16] = 188;
|
|
layouts[9][20] = 65;
|
|
layouts[9][26] = 90;
|
|
layouts[9][29] = 87;
|
|
layouts[9][45] = 219;
|
|
layouts[9][46] = 189;
|
|
layouts[9][49] = 220;
|
|
layouts[9][50] = 220;
|
|
layouts[9][51] = 77;
|
|
layouts[9][52] = 192;
|
|
layouts[9][53] = 222;
|
|
layouts[9][54] = 190;
|
|
layouts[9][55] = 191;
|
|
layouts[9][56] = 187;
|
|
layouts[10][45] = 189;
|
|
layouts[10][46] = 187;
|
|
layouts[10][47] = 219;
|
|
layouts[10][48] = 221;
|
|
layouts[10][49] = 220;
|
|
layouts[10][50] = 220;
|
|
layouts[10][51] = 186;
|
|
layouts[10][52] = 192;
|
|
layouts[10][53] = 222;
|
|
layouts[10][56] = 191;
|
|
layouts[11] = layouts[2];
|
|
layouts[12] = layouts[5];
|
|
layouts[13][45] = 219;
|
|
layouts[13][46] = 191;
|
|
layouts[13][49] = 220;
|
|
layouts[13][50] = 220;
|
|
layouts[13][51] = 187;
|
|
layouts[13][52] = 192;
|
|
layouts[13][53] = 222;
|
|
layouts[15][46] = 191;
|
|
layouts[15][47] = 219;
|
|
layouts[15][48] = 221;
|
|
layouts[15][49] = 220;
|
|
layouts[15][50] = 220;
|
|
layouts[15][51] = 186;
|
|
layouts[15][53] = 192;
|
|
layouts[16][45] = 189;
|
|
layouts[16][46] = 187;
|
|
layouts[16][47] = 219;
|
|
layouts[16][48] = 221;
|
|
layouts[16][49] = 220;
|
|
layouts[16][50] = 220;
|
|
layouts[16][51] = 186;
|
|
layouts[16][53] = 192;
|
|
layouts[16][56] = 191;
|
|
layouts[17] = layouts[5];
|
|
layouts[18] = layouts[3];
|
|
layouts[20][45] = 223;
|
|
layouts[20][46] = 189;
|
|
layouts[20][47] = 219;
|
|
layouts[20][48] = 221;
|
|
layouts[20][49] = 188;
|
|
layouts[20][50] = 188;
|
|
layouts[20][51] = 186;
|
|
layouts[20][52] = 190;
|
|
layouts[20][53] = 192;
|
|
layouts[20][54] = 191;
|
|
layouts[20][55] = 220;
|
|
layouts[20][56] = 190;
|
|
layouts[21][45] = 189;
|
|
layouts[21][46] = 222;
|
|
layouts[21][47] = 192;
|
|
layouts[21][48] = 219;
|
|
layouts[21][49] = 221;
|
|
layouts[21][50] = 221;
|
|
layouts[21][51] = 187;
|
|
layouts[21][52] = 186;
|
|
layouts[21][53] = 243;
|
|
layouts[21][56] = 191;
|
|
layouts[21][100] = 255;
|
|
layouts[21][135] = 226;
|
|
layouts[21][136] = 242;
|
|
layouts[21][137] = 220;
|
|
layouts[21][138] = 28;
|
|
layouts[21][139] = 247;
|
|
layouts[22] = layouts[21];
|
|
layouts[23][45] = 189;
|
|
layouts[23][46] = 187;
|
|
layouts[23][47] = 219;
|
|
layouts[23][48] = 221;
|
|
layouts[23][49] = 220;
|
|
layouts[23][50] = 220;
|
|
layouts[23][51] = 186;
|
|
layouts[23][53] = 192;
|
|
layouts[23][56] = 191;
|
|
layouts[23][136] = 21;
|
|
layouts[23][138] = 25;
|
|
layouts[24] = layouts[3];
|
|
layouts[25] = layouts[3];
|
|
layouts[26] = layouts[3];
|
|
layouts[27] = layouts[3];
|
|
layouts[28] = layouts[3];
|
|
layouts[29] = layouts[16];
|
|
layouts[30] = layouts[16];
|
|
layouts[31][28] = 90;
|
|
layouts[31][29] = 89;
|
|
layouts[31][46] = 191;
|
|
layouts[31][47] = 219;
|
|
layouts[31][48] = 221;
|
|
layouts[31][49] = 220;
|
|
layouts[31][50] = 220;
|
|
layouts[31][51] = 186;
|
|
layouts[31][53] = 192;
|
|
layouts[32] = layouts[16];
|
|
layouts[33] = layouts[16];
|
|
layouts[34] = layouts[16];
|
|
layouts[35] = layouts[16];
|
|
layouts[36][28] = 90;
|
|
layouts[36][29] = 89;
|
|
layouts[36][39] = 192;
|
|
layouts[36][45] = 191;
|
|
layouts[36][46] = 187;
|
|
layouts[36][47] = 219;
|
|
layouts[36][48] = 221;
|
|
layouts[36][49] = 220;
|
|
layouts[36][50] = 220;
|
|
layouts[36][51] = 186;
|
|
layouts[36][53] = 48;
|
|
layouts[37] = layouts[3];
|
|
layouts[38] = layouts[3];
|
|
return layouts;
|
|
}();
|
|
|
|
constexpr int kErrInvalidKeyboardType = static_cast<int>(0x80BC001Du);
|
|
constexpr std::uint32_t kIgnoredStateBits = 0x4000000u;
|
|
|
|
char16_t UsCharacter(std::uint16_t keycode) {
|
|
static constexpr char16_t kPunctuation[] = u"-=[]\\\0;'`,./";
|
|
static constexpr char16_t kKeypad[] = u"/*-+\0" u"1234567890.";
|
|
if (keycode >= 0x04 && keycode <= 0x1D) return static_cast<char16_t>(u'a' + (keycode - 0x04));
|
|
if (keycode >= 0x1E && keycode <= 0x26) return static_cast<char16_t>(u'1' + (keycode - 0x1E));
|
|
if (keycode == 0x27) return u'0';
|
|
if (keycode == 0x2C) return u' ';
|
|
if (keycode >= 0x2D && keycode <= 0x38) return kPunctuation[keycode - 0x2D];
|
|
if (keycode == 0x64) return u'\\';
|
|
if (keycode >= 0x54 && keycode <= 0x63) return kKeypad[keycode - 0x54];
|
|
return 0;
|
|
}
|
|
} // namespace
|
|
|
|
extern "C" {
|
|
|
|
int APS5_VABI sceConvertKeycodeGetImeKeyboardType(int32_t userId, uint32_t* type) {
|
|
if (type == nullptr) return kErrInvalidAddress;
|
|
if (userId < 0) return kErrInvalidUserId;
|
|
*type = 0;
|
|
return 0;
|
|
}
|
|
int APS5_VABI sceConvertKeycodeGetVirtualKeycode(std::uint16_t keycode, std::uint32_t keyboardType, std::uint16_t* virtualKeycode) {
|
|
if (virtualKeycode == nullptr) return kErrInvalidAddress;
|
|
if (keyboardType == 0 || keyboardType > VirtualKeys.size()) return kErrInvalidKeyboardType;
|
|
if (keyboardType >= 31) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable");
|
|
auto value = keycode < BaseVirtualKeys.size() ? VirtualKeys[keyboardType - 1][keycode] : 255;
|
|
if ((keyboardType == 2 || keyboardType == 3 || keyboardType == 12) && (value == 89 || value == 90)) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable");
|
|
*virtualKeycode = static_cast<std::uint16_t>(value);
|
|
return 0;
|
|
}
|
|
|
|
int APS5_VABI sceConvertKeycodeGetCharacterFromKeyboardData(const KeyboardData* keyData, std::int32_t index, std::uint32_t state, std::uint32_t keyboardType, char16_t* character) {
|
|
NotImplemented_nid_no_patch(__func__);
|
|
return 0;
|
|
}
|
|
|
|
int APS5_VABI sceConvertKeycodeGetCharacter(std::uint16_t keycode, std::uint32_t state, std::uint32_t type, char16_t* character) {
|
|
if (character == nullptr) return kErrInvalidAddress;
|
|
if ((state & ~kIgnoredStateBits) != 0) throw std::runtime_error("sceConvertKeycodeGetCharacter: unsupported state " + std::to_string(state));
|
|
if (type != 0) throw std::runtime_error("sceConvertKeycodeGetCharacter: unsupported keyboard type " + std::to_string(type));
|
|
*character = UsCharacter(keycode);
|
|
return 0;
|
|
}
|
|
|
|
}
|