seperate key release int

This commit is contained in:
sfja 2026-02-15 22:13:00 +01:00
parent 6a3e022d90
commit a0df6785ef
3 changed files with 20 additions and 7 deletions

View File

@ -35,13 +35,16 @@ _start:
; descriptor table structure: ; descriptor table structure:
; [addr + 0] status address ; [addr + 0] status address
; [addr + 2] keycode 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 r0, kbd_status
mov [0x702], r0 mov [0x702 + 0], r0
mov r0, kbd_code mov r0, kbd_code
mov [0x704], r0 mov [0x702 + 2], r0
mov r0, key_press_int mov r0, key_press_int
mov [0x706], r0 mov [0x702 + 4], r0
mov r0, 0
mov [0x702 + 6], r0
lkbd 0x702 lkbd 0x702
; character counter ; character counter

View File

@ -536,7 +536,8 @@ int VM::run_instruction()
m_kbd_descriptor = KbdDescript { m_kbd_descriptor = KbdDescript {
.status_addr = word(op1), .status_addr = word(op1),
.keycode_addr = word(op1 + 2), .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; m_kbd_loaded = true;
break; break;
@ -596,7 +597,15 @@ void VM::poll_events()
set_word(d.status_addr, flags); set_word(d.status_addr, flags);
set_word(d.keycode_addr, event->as_key_event().key); 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; continue;
} }

View File

@ -97,7 +97,8 @@ struct VcdDescript {
struct KbdDescript { struct KbdDescript {
uint16_t status_addr; uint16_t status_addr;
uint16_t keycode_addr; uint16_t keycode_addr;
uint16_t int_handler; uint16_t press_int_handler;
uint16_t release_int_handler;
}; };
enum class KbdStatusFlag : uint16_t { enum class KbdStatusFlag : uint16_t {