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;
 }
 

Reply via email to