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)