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