Includes two patches.
1. Add ALT+NUMPAD function to keyboard handler. 2. INT15 AH=80,81,82,90,91 return success like many BIOSes do.
Signed-off-by: Yeong-uk Jo<greatpsycho at yahoo.com> --- src/kbd.c | 34 +++++++++++++++++++++++----------- src/system.c | 26 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 11 deletions(-)
diff --git a/src/kbd.c b/src/kbd.c index e9ea594..b100008 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -358,18 +358,18 @@ static struct scaninfo { { 0x4400, 0x5d00, 0x6700, 0x7100, none }, /* F10 */ { none, none, none, none, none }, /* Num Lock */ { none, none, none, none, none }, /* Scroll Lock */ - { 0x4700, 0x4737, 0x7700, none, MNUM }, /* 7 Home */ - { 0x4800, 0x4838, none, none, MNUM }, /* 8 UP */ - { 0x4900, 0x4939, 0x8400, none, MNUM }, /* 9 PgUp */ + { 0x4700, 0x4737, 0x7700, 0xf700, MNUM }, /* 7 Home */ + { 0x4800, 0x4838, none, 0xf800, MNUM }, /* 8 UP */ + { 0x4900, 0x4939, 0x8400, 0xf900, MNUM }, /* 9 PgUp */ { 0x4a2d, 0x4a2d, none, none, none }, /* - */ - { 0x4b00, 0x4b34, 0x7300, none, MNUM }, /* 4 Left */ - { 0x4c00, 0x4c35, none, none, MNUM }, /* 5 */ - { 0x4d00, 0x4d36, 0x7400, none, MNUM }, /* 6 Right */ + { 0x4b00, 0x4b34, 0x7300, 0xf400, MNUM }, /* 4 Left */ + { 0x4c00, 0x4c35, none, 0xf500, MNUM }, /* 5 */ + { 0x4d00, 0x4d36, 0x7400, 0xf600, MNUM }, /* 6 Right */ { 0x4e2b, 0x4e2b, none, none, none }, /* + */ - { 0x4f00, 0x4f31, 0x7500, none, MNUM }, /* 1 End */ - { 0x5000, 0x5032, none, none, MNUM }, /* 2 Down */ - { 0x5100, 0x5133, 0x7600, none, MNUM }, /* 3 PgDn */ - { 0x5200, 0x5230, none, none, MNUM }, /* 0 Ins */ + { 0x4f00, 0x4f31, 0x7500, 0xf100, MNUM }, /* 1 End */ + { 0x5000, 0x5032, none, 0xf200, MNUM }, /* 2 Down */ + { 0x5100, 0x5133, 0x7600, 0xf300, MNUM }, /* 3 PgDn */ + { 0x5200, 0x5230, none, 0xf000, MNUM }, /* 0 Ins */ { 0x5300, 0x532e, none, none, MNUM }, /* Del */ { none, none, none, none, none }, { none, none, none, none, none }, @@ -385,6 +385,7 @@ __process_key(u8 scancode) u8 flags0 = GET_BDA(kbd_flag0); u8 flags1 = GET_BDA(kbd_flag1); u8 flags2 = GET_BDA(kbd_flag2); + u8 asciicode;
if (flags2 & KF2_LAST_E1) { // Part of "pause" key (sequence is e1 1d 45 e1 9d c5) @@ -462,6 +463,13 @@ __process_key(u8 scancode) flags2 &= ~KF2_RALT; else flags1 &= ~KF1_LALT; + + /* Process ALT + NUMPAD */ + if((asciicode = GET_BDA(alt_keypad))) + { + enqueue_key(0, asciicode); + SET_BDA(alt_keypad, 0); + } break;
case 0x45: /* Num Lock press */ @@ -506,11 +514,15 @@ __process_key(u8 scancode) , scancode); return; } - u8 asciicode; struct scaninfo *info = &scan_to_scanascii[scancode]; if (flags0 & KF0_ALTACTIVE) { asciicode = GET_GLOBAL(info->alt); scancode = GET_GLOBAL(info->alt) >> 8; + if((scancode & 0xf0) == 0xf0) + { + SET_BDA(alt_keypad, GET_BDA(alt_keypad) * 10 + (scancode & 0x0f)); + scancode = 0; + } } else if (flags0 & KF0_CTRLACTIVE) { asciicode = GET_GLOBAL(info->control); scancode = GET_GLOBAL(info->control) >> 8; diff --git a/src/system.c b/src/system.c index 6658e22..00aba7c 100644 --- a/src/system.c +++ b/src/system.c @@ -80,6 +80,27 @@ handle_1552(struct bregs *regs) set_code_success(regs); }
+// Device open +static void +handle_1580(struct bregs *regs) +{ + set_code_success(regs); +} + +// Device close +static void +handle_1581(struct bregs *regs) +{ + set_code_success(regs); +} + +// Process termination +static void +handle_1582(struct bregs *regs) +{ + set_code_success(regs); +} + static void handle_1587(struct bregs *regs) { @@ -230,12 +251,14 @@ handle_1589(struct bregs *regs) static void handle_1590(struct bregs *regs) { + set_code_success(regs); }
// Interrupt complete. Called by Int 16h when key becomes available static void handle_1591(struct bregs *regs) { + set_code_success(regs); }
// keyboard intercept @@ -349,6 +372,9 @@ handle_15(struct bregs *regs) case 0x52: handle_1552(regs); break; case 0x53: handle_1553(regs); break; case 0x5f: handle_155f(regs); break; + case 0x80: handle_1580(regs); break; + case 0x81: handle_1581(regs); break; + case 0x82: handle_1582(regs); break; case 0x83: handle_1583(regs); break; case 0x86: handle_1586(regs); break; case 0x87: handle_1587(regs); break;