diff options
author | Juan J. Martinez <jjm@usebox.net> | 2023-08-28 15:16:12 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2023-08-28 15:30:25 +0100 |
commit | e35cff6d299a07d9b34f303717083a9299a37e82 (patch) | |
tree | 7204099ad4978dfc67e04bc11df29d0f366af851 /src/keyb.c | |
download | uboxlib-dos-e35cff6d299a07d9b34f303717083a9299a37e82.tar.gz uboxlib-dos-e35cff6d299a07d9b34f303717083a9299a37e82.zip |
Initial import
Diffstat (limited to 'src/keyb.c')
-rw-r--r-- | src/keyb.c | 35 |
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); +} |