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)
 |