aboutsummaryrefslogtreecommitdiff
path: root/src/keyb.c
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-08-28 15:16:12 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-08-28 15:30:25 +0100
commite35cff6d299a07d9b34f303717083a9299a37e82 (patch)
tree7204099ad4978dfc67e04bc11df29d0f366af851 /src/keyb.c
downloaduboxlib-dos-e35cff6d299a07d9b34f303717083a9299a37e82.tar.gz
uboxlib-dos-e35cff6d299a07d9b34f303717083a9299a37e82.zip
Initial import
Diffstat (limited to 'src/keyb.c')
-rw-r--r--src/keyb.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/keyb.c b/src/keyb.c
new file mode 100644
index 0000000..d5228f6
--- /dev/null
+++ b/src/keyb.c
@@ -0,0 +1,35 @@
+#include <stdint.h>
+#include <go32.h>
+#include <dpmi.h>
+#include <pc.h>
+
+volatile uint8_t ubox_keys[0xff] = { 0 };
+
+static _go32_dpmi_seginfo old_handler, new_handler;
+
+static void keyb_handler()
+{
+ uint8_t k = inportb(0x60);
+
+ if (k & 128)
+ ubox_keys[k & 127] = 0;
+ else
+ ubox_keys[k] = 1;
+
+ outportb(0x20, 0x20);
+}
+
+void ubox_keyb_init()
+{
+ _go32_dpmi_get_protected_mode_interrupt_vector(9, &old_handler);
+ new_handler.pm_offset = (unsigned long)keyb_handler;
+ new_handler.pm_selector = _go32_my_cs();
+ _go32_dpmi_allocate_iret_wrapper(&new_handler);
+ _go32_dpmi_set_protected_mode_interrupt_vector(9, &new_handler);
+}
+
+void ubox_keyb_free()
+{
+ if (_go32_dpmi_set_protected_mode_interrupt_vector(9, &old_handler) != -1)
+ _go32_dpmi_free_iret_wrapper(&new_handler);
+}