#pragma once #if !defined(BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED) #define BAD_APPLE_OS_DRIVERS_PS2_HPP_INCLUDED #include #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(Scancode::PAUSE) + 1; struct Keymap { std::array regularKeys; std::array shiftedKeys; std::array altGredKeys; constexpr void set(Scancode scancode, char regular, char shifted = '\0', char altgred = '\0') noexcept { regularKeys[static_cast(scancode)] = regular; shiftedKeys[static_cast(scancode)] = shifted; altGredKeys[static_cast(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)