180 lines
3.7 KiB
C++
180 lines
3.7 KiB
C++
|
|
#pragma once
|
|
|
|
#if !defined(BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED)
|
|
#define BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED
|
|
|
|
#include <array>
|
|
#include "drivers/pic.hpp"
|
|
|
|
namespace baos::ps2
|
|
{
|
|
enum class Scancode
|
|
{
|
|
INVALID = 0,
|
|
|
|
F9 = 0x01,
|
|
F5 = 0x03,
|
|
F3 = 0x04,
|
|
F1 = 0x05,
|
|
F2 = 0x06,
|
|
F12 = 0x07,
|
|
F10 = 0x09,
|
|
F8 = 0x0A,
|
|
F6 = 0x0B,
|
|
F4 = 0x0C,
|
|
TAB = 0x0D,
|
|
BACKTICK = 0x0E,
|
|
LEFT_ALT = 0x11,
|
|
LEFT_SHIFT = 0x12,
|
|
LEFT_CONTROL = 0x14,
|
|
Q = 0x15,
|
|
_1 = 0x16,
|
|
Z = 0x1A,
|
|
S = 0x1B,
|
|
A = 0x1C,
|
|
W = 0x1D,
|
|
_2 = 0x1E,
|
|
C = 0x21,
|
|
X = 0x22,
|
|
D = 0x23,
|
|
E = 0x24,
|
|
_4 = 0x25,
|
|
_3 = 0x26,
|
|
SPACE = 0x29,
|
|
V = 0x2A,
|
|
F = 0x2B,
|
|
T = 0x2C,
|
|
R = 0x2D,
|
|
_5 = 0x2E,
|
|
N = 0x31,
|
|
B = 0x32,
|
|
H = 0x33,
|
|
G = 0x34,
|
|
Y = 0x35,
|
|
_6 = 0x36,
|
|
M = 0x3A,
|
|
J = 0x3B,
|
|
U = 0x3C,
|
|
_7 = 0x3D,
|
|
_8 = 0x3E,
|
|
COMMA = 0x41,
|
|
K = 0x42,
|
|
I = 0x43,
|
|
O = 0x44,
|
|
_0 = 0x45,
|
|
_9 = 0x46,
|
|
DOT = 0x49,
|
|
SLASH = 0x4A,
|
|
L = 0x4B,
|
|
SEMICOLON = 0x4C,
|
|
P = 0x4D,
|
|
MINUS = 0x4E,
|
|
APOSTROPHE = 0x52,
|
|
BRACKET_OPEN = 0x54,
|
|
EQUALS = 0x55,
|
|
CAPSLOCK = 0x58,
|
|
RIGHT_SHIFT = 0x59,
|
|
ENTER = 0x5A,
|
|
BRACKET_CLOSE = 0x5B,
|
|
BACKSLASH = 0x5D,
|
|
GRAVE = 0x61,
|
|
BACKSPACE = 0x66,
|
|
KP_1 = 0x69,
|
|
KP_4 = 0x6B,
|
|
KP_7 = 0x6C,
|
|
KP_0 = 0x70,
|
|
KP_DOT = 0x71,
|
|
KP_2 = 0x72,
|
|
KP_5 = 0x73,
|
|
KP_6 = 0x74,
|
|
KP_8 = 0x75,
|
|
ESCAPE = 0x76,
|
|
NUMLOCK = 0x77,
|
|
F11 = 0x78,
|
|
KP_PLUS = 0x79,
|
|
KP_3 = 0x7A,
|
|
KP_MINUS = 0x7B,
|
|
KP_ASTERISK = 0x7C,
|
|
KP_9 = 0x7D,
|
|
SCROLLOCK = 0x7E,
|
|
F7 = 0x83,
|
|
|
|
MM_WWW_SEARCH = 0x0110,
|
|
RIGHT_ALT = 0x0111,
|
|
RIGHT_CONTROL = 0x0114,
|
|
MM_PREV_TRACK = 0x0115,
|
|
LEFT_GUI = 0x011F,
|
|
MM_WWW_FAVORITES = 0x0120,
|
|
MM_VOLUME_DOWN = 0x0121,
|
|
MM_MUTE = 0x0123,
|
|
RIGHT_GUI = 0x0127,
|
|
MM_WWW_STOP = 0x0128,
|
|
MM_CALCULATOR = 0x012B,
|
|
APPS = 0x012F,
|
|
MM_WWW_FORWARD = 0x0130,
|
|
MM_VOLUME_UP = 0x0132,
|
|
MM_PLAY_PAUSE = 0x0134,
|
|
ACPI_POWER = 0x0137,
|
|
MM_WWW_BACK = 0x0138,
|
|
MM_WWW_HOME = 0x013A,
|
|
MM_STOP = 0x013B,
|
|
ACPI_SLEEP = 0x013F,
|
|
MM_MY_COMPUTER = 0x0140,
|
|
MM_EMAIL = 0x0148,
|
|
KP_SLASH = 0x014A,
|
|
MM_NEXT_TRACK = 0x014D,
|
|
MM_MEDIA_SELECT = 0x0150,
|
|
KP_ENTER = 0x015A,
|
|
ACPI_WAKE = 0x015E,
|
|
END = 0x0169,
|
|
ARROW_LEFT = 0x016B,
|
|
HOME = 0x016C,
|
|
INSERT = 0x0170,
|
|
DELETE = 0x0171,
|
|
ARROW_DOWN = 0x0172,
|
|
ARROW_RIGHT = 0x0174,
|
|
ARROW_UP = 0x0175,
|
|
PAGE_DOWN = 0x017A,
|
|
PAGE_UP = 0x017D,
|
|
|
|
PRINT_SCREEN = 0x017E,
|
|
PAUSE = 0x017F
|
|
};
|
|
inline constexpr std::uint16_t MAX_SCANCODE = static_cast<std::uint16_t>(Scancode::PAUSE) + 1;
|
|
|
|
struct Keymap
|
|
{
|
|
std::array<char, MAX_SCANCODE> regularKeys;
|
|
std::array<char, MAX_SCANCODE> shiftedKeys;
|
|
std::array<char, MAX_SCANCODE> altGredKeys;
|
|
|
|
constexpr void set(Scancode scancode, char regular, char shifted = '\0', char altgred = '\0') noexcept
|
|
{
|
|
regularKeys[static_cast<unsigned>(scancode)] = regular;
|
|
shiftedKeys[static_cast<unsigned>(scancode)] = shifted;
|
|
altGredKeys[static_cast<unsigned>(scancode)] = altgred;
|
|
}
|
|
};
|
|
|
|
struct KeyEvent
|
|
{
|
|
Scancode scancode = Scancode::INVALID;
|
|
bool down : 1 = false;
|
|
bool repeat : 1 = false;
|
|
};
|
|
|
|
[[nodiscard]] bool initialize() noexcept;
|
|
|
|
__attribute__((interrupt))
|
|
void isrKeyboard(InterruptFrame* interruptFrame) noexcept;
|
|
|
|
[[nodiscard]] bool isKeyDown(Scancode scancode) noexcept;
|
|
[[nodiscard]] bool readKey(KeyEvent& outEvent) noexcept;
|
|
[[nodiscard]] bool readChar(char& outChar) noexcept;
|
|
[[nodiscard]] const char* keyName(Scancode scancode) noexcept;
|
|
[[nodiscard]] bool keyToChar(Scancode scancode, char& outChar) noexcept;
|
|
}
|
|
|
|
#endif // !defined(BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED)
|