aboutsummaryrefslogtreecommitdiffstats
path: root/keyboard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard.cpp')
-rw-r--r--keyboard.cpp44
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;
+ }
+}
+