[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