diff options
Diffstat (limited to 'keyboard.cpp')
-rw-r--r-- | keyboard.cpp | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/keyboard.cpp b/keyboard.cpp index 18d7acd..29178f9 100644 --- a/keyboard.cpp +++ b/keyboard.cpp @@ -1,33 +1,16 @@ +#include "circularbuffer.hpp" #include "idt.hpp" +#include "keyboard.hpp" #include "portio.hpp" #include "vgaterminal.hpp" #include <array> #include <cstdint> -#define K_CONTROL_L -1 -#define K_SHIFT_L -2 -#define K_ALT_L -3 -#define K_CAPS -4 -#define K_NUM -5 -#define K_SCROLL -6 -#define K_SHIFT_R -7 -#define K_ESCAPE -8 -#define K_F1 -10 -#define K_F2 -11 -#define K_F3 -12 -#define K_F4 -13 -#define K_F5 -14 -#define K_F6 -15 -#define K_F7 -16 -#define K_F8 -17 -#define K_F9 -18 -#define K_F10 -19 -#define K_F11 -20 -#define K_F12 -21 - extern TextOutput& term; +static CircularBuffer<char> keyboardBuffer; + static const std::array<char, 0x59> ScanCodeSet1 {{ 0, K_ESCAPE, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', @@ -52,14 +35,29 @@ static constexpr auto keycode(auto ch) { void keyboard_initialize() { + keyboardBuffer = CircularBuffer<char>(128); + idt_register_callback(33, [](auto& regs) { const auto kc = inb(0x60); if (!isReleased(kc)) { const auto ch = ScanCodeSet1[keycode(kc)]; - if (ch > 0) - term.write(ch); + //if (ch > 0) + // term.write(ch); + + keyboardBuffer.push_back(ch); } }); } +std::optional<char> keyboard_read() +{ + if (keyboardBuffer.empty()) { + return {}; + } else { + const auto ch = keyboardBuffer.front(); + keyboardBuffer.pop_front(); + return ch; + } +} + |