seperate key release int
This commit is contained in:
parent
6a3e022d90
commit
a0df6785ef
@ -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
|
||||
|
||||
13
src/vm.cpp
13
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;
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user