[SeaBIOS] [PATCH 04/10] kbd: Merge bda->kbd_flag0 and bda->kbd_flag1

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


Merge the two consecutive u8 fields into a single u16 field.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/kbd.c     | 87 +++++++++++++++++++++--------------------------------------
 src/std/bda.h | 26 +++++++++++++++---
 2 files changed, 54 insertions(+), 59 deletions(-)

diff --git a/src/kbd.c b/src/kbd.c
index b889cf7..c45e8ea 100644
--- a/src/kbd.c
+++ b/src/kbd.c
@@ -15,34 +15,12 @@
 #include "string.h" // memset
 #include "util.h" // kbd_init
 
-// Bit definitions for BDA kbd_flag[012]
-#define KF0_RSHIFT       (1<<0)
-#define KF0_LSHIFT       (1<<1)
-#define KF0_CTRLACTIVE   (1<<2)
-#define KF0_ALTACTIVE    (1<<3)
-#define KF0_SCROLLACTIVE (1<<4)
-#define KF0_NUMACTIVE    (1<<5)
-#define KF0_CAPSACTIVE   (1<<6)
-
-#define KF1_LCTRL        (1<<0)
-#define KF1_LALT         (1<<1)
-#define KF1_PAUSEACTIVE  (1<<3)
-#define KF1_SCROLL       (1<<4)
-#define KF1_NUM          (1<<5)
-#define KF1_CAPS         (1<<6)
-
-#define KF2_LAST_E1    (1<<0)
-#define KF2_LAST_E0    (1<<1)
-#define KF2_RCTRL      (1<<2)
-#define KF2_RALT       (1<<3)
-#define KF2_101KBD     (1<<4)
-
 void
 kbd_init(void)
 {
     dprintf(3, "init keyboard\n");
     u16 x = offsetof(struct bios_data_area_s, kbd_buf);
-    SET_BDA(kbd_flag2, KF2_101KBD);
+    SET_BDA(kbd_flag1, KF1_101KBD);
     SET_BDA(kbd_buf_head, x);
     SET_BDA(kbd_buf_tail, x);
     SET_BDA(kbd_buf_start_offset, x);
@@ -214,9 +192,8 @@ static void
 handle_1612(struct bregs *regs)
 {
     yield();
-    regs->al = GET_BDA(kbd_flag0);
-    regs->ah = ((GET_BDA(kbd_flag1) & ~(KF2_RCTRL|KF2_RALT))
-                | (GET_BDA(kbd_flag2) & (KF2_RCTRL|KF2_RALT)));
+    regs->ax = ((GET_BDA(kbd_flag0) & ~((KF1_RCTRL|KF1_RALT) << 8))
+                | ((GET_BDA(kbd_flag1) & (KF1_RCTRL|KF1_RALT)) << 8));
     //BX_DEBUG_INT16("int16: func 12 sending %04x\n",AX);
 }
 
@@ -404,18 +381,17 @@ struct scaninfo key_ext_slash VAR16 = {
 static void
 __process_key(u8 scancode)
 {
-    u8 flags0 = GET_BDA(kbd_flag0);
+    u16 flags0 = GET_BDA(kbd_flag0);
     u8 flags1 = GET_BDA(kbd_flag1);
-    u8 flags2 = GET_BDA(kbd_flag2);
 
-    if (flags2 & KF2_LAST_E1) {
+    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.
-        flags2 &= ~KF2_LAST_E1;
-        SET_BDA(kbd_flag2, flags2);
+        flags1 &= ~KF1_LAST_E1;
+        SET_BDA(kbd_flag1, flags1);
 
         if (scancode == 0xc5) {
             // Final key in sequence.
@@ -436,10 +412,10 @@ __process_key(u8 scancode)
 
     case 0x3a: /* Caps Lock press */
         flags0 ^= KF0_CAPSACTIVE;
-        flags1 |= KF1_CAPS;
+        flags0 |= KF0_CAPS;
         break;
     case 0xba: /* Caps Lock release */
-        flags1 &= ~KF1_CAPS;
+        flags0 &= ~KF0_CAPS;
         break;
 
     case 0x2a: /* L Shift press */
@@ -458,58 +434,58 @@ __process_key(u8 scancode)
 
     case 0x1d: /* Ctrl press */
         flags0 |= KF0_CTRLACTIVE;
-        if (flags2 & KF2_LAST_E0)
-            flags2 |= KF2_RCTRL;
+        if (flags1 & KF1_LAST_E0)
+            flags1 |= KF1_RCTRL;
         else
-            flags1 |= KF1_LCTRL;
+            flags0 |= KF0_LCTRL;
         break;
     case 0x9d: /* Ctrl release */
         flags0 &= ~KF0_CTRLACTIVE;
-        if (flags2 & KF2_LAST_E0)
-            flags2 &= ~KF2_RCTRL;
+        if (flags1 & KF1_LAST_E0)
+            flags1 &= ~KF1_RCTRL;
         else
-            flags1 &= ~KF1_LCTRL;
+            flags0 &= ~KF0_LCTRL;
         break;
 
     case 0x38: /* Alt press */
         flags0 |= KF0_ALTACTIVE;
-        if (flags2 & KF2_LAST_E0)
-            flags2 |= KF2_RALT;
+        if (flags1 & KF1_LAST_E0)
+            flags1 |= KF1_RALT;
         else
-            flags1 |= KF1_LALT;
+            flags0 |= KF0_LALT;
         break;
     case 0xb8: /* Alt release */
         flags0 &= ~KF0_ALTACTIVE;
-        if (flags2 & KF2_LAST_E0)
-            flags2 &= ~KF2_RALT;
+        if (flags1 & KF1_LAST_E0)
+            flags1 &= ~KF1_RALT;
         else
-            flags1 &= ~KF1_LALT;
+            flags0 &= ~KF0_LALT;
         break;
 
     case 0x45: /* Num Lock press */
-        flags1 |= KF1_NUM;
+        flags0 |= KF0_NUM;
         flags0 ^= KF0_NUMACTIVE;
         break;
     case 0xc5: /* Num Lock release */
-        flags1 &= ~KF1_NUM;
+        flags0 &= ~KF0_NUM;
         break;
 
     case 0x46: /* Scroll Lock press */
-        flags1 |= KF1_SCROLL;
+        flags0 |= KF0_SCROLL;
         flags0 ^= KF0_SCROLLACTIVE;
         break;
     case 0xc6: /* Scroll Lock release */
-        flags1 &= ~KF1_SCROLL;
+        flags0 &= ~KF0_SCROLL;
         break;
 
     case 0xe0:
         // Extended key
-        flags2 |= KF2_LAST_E0;
-        SET_BDA(kbd_flag2, flags2);
+        flags1 |= KF1_LAST_E0;
+        SET_BDA(kbd_flag1, flags1);
         return;
     case 0xe1:
         // Start of pause key sequence
-        flags2 |= KF2_LAST_E1;
+        flags1 |= KF1_LAST_E1;
         break;
 
     default:
@@ -530,7 +506,7 @@ __process_key(u8 scancode)
         }
         u16 keycode;
         struct scaninfo *info = &scan_to_keycode[scancode];
-        if (flags2 & KF2_LAST_E0 && (scancode == 0x1c || scancode == 0x35))
+        if (flags1 & KF1_LAST_E0 && (scancode == 0x1c || scancode == 0x35))
             info = (scancode == 0x1c ? &key_ext_enter : &key_ext_slash);
         if (flags0 & KF0_ALTACTIVE) {
             keycode = GET_GLOBAL(info->alt);
@@ -548,7 +524,7 @@ __process_key(u8 scancode)
             else
                 keycode = GET_GLOBAL(info->normal);
         }
-        if (flags2 & KF2_LAST_E0 && scancode >= 0x47 && scancode <= 0x53) {
+        if (flags1 & KF1_LAST_E0 && scancode >= 0x47 && scancode <= 0x53) {
             /* extended keys handling */
             if (flags0 & KF0_ALTACTIVE)
                 keycode = (scancode + 0x50) << 8;
@@ -559,11 +535,10 @@ __process_key(u8 scancode)
             enqueue_key(keycode);
         break;
     }
-    flags2 &= ~KF2_LAST_E0;
+    flags1 &= ~KF1_LAST_E0;
 
     SET_BDA(kbd_flag0, flags0);
     SET_BDA(kbd_flag1, flags1);
-    SET_BDA(kbd_flag2, flags2);
 }
 
 void
diff --git a/src/std/bda.h b/src/std/bda.h
index 4ad6605..90d64a6 100644
--- a/src/std/bda.h
+++ b/src/std/bda.h
@@ -30,8 +30,7 @@ struct bios_data_area_s {
     u16 mem_size_kb;
     u8 pad2;
     u8 ps2_ctrl_flag;
-    u8 kbd_flag0;
-    u8 kbd_flag1;
+    u16 kbd_flag0;
     u8 alt_keypad;
     u16 kbd_buf_head;
     u16 kbd_buf_tail;
@@ -85,7 +84,7 @@ struct bios_data_area_s {
     // 40:90
     u8 floppy_media_state[4];
     u8 floppy_track[2];
-    u8 kbd_flag2;
+    u8 kbd_flag1;
     u8 kbd_led;
     struct segoff_s user_wait_complete_flag;
     u32 user_wait_timeout;
@@ -111,6 +110,27 @@ struct bios_data_area_s {
 #define FMS_DOUBLE_STEPPING         (1<<5)
 #define FMS_DATA_RATE_MASK          (0xc0)
 
+// BDA kbd_flag[01] bitdefs
+#define KF0_RSHIFT       (1<<0)
+#define KF0_LSHIFT       (1<<1)
+#define KF0_CTRLACTIVE   (1<<2)
+#define KF0_ALTACTIVE    (1<<3)
+#define KF0_SCROLLACTIVE (1<<4)
+#define KF0_NUMACTIVE    (1<<5)
+#define KF0_CAPSACTIVE   (1<<6)
+#define KF0_LCTRL        (1<<8)
+#define KF0_LALT         (1<<9)
+#define KF0_PAUSEACTIVE  (1<<11)
+#define KF0_SCROLL       (1<<12)
+#define KF0_NUM          (1<<13)
+#define KF0_CAPS         (1<<14)
+
+#define KF1_LAST_E1    (1<<0)
+#define KF1_LAST_E0    (1<<1)
+#define KF1_RCTRL      (1<<2)
+#define KF1_RALT       (1<<3)
+#define KF1_101KBD     (1<<4)
+
 // Limit of BDA timer_counter field
 #define TICKS_PER_DAY 1573040
 
-- 
2.5.5




More information about the SeaBIOS mailing list