2 pcboot - bootable PC demo/game kernel
3 Copyright (C) 2018 John Tsiombikas <nuclear@member.fsf.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY, without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>.
25 /* table with rough translations from set 1 scancodes to ASCII-ish */
26 static int scantbl[] = {
27 0, KB_ESC, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', /* 0 - e */
28 '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* f - 1c */
29 KB_LCTRL, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', /* 1d - 29 */
30 KB_LSHIFT, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', KB_RSHIFT, /* 2a - 36 */
31 KB_NUM_MUL, KB_LALT, ' ', KB_CAPSLK, KB_F1, KB_F2, KB_F3, KB_F4, KB_F5, KB_F6, KB_F7, KB_F8, KB_F9, KB_F10, /* 37 - 44 */
32 KB_NUMLK, KB_SCRLK, KB_NUM_7, KB_NUM_8, KB_NUM_9, KB_NUM_MINUS, KB_NUM_4, KB_NUM_5, KB_NUM_6, KB_NUM_PLUS, /* 45 - 4e */
33 KB_NUM_1, KB_NUM_2, KB_NUM_3, KB_NUM_0, KB_NUM_DOT, KB_SYSRQ, 0, 0, KB_F11, KB_F12, /* 4d - 58 */
34 0, 0, 0, 0, 0, 0, 0, /* 59 - 5f */
35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 - 6f */
36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 70 - 7f */
42 #define ADVANCE(x) ((x) = ((x) + 1) & (BUFSZ - 1))
44 static int buffer[BUFSZ];
45 static int buf_ridx, buf_widx;
47 static unsigned int num_pressed;
48 static unsigned char keystate[256];
52 interrupt(IRQ_TO_INTR(KB_IRQ), kbintr);
55 int kb_isdown(int key)
62 return keystate[KB_LALT] + keystate[KB_RALT];
65 return keystate[KB_LCTRL] + keystate[KB_RCTRL];
73 while((key = kb_getkey()) == -1) {
74 /* put the processor to sleep while waiting for keypresses, but first
75 * make sure interrupts are enabled, or we'll sleep forever
87 if(buf_ridx == buf_widx) {
90 res = buffer[buf_ridx];
95 void kb_putback(int key)
102 /* if the write end hasn't caught up with us, go back one place
103 * and put it there, otherwise just overwrite the oldest key which
104 * is right where we were.
106 if(buf_ridx == buf_widx) {
110 buffer[buf_ridx] = key;
124 if(num_pressed > 0) {
136 /* append to buffer */
137 buffer[buf_widx] = key;
139 /* if the write end overtook the read end, advance the read end
140 * too, to discard the oldest keypress from the buffer
142 if(buf_widx == buf_ridx) {
147 /* and update keystate table */
148 keystate[key] = press;