From a0df6785ef1f2d35ea5a8940f2c6a93e37720f2f Mon Sep 17 00:00:00 2001 From: sfja Date: Sun, 15 Feb 2026 22:13:00 +0100 Subject: [PATCH] seperate key release int --- programs/boot.vc5asm | 11 +++++++---- src/vm.cpp | 13 +++++++++++-- src/vm.hpp | 3 ++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/programs/boot.vc5asm b/programs/boot.vc5asm index 287e7bc..8edeb76 100644 --- a/programs/boot.vc5asm +++ b/programs/boot.vc5asm @@ -35,13 +35,16 @@ _start: ; descriptor table structure: ; [addr + 0] status address ; [addr + 2] keycode address - ; [addr + 4] keyboard interrupt handler + ; [addr + 4] key press interrupt handler + ; [addr + 6] key release interrupt handler mov r0, kbd_status - mov [0x702], r0 + mov [0x702 + 0], r0 mov r0, kbd_code - mov [0x704], r0 + mov [0x702 + 2], r0 mov r0, key_press_int - mov [0x706], r0 + mov [0x702 + 4], r0 + mov r0, 0 + mov [0x702 + 6], r0 lkbd 0x702 ; character counter diff --git a/src/vm.cpp b/src/vm.cpp index 755087d..af89939 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -536,7 +536,8 @@ int VM::run_instruction() m_kbd_descriptor = KbdDescript { .status_addr = word(op1), .keycode_addr = word(op1 + 2), - .int_handler = word(op1 + 4), + .press_int_handler = word(op1 + 4), + .release_int_handler = word(op1 + 6), }; m_kbd_loaded = true; break; @@ -596,7 +597,15 @@ void VM::poll_events() set_word(d.status_addr, flags); set_word(d.keycode_addr, event->as_key_event().key); - interrupt(d.int_handler); + if (event->type() == IoEvent::Type::KeyPress) { + if (d.press_int_handler) { + interrupt(d.press_int_handler); + } + } else { + if (d.release_int_handler) { + interrupt(d.release_int_handler); + } + } } continue; } diff --git a/src/vm.hpp b/src/vm.hpp index 3eaaa91..42d6c19 100644 --- a/src/vm.hpp +++ b/src/vm.hpp @@ -97,7 +97,8 @@ struct VcdDescript { struct KbdDescript { uint16_t status_addr; uint16_t keycode_addr; - uint16_t int_handler; + uint16_t press_int_handler; + uint16_t release_int_handler; }; enum class KbdStatusFlag : uint16_t {