You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
#include "circularbuffer.hpp"
|
|
#include "idt.hpp"
|
|
#include "keyboard.hpp"
|
|
#include "portio.hpp"
|
|
#include "vgaterminal.hpp"
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
|
|
extern TextOutput& term;
|
|
|
|
static CircularBuffer<char> keyboardBuffer;
|
|
static Port<0x60> keyboardPort;
|
|
|
|
static const std::array<char, 0x59> ScanCodeSet1 {{
|
|
0, K_ESCAPE,
|
|
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
|
|
'-', '=', '\b', '\t',
|
|
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\n', K_CONTROL_L,
|
|
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', '\'', '`', K_SHIFT_L, '\\',
|
|
'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/',
|
|
K_SHIFT_R, '*', K_ALT_L, ' ', K_CAPS,
|
|
K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10,
|
|
K_NUM, K_SCROLL, '7', '8', '9', '-', '4', '5', '6', '+', '1', '2', '3', '0', '.',
|
|
0, 0, 0, // non-existant
|
|
K_F11, K_F12
|
|
}};
|
|
|
|
static inline bool isReleased(auto ch) {
|
|
return ch & 0x80;
|
|
}
|
|
|
|
static inline auto keycode(auto ch) {
|
|
return ch & 0x7F;
|
|
}
|
|
|
|
void keyboard_initialize()
|
|
{
|
|
keyboardBuffer = CircularBuffer<char>(128);
|
|
|
|
idt_register_callback(33, [](auto&) {
|
|
const std::uint8_t kc = keyboardPort;
|
|
|
|
if (!isReleased(kc)) {
|
|
const auto ch = ScanCodeSet1[keycode(kc)];
|
|
//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;
|
|
}
|
|
}
|
|
|