Simplified keyboard interrupt handler, fixed keyboard key states
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
#include "luaobj.h"
|
#include "luaobj.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
|
|
||||||
#define KEYBOARD_KEY_MAX 256
|
#define KEY_MAX 128
|
||||||
#define BUFFER_SIZE 32
|
#define BUFFER_SIZE 32
|
||||||
#define BUFFER_MASK (BUFFER_SIZE - 1)
|
#define BUFFER_MASK (BUFFER_SIZE - 1)
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ enum { KEY_UP, KEY_DOWN };
|
|||||||
typedef struct { unsigned char type, code, isrepeat; } KeyEvent;
|
typedef struct { unsigned char type, code, isrepeat; } KeyEvent;
|
||||||
|
|
||||||
volatile int keyboard_allowKeyRepeat = 0;
|
volatile int keyboard_allowKeyRepeat = 0;
|
||||||
volatile char keyboard_keyStates[KEYBOARD_KEY_MAX];
|
volatile char keyboard_keyStates[KEY_MAX];
|
||||||
|
|
||||||
volatile struct {
|
volatile struct {
|
||||||
KeyEvent data[32];
|
KeyEvent data[32];
|
||||||
@@ -33,20 +33,15 @@ _go32_dpmi_seginfo old_keyb_handler_seginfo, new_keyb_handler_seginfo;
|
|||||||
|
|
||||||
|
|
||||||
void keyboard_handler() {
|
void keyboard_handler() {
|
||||||
static unsigned char code, extended;
|
static unsigned char code;
|
||||||
code = inportb(0x60);
|
code = inportb(0x60);
|
||||||
|
|
||||||
if (code == 224) {
|
if (code != 224) {
|
||||||
/* Handle extended code */
|
|
||||||
extended = 1 << 7;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
volatile KeyEvent *e;
|
volatile KeyEvent *e;
|
||||||
/* Handle key up / down */
|
/* Handle key up / down */
|
||||||
if (code & (1 << 7)) {
|
if (code & (1 << 7)) {
|
||||||
/* Key up */
|
/* Key up */
|
||||||
code &= ~(1 << 7);
|
code &= ~(1 << 7);
|
||||||
code |= extended;
|
|
||||||
keyboard_keyStates[code] = 0;
|
keyboard_keyStates[code] = 0;
|
||||||
e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK];
|
e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK];
|
||||||
e->code = code;
|
e->code = code;
|
||||||
@@ -57,7 +52,6 @@ void keyboard_handler() {
|
|||||||
} else {
|
} else {
|
||||||
/* Key down */
|
/* Key down */
|
||||||
int isrepeat = keyboard_keyStates[code];
|
int isrepeat = keyboard_keyStates[code];
|
||||||
code |= extended;
|
|
||||||
if (!isrepeat || keyboard_allowKeyRepeat) {
|
if (!isrepeat || keyboard_allowKeyRepeat) {
|
||||||
keyboard_keyStates[code] = 1;
|
keyboard_keyStates[code] = 1;
|
||||||
e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK];
|
e = &keyboard_events.data[keyboard_events.writei & BUFFER_MASK];
|
||||||
@@ -67,7 +61,6 @@ void keyboard_handler() {
|
|||||||
keyboard_events.writei++;
|
keyboard_events.writei++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
extended = 0x0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
outportb(0x20, 0x20);
|
outportb(0x20, 0x20);
|
||||||
@@ -78,7 +71,7 @@ void keyboard_handler_end() {}
|
|||||||
|
|
||||||
|
|
||||||
int keyboard_init(void) {
|
int keyboard_init(void) {
|
||||||
_go32_dpmi_lock_data((char*)&keyboard_keyStates, KEYBOARD_KEY_MAX);
|
_go32_dpmi_lock_data((char*)&keyboard_keyStates, KEY_MAX);
|
||||||
_go32_dpmi_lock_data((char*)&keyboard_events, sizeof(keyboard_events));
|
_go32_dpmi_lock_data((char*)&keyboard_events, sizeof(keyboard_events));
|
||||||
_go32_dpmi_lock_code(keyboard_handler,(unsigned long)keyboard_handler_end -
|
_go32_dpmi_lock_code(keyboard_handler,(unsigned long)keyboard_handler_end -
|
||||||
(unsigned long)keyboard_handler);
|
(unsigned long)keyboard_handler);
|
||||||
@@ -177,8 +170,8 @@ const char *scancodeMap[] = {
|
|||||||
[ 75] = "left",
|
[ 75] = "left",
|
||||||
[ 76] = "5",
|
[ 76] = "5",
|
||||||
[ 77] = "right",
|
[ 77] = "right",
|
||||||
[ 79] = "end",
|
|
||||||
[ 78] = "+",
|
[ 78] = "+",
|
||||||
|
[ 79] = "end",
|
||||||
[ 80] = "down",
|
[ 80] = "down",
|
||||||
[ 81] = "pagedown",
|
[ 81] = "pagedown",
|
||||||
[ 82] = "insert",
|
[ 82] = "insert",
|
||||||
@@ -259,7 +252,6 @@ int l_keyboard_poll(lua_State *L) {
|
|||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
|
||||||
KeyEvent e = keyboard_events.data[keyboard_events.readi & BUFFER_MASK];
|
KeyEvent e = keyboard_events.data[keyboard_events.readi & BUFFER_MASK];
|
||||||
e.code &= 127;
|
|
||||||
|
|
||||||
lua_pushstring(L, e.type == KEY_DOWN ? "down" : "up");
|
lua_pushstring(L, e.type == KEY_DOWN ? "down" : "up");
|
||||||
lua_setfield(L, -2, "type");
|
lua_setfield(L, -2, "type");
|
||||||
|
|||||||
Reference in New Issue
Block a user