Ok, it seems that my patch was ok after all..... so here it is again....
can somebody who has a working installation try it somehow?
|^^^ | | |^^| |^^^ Drew Northup, N1XIM |^^| | |^^^ \ / /^^\ /^^~
|__ | | | | | |__| | |___ \/ |__| |__
| | | | | | www.plex86.org | | | /\ | | | \
___| |__| |__| |___ web.syr.edu/~suoc/ | |___ |___ / \ __/ __/
Index: user/plugins/bochs/iodev/keyboard.cc
===================================================================
RCS file: /cvsroot-plex86/plex86/user/plugins/bochs/iodev/keyboard.cc,v
retrieving revision 1.7
diff -u -r1.7 keyboard.cc
--- user/plugins/bochs/iodev/keyboard.cc 2001/06/09 07:26:43 1.7
+++ user/plugins/bochs/iodev/keyboard.cc 2001/10/19 06:00:05
@@ -551,8 +551,11 @@
void
bx_keyb_c::gen_scancode(Bit32u key)
{
- Bit8u scancode;
-
+ //I added more scancodes in the section below
+ //Drew Northup, N1XIM 2001.10.18 (yyyy.mm.dd)
+ Bit8u scancode[6]; //array to buffer multi-byte scancode data
+ Bit8u extd = 0; //buffer size counter
+
if (bx_dbg.record_io) {
fprintf((FILE*)bx_dbg.record_io, "gen_scancode %lld %x\n",
bx_pc_system.time_ticks(), key);
}
@@ -574,139 +577,132 @@
// should deal with conversions from KSCAN to system scan codes here
switch (key & 0xff) {
- case BX_KEY_CTRL_L: scancode = 0x1d; break;
- case BX_KEY_CTRL_R: scancode = 0x1d; break;
- case BX_KEY_SHIFT_L: scancode = 0x2a; break;
- case BX_KEY_SHIFT_R: scancode = 0x36; break;
- case BX_KEY_ESC: scancode = 0x01; break;
-
- case BX_KEY_ALT_L: scancode = 0x38; break;
-
- case BX_KEY_A: scancode = 0x1e; break;
- case BX_KEY_B: scancode = 0x30; break;
- case BX_KEY_C: scancode = 0x2e; break;
- case BX_KEY_D: scancode = 0x20; break;
- case BX_KEY_E: scancode = 0x12; break;
- case BX_KEY_F: scancode = 0x21; break;
- case BX_KEY_G: scancode = 0x22; break;
- case BX_KEY_H: scancode = 0x23; break;
- case BX_KEY_I: scancode = 0x17; break;
- case BX_KEY_J: scancode = 0x24; break;
- case BX_KEY_K: scancode = 0x25; break;
- case BX_KEY_L: scancode = 0x26; break;
- case BX_KEY_M: scancode = 0x32; break;
- case BX_KEY_N: scancode = 0x31; break;
- case BX_KEY_O: scancode = 0x18; break;
- case BX_KEY_P: scancode = 0x19; break;
- case BX_KEY_Q: scancode = 0x10; break;
- case BX_KEY_R: scancode = 0x13; break;
- case BX_KEY_S: scancode = 0x1f; break;
- case BX_KEY_T: scancode = 0x14; break;
- case BX_KEY_U: scancode = 0x16; break;
- case BX_KEY_V: scancode = 0x2f; break;
- case BX_KEY_W: scancode = 0x11; break;
- case BX_KEY_X: scancode = 0x2d; break;
- case BX_KEY_Y: scancode = 0x15; break;
- case BX_KEY_Z: scancode = 0x2c; break;
-
- case BX_KEY_0: scancode = 0x0b; break;
- case BX_KEY_1: scancode = 0x02; break;
- case BX_KEY_2: scancode = 0x03; break;
- case BX_KEY_3: scancode = 0x04; break;
- case BX_KEY_4: scancode = 0x05; break;
- case BX_KEY_5: scancode = 0x06; break;
- case BX_KEY_6: scancode = 0x07; break;
- case BX_KEY_7: scancode = 0x08; break;
- case BX_KEY_8: scancode = 0x09; break;
- case BX_KEY_9: scancode = 0x0a; break;
-
- case BX_KEY_SPACE: scancode = 0x39; break;
- case BX_KEY_SINGLE_QUOTE: scancode = 0x28; break;
- case BX_KEY_COMMA: scancode = 0x33; break;
- case BX_KEY_PERIOD: scancode = 0x34; break;
- case BX_KEY_SLASH: scancode = 0x35; break;
-
- case BX_KEY_SEMICOLON: scancode = 0x27; break;
- case BX_KEY_EQUALS: scancode = 0x0d; break;
-
- case BX_KEY_LEFT_BRACKET: scancode = 0x1a; break;
- case BX_KEY_BACKSLASH: scancode = 0x2b; break;
- case BX_KEY_RIGHT_BRACKET: scancode = 0x1b; break;
- case BX_KEY_MINUS: scancode = 0x0c; break;
- case BX_KEY_GRAVE: scancode = 0x29; break;
-
- case BX_KEY_BACKSPACE: scancode = 0x0e; break;
- case BX_KEY_ENTER: scancode = 0x1c; break;
- case BX_KEY_TAB: scancode = 0x0f; break;
-
- case BX_KEY_LEFT:
- //bx_printf("# Grey left-arrow key not on 83-key keyboard\n");
- scancode = 0x4b; break;
- case BX_KEY_RIGHT:
- //bx_printf("# Grey right-arrow key not on 83-key keyboard\n");
- scancode = 0x4d; break;
- case BX_KEY_UP:
- //bx_printf("# Grey up-arrow key not on 83-key keyboard\n");
- scancode = 0x48; break;
- case BX_KEY_DOWN:
- //bx_printf("# Grey down-arrow key not on 83-key keyboard\n");
- scancode = 0x50; break;
-
- case BX_KEY_KP_LEFT: scancode = 0x4b; break;
- case BX_KEY_KP_RIGHT: scancode = 0x4d; break;
- case BX_KEY_KP_UP: scancode = 0x48; break;
- case BX_KEY_KP_DOWN: scancode = 0x50; break;
-
- case BX_KEY_INSERT:
- bx_printf("# Grey insert key not on 83-key keyboard\n");
- return;
- case BX_KEY_DELETE:
- bx_printf("# Grey delete key not on 83-key keyboard\n");
- return;
- case BX_KEY_HOME:
- bx_printf("# Grey home key not on 83-key keyboard\n");
- return;
- case BX_KEY_END:
- bx_printf("# Grey end key not on 83-key keyboard\n");
- return;
- case BX_KEY_PAGE_UP:
- bx_printf("# Grey page-up key not on 83-key keyboard\n");
- return;
- case BX_KEY_PAGE_DOWN:
- bx_printf("# Grey page-down key not on 83-key keyboard\n");
- return;
-
- case BX_KEY_KP_INSERT: scancode = 0x52; break;
- case BX_KEY_KP_DELETE: scancode = 0x53; break;
- case BX_KEY_KP_HOME: scancode = 0x47; break;
- case BX_KEY_KP_END: scancode = 0x4f; break;
- case BX_KEY_KP_PAGE_UP: scancode = 0x49; break;
- case BX_KEY_KP_PAGE_DOWN: scancode = 0x51; break;
-
- case BX_KEY_KP_ADD: scancode = 0x4e; break;
- case BX_KEY_KP_SUBTRACT: scancode = 0x4a; break;
- case BX_KEY_KP_5: scancode = 0x4c; break;
- case BX_KEY_KP_ENTER:
- bx_printf("# Grey Enter key not on 83-key keyboard\n");
- return;
- case BX_KEY_KP_MULTIPLY:
- bx_printf("# Grey Multiply key not on 83-key keyboard\n");
- return;
- case BX_KEY_KP_DIVIDE:
- bx_printf("# Grey Divide key not on 83-key keyboard\n");
- return;
- case BX_KEY_NUM_LOCK: scancode = 0x45; break;
-
- case BX_KEY_F1: scancode = 0x3b; break;
- case BX_KEY_F2: scancode = 0x3c; break;
- case BX_KEY_F3: scancode = 0x3d; break;
- case BX_KEY_F4: scancode = 0x3e; break;
- case BX_KEY_F5: scancode = 0x3f; break;
- case BX_KEY_F6: scancode = 0x40; break;
- case BX_KEY_F7: scancode = 0x41; break;
- case BX_KEY_F8: scancode = 0x42; break;
- case BX_KEY_F9: scancode = 0x43; break;
- case BX_KEY_F10: scancode = 0x44; break;
+ case BX_KEY_CTRL_R: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_CTRL_L: scancode[0] = 0x1d; break;
+
+ case BX_KEY_SHIFT_L: scancode[0] = 0x2a; break;
+ case BX_KEY_SHIFT_R: scancode[0] = 0x36; break;
+ case BX_KEY_ESC: scancode[0] = 0x01; break;
+
+ case BX_KEY_ALT_R: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_ALT_L: scancode[0] = 0x38; break;
+
+ case BX_KEY_A: scancode[0] = 0x1e; break;
+ case BX_KEY_B: scancode[0] = 0x30; break;
+ case BX_KEY_C: scancode[0] = 0x2e; break;
+ case BX_KEY_D: scancode[0] = 0x20; break;
+ case BX_KEY_E: scancode[0] = 0x12; break;
+ case BX_KEY_F: scancode[0] = 0x21; break;
+ case BX_KEY_G: scancode[0] = 0x22; break;
+ case BX_KEY_H: scancode[0] = 0x23; break;
+ case BX_KEY_I: scancode[0] = 0x17; break;
+ case BX_KEY_J: scancode[0] = 0x24; break;
+ case BX_KEY_K: scancode[0] = 0x25; break;
+ case BX_KEY_L: scancode[0] = 0x26; break;
+ case BX_KEY_M: scancode[0] = 0x32; break;
+ case BX_KEY_N: scancode[0] = 0x31; break;
+ case BX_KEY_O: scancode[0] = 0x18; break;
+ case BX_KEY_P: scancode[0] = 0x19; break;
+ case BX_KEY_Q: scancode[0] = 0x10; break;
+ case BX_KEY_R: scancode[0] = 0x13; break;
+ case BX_KEY_S: scancode[0] = 0x1f; break;
+ case BX_KEY_T: scancode[0] = 0x14; break;
+ case BX_KEY_U: scancode[0] = 0x16; break;
+ case BX_KEY_V: scancode[0] = 0x2f; break;
+ case BX_KEY_W: scancode[0] = 0x11; break;
+ case BX_KEY_X: scancode[0] = 0x2d; break;
+ case BX_KEY_Y: scancode[0] = 0x15; break;
+ case BX_KEY_Z: scancode[0] = 0x2c; break;
+
+ case BX_KEY_0: scancode[0] = 0x0b; break;
+ case BX_KEY_1: scancode[0] = 0x02; break;
+ case BX_KEY_2: scancode[0] = 0x03; break;
+ case BX_KEY_3: scancode[0] = 0x04; break;
+ case BX_KEY_4: scancode[0] = 0x05; break;
+ case BX_KEY_5: scancode[0] = 0x06; break;
+ case BX_KEY_6: scancode[0] = 0x07; break;
+ case BX_KEY_7: scancode[0] = 0x08; break;
+ case BX_KEY_8: scancode[0] = 0x09; break;
+ case BX_KEY_9: scancode[0] = 0x0a; break;
+
+ case BX_KEY_SPACE: scancode[0] = 0x39; break;
+ case BX_KEY_SINGLE_QUOTE: scancode[0] = 0x28; break;
+ case BX_KEY_COMMA: scancode[0] = 0x33; break;
+ case BX_KEY_PERIOD: scancode[0] = 0x34; break;
+ case BX_KEY_SLASH: scancode[0] = 0x35; break;
+
+ case BX_KEY_SEMICOLON: scancode[0] = 0x27; break;
+ case BX_KEY_EQUALS: scancode[0] = 0x0d; break;
+
+ case BX_KEY_LEFT_BRACKET: scancode[0] = 0x1a; break;
+ case BX_KEY_BACKSLASH: scancode[0] = 0x2b; break;
+ case BX_KEY_RIGHT_BRACKET: scancode[0] = 0x1b; break;
+ case BX_KEY_MINUS: scancode[0] = 0x0c; break;
+ case BX_KEY_GRAVE: scancode[0] = 0x29; break;
+
+ case BX_KEY_BACKSPACE: scancode[0] = 0x0e; break;
+ case BX_KEY_ENTER: scancode[0] = 0x1c; break;
+ case BX_KEY_TAB: scancode[0] = 0x0f; break;
+
+ case BX_KEY_LEFT: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_LEFT: scancode[0] = 0x4b; break;
+ case BX_KEY_RIGHT: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_RIGHT: scancode[0] = 0x4d; break;
+ case BX_KEY_UP: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_UP: scancode[0] = 0x48; break;
+ case BX_KEY_DOWN: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_DOWN: scancode[0] = 0x50; break;
+
+ case BX_KEY_INSERT: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_INSERT: scancode[0] = 0x52; break;
+ case BX_KEY_DELETE: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_DELETE: scancode[0] = 0x53; break;
+ case BX_KEY_HOME: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_HOME: scancode[0] = 0x47; break;
+ case BX_KEY_END: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_END: scancode[0] = 0x4f; break;
+ case BX_KEY_PAGE_UP: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_PAGE_UP: scancode[0] = 0x49; break;
+ case BX_KEY_PAGE_DOWN: scancode[1] = 0xe0;
+ extd = 1;
+ case BX_KEY_KP_PAGE_DOWN: scancode[0] = 0x51; break;
+
+ case BX_KEY_KP_ADD: scancode[0] = 0x4e; break;
+ case BX_KEY_KP_SUBTRACT: scancode[0] = 0x4a; break;
+ case BX_KEY_KP_5: scancode[0] = 0x4c; break;
+ case BX_KEY_KP_ENTER: scancode[0] = 0xe01c; break;
+ //bx_printf("# Grey Enter key not on 83-key keyboard\n");
+ //return;
+ case BX_KEY_KP_MULTIPLY: scancode[0] = 0x37; break;
+
+ case BX_KEY_KP_DIVIDE: scancode[0] = 0xe035; break;
+ //bx_printf("# Grey Divide key not on 83-key keyboard\n");
+ //return;
+ case BX_KEY_NUM_LOCK: scancode[0] = 0x45; break;
+
+ case BX_KEY_F1: scancode[0] = 0x3b; break;
+ case BX_KEY_F2: scancode[0] = 0x3c; break;
+ case BX_KEY_F3: scancode[0] = 0x3d; break;
+ case BX_KEY_F4: scancode[0] = 0x3e; break;
+ case BX_KEY_F5: scancode[0] = 0x3f; break;
+ case BX_KEY_F6: scancode[0] = 0x40; break;
+ case BX_KEY_F7: scancode[0] = 0x41; break;
+ case BX_KEY_F8: scancode[0] = 0x42; break;
+ case BX_KEY_F9: scancode[0] = 0x43; break;
+ case BX_KEY_F10: scancode[0] = 0x44; break;
+ case BX_KEY_F11: scancode[0] = 0x57; break;
+ case BX_KEY_F12: scancode[0] = 0x58; break;
default:
bx_printf("# bx_keyb_c::gen_scancode : Unhandled %u\n",
@@ -714,8 +710,11 @@
return;
}
if (key & BX_KEY_RELEASED)
- scancode |= 0x80;
- kbd_enQ(scancode);
+ scancode[0] |= 0x80;
+ while(extd >= 0){
+ kbd_enQ(scancode[extd]);
+ extd--;
+ }
}
@@ -833,7 +832,7 @@
void
-bx_keyb_c::kbd_enQ(Bit8u scancode)
+bx_keyb_c::kbd_enQ(Bit8u scancode)
{
int tail;
@@ -851,10 +850,10 @@
bx_printf("KBD: enQ: putting scancode %02x in internal buffer\n",
(unsigned) scancode);
tail = (BX_KEY_THIS s.kbd_internal_buffer.head + BX_KEY_THIS
s.kbd_internal_buffer.num_elements) %
- BX_KBD_ELEMENTS;
+ BX_KBD_ELEMENTS;
BX_KEY_THIS s.kbd_internal_buffer.buffer[tail] = scancode;
BX_KEY_THIS s.kbd_internal_buffer.num_elements++;
-
+
if (!BX_KEY_THIS s.kbd_controller.outb && BX_KEY_THIS
s.kbd_controller.kbd_clock_enabled) {
activate_timer();
//bx_printf("# activating timer...\n");
@@ -1038,13 +1037,13 @@
break;
case 0xd3:
- kbd_enQ(0xfa);
+ kbd_enQ(0xfa,0);
return;
default:
bx_panic("KBD: kbd_ctrl_to_kbd(): got value of %02x\n",
(unsigned) value);
- kbd_enQ(0xFA); /* send ACK ??? */
+ kbd_enQ(0xFA); /* send ACK ??? */ //yes, send ack
return;
break;
}
@@ -1317,9 +1316,8 @@
bx_keyb_c::put_scancode( unsigned char *code, int count )
{
for ( int i = 0 ; i < count ; i++ ) {
- kbd_enQ( code[i] );
+ kbd_enQ(code[i]);
}
-
return;
}