[SeaBIOS] [PATCH 05/10] kbd: Extract out shift flag setting into new function

Kevin O'Connor kevin at koconnor.net
Mon Sep 5 20:36:06 CEST 2016


Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/kbd.c | 105 +++++++++++++++++++++++++-------------------------------------
 1 file changed, 43 insertions(+), 62 deletions(-)

diff --git a/src/kbd.c b/src/kbd.c
index c45e8ea..7ab440e 100644
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -377,21 +377,35 @@ struct scaninfo key_ext_slash VAR16 = {
     0xe02f, 0xe02f, 0x9500, 0xa400
 };
 
-// Handle a ps2 style scancode read from the keyboard.
 static void
-__process_key(u8 scancode)
+kbd_set_flag(int key_release, u16 set_bit0, u8 set_bit1, u16 toggle_bit)
 {
     u16 flags0 = GET_BDA(kbd_flag0);
     u8 flags1 = GET_BDA(kbd_flag1);
+    if (key_release) {
+        flags0 &= ~set_bit0;
+        flags1 &= ~set_bit1;
+    } else {
+        flags0 ^= toggle_bit;
+        flags0 |= set_bit0;
+        flags1 |= set_bit1;
+    }
+    SET_BDA(kbd_flag0, flags0);
+    SET_BDA(kbd_flag1, flags1);
+}
 
+// Handle a ps2 style scancode read from the keyboard.
+static void
+__process_key(u8 scancode)
+{
+    u8 flags1 = GET_BDA(kbd_flag1);
     if (flags1 & KF1_LAST_E1) {
         // Part of "pause" key (sequence is e1 1d 45 e1 9d c5)
         if ((scancode & ~0x80) == 0x1d)
             // Second key of sequence
             return;
         // Third key of sequence - clear flag.
-        flags1 &= ~KF1_LAST_E1;
-        SET_BDA(kbd_flag1, flags1);
+        SET_BDA(kbd_flag1, flags1 & ~KF1_LAST_E1);
 
         if (scancode == 0xc5) {
             // Final key in sequence.
@@ -400,98 +414,69 @@ __process_key(u8 scancode)
         }
         return;
     }
+    if (flags1 & KF1_LAST_E0)
+        // Clear E0 flag in memory for next key event
+        SET_BDA(kbd_flag1, flags1 & ~KF1_LAST_E0);
 
     // XXX - PrtScr should cause int 0x05 (ctrl-prtscr has keycode 0x7200?)
     // XXX - Ctrl+Break should cause int 0x1B
     // XXX - SysReq should cause int 0x15/0x85
 
+    int key_release = scancode & 0x80;
     switch (scancode) {
     case 0x00:
         dprintf(1, "KBD: int09 handler: AL=0\n");
         return;
 
     case 0x3a: /* Caps Lock press */
-        flags0 ^= KF0_CAPSACTIVE;
-        flags0 |= KF0_CAPS;
-        break;
     case 0xba: /* Caps Lock release */
-        flags0 &= ~KF0_CAPS;
-        break;
-
+        kbd_set_flag(key_release, KF0_CAPS, 0, KF0_CAPSACTIVE);
+        return;
     case 0x2a: /* L Shift press */
-        flags0 |= KF0_LSHIFT;
-        break;
     case 0xaa: /* L Shift release */
-        flags0 &= ~KF0_LSHIFT;
-        break;
-
+        kbd_set_flag(key_release, KF0_LSHIFT, 0, 0);
+        return;
     case 0x36: /* R Shift press */
-        flags0 |= KF0_RSHIFT;
-        break;
     case 0xb6: /* R Shift release */
-        flags0 &= ~KF0_RSHIFT;
-        break;
-
+        kbd_set_flag(key_release, KF0_RSHIFT, 0, 0);
+        return;
     case 0x1d: /* Ctrl press */
-        flags0 |= KF0_CTRLACTIVE;
-        if (flags1 & KF1_LAST_E0)
-            flags1 |= KF1_RCTRL;
-        else
-            flags0 |= KF0_LCTRL;
-        break;
     case 0x9d: /* Ctrl release */
-        flags0 &= ~KF0_CTRLACTIVE;
         if (flags1 & KF1_LAST_E0)
-            flags1 &= ~KF1_RCTRL;
+            kbd_set_flag(key_release, KF0_CTRLACTIVE, KF1_RCTRL, 0);
         else
-            flags0 &= ~KF0_LCTRL;
-        break;
-
+            kbd_set_flag(key_release, KF0_CTRLACTIVE | KF0_LCTRL, 0, 0);
+        return;
     case 0x38: /* Alt press */
-        flags0 |= KF0_ALTACTIVE;
-        if (flags1 & KF1_LAST_E0)
-            flags1 |= KF1_RALT;
-        else
-            flags0 |= KF0_LALT;
-        break;
     case 0xb8: /* Alt release */
-        flags0 &= ~KF0_ALTACTIVE;
         if (flags1 & KF1_LAST_E0)
-            flags1 &= ~KF1_RALT;
+            kbd_set_flag(key_release, KF0_ALTACTIVE, KF1_RALT, 0);
         else
-            flags0 &= ~KF0_LALT;
-        break;
-
+            kbd_set_flag(key_release, KF0_ALTACTIVE | KF0_LALT, 0, 0);
+        return;
     case 0x45: /* Num Lock press */
-        flags0 |= KF0_NUM;
-        flags0 ^= KF0_NUMACTIVE;
-        break;
     case 0xc5: /* Num Lock release */
-        flags0 &= ~KF0_NUM;
-        break;
-
+        kbd_set_flag(key_release, KF0_NUM, 0, KF0_NUMACTIVE);
+        return;
     case 0x46: /* Scroll Lock press */
-        flags0 |= KF0_SCROLL;
-        flags0 ^= KF0_SCROLLACTIVE;
-        break;
     case 0xc6: /* Scroll Lock release */
-        flags0 &= ~KF0_SCROLL;
-        break;
+        kbd_set_flag(key_release, KF0_SCROLL, 0, KF0_SCROLLACTIVE);
+        return;
 
     case 0xe0:
         // Extended key
-        flags1 |= KF1_LAST_E0;
-        SET_BDA(kbd_flag1, flags1);
+        SET_BDA(kbd_flag1, flags1 | KF1_LAST_E0);
         return;
     case 0xe1:
         // Start of pause key sequence
-        flags1 |= KF1_LAST_E1;
-        break;
+        SET_BDA(kbd_flag1, flags1 | KF1_LAST_E1);
+        return;
 
     default:
-        if (scancode & 0x80)
+        if (key_release)
             // toss key releases
             break;
+        u16 flags0 = GET_BDA(kbd_flag0);
         if (scancode == 0x53
             && ((flags0 & (KF0_CTRLACTIVE|KF0_ALTACTIVE))
                 == (KF0_CTRLACTIVE|KF0_ALTACTIVE))) {
@@ -535,10 +520,6 @@ __process_key(u8 scancode)
             enqueue_key(keycode);
         break;
     }
-    flags1 &= ~KF1_LAST_E0;
-
-    SET_BDA(kbd_flag0, flags0);
-    SET_BDA(kbd_flag1, flags1);
 }
 
 void
-- 
2.5.5




More information about the SeaBIOS mailing list