[SeaBIOS] [PATCH 09/10] kbd: Generate interrupt events for SysReq, PrtScr, and Break
Kevin O'Connor
kevin at koconnor.net
Mon Sep 5 20:36:10 CEST 2016
Generate the appropriate interrupt events for the given keys.
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/kbd.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
src/romlayout.S | 2 ++
2 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/src/kbd.c b/src/kbd.c
index ff962cf..6c9290f 100644
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -394,6 +394,49 @@ kbd_set_flag(int key_release, u16 set_bit0, u8 set_bit1, u16 toggle_bit)
SET_BDA(kbd_flag1, flags1);
}
+static void
+kbd_ctrl_break(int key_release)
+{
+ if (!key_release)
+ return;
+ // Clear keyboard buffer and place 0x0000 in buffer
+ u16 buffer_start = GET_BDA(kbd_buf_start_offset);
+ SET_BDA(kbd_buf_head, buffer_start);
+ SET_BDA(kbd_buf_tail, buffer_start+2);
+ SET_FARVAR(SEG_BDA, *(u16*)(buffer_start+0), 0x0000);
+ // Set break flag
+ SET_BDA(break_flag, 0x80);
+ // Generate int 0x1b
+ struct bregs br;
+ memset(&br, 0, sizeof(br));
+ br.flags = F_IF;
+ call16_int(0x1b, &br);
+}
+
+static void
+kbd_sysreq(int key_release)
+{
+ // SysReq generates int 0x15/0x85
+ struct bregs br;
+ memset(&br, 0, sizeof(br));
+ br.ah = 0x85;
+ br.al = key_release ? 0x01 : 0x00;
+ br.flags = F_IF;
+ call16_int(0x15, &br);
+}
+
+static void
+kbd_prtscr(int key_release)
+{
+ if (key_release)
+ return;
+ // PrtScr generates int 0x05 (ctrl-prtscr has keycode 0x7200?)
+ struct bregs br;
+ memset(&br, 0, sizeof(br));
+ br.flags = F_IF;
+ call16_int(0x05, &br);
+}
+
// Handle a ps2 style scancode read from the keyboard.
static void
__process_key(u8 scancode)
@@ -465,21 +508,23 @@ __process_key(u8 scancode)
return;
case 0x46: /* Scroll Lock press */
case 0xc6: /* Scroll Lock release */
- if (flags1 & KF1_LAST_E0)
- // XXX - Ctrl+Break should cause int 0x1B
+ if (flags1 & KF1_LAST_E0) {
+ kbd_ctrl_break(key_release);
return;
+ }
kbd_set_flag(key_release, KF0_SCROLL, 0, KF0_SCROLLACTIVE);
return;
case 0x37:
case 0xb7:
- if (flags1 & KF1_LAST_E0)
- // XXX - PrtScr should cause int 0x05 (ctrl-prtscr keycode 0x7200?)
+ if (flags1 & KF1_LAST_E0) {
+ kbd_prtscr(key_release);
return;
+ }
break;
case 0x54:
case 0xd4:
- // XXX - SysReq should cause int 0x15/0x85
+ kbd_sysreq(key_release);
return;
case 0x53:
if ((GET_BDA(kbd_flag0) & (KF0_CTRLACTIVE|KF0_ALTACTIVE))
diff --git a/src/romlayout.S b/src/romlayout.S
index 53cc0f5..89b3784 100644
--- a/src/romlayout.S
+++ b/src/romlayout.S
@@ -171,12 +171,14 @@ __farcall16:
.endm
IRQ_TRAMPOLINE 02
+ IRQ_TRAMPOLINE 05
IRQ_TRAMPOLINE 10
IRQ_TRAMPOLINE 13
IRQ_TRAMPOLINE 15
IRQ_TRAMPOLINE 16
IRQ_TRAMPOLINE 18
IRQ_TRAMPOLINE 19
+ IRQ_TRAMPOLINE 1b
IRQ_TRAMPOLINE 1c
IRQ_TRAMPOLINE 4a
--
2.5.5
More information about the SeaBIOS
mailing list