Share Pastebin
Guest
Public paste!

keyboard.c

By: a guest | Mar 21st, 2010 | Syntax: C | Size: 3.23 KB | Hits: 112 | Expires: Never
Copy text to clipboard
  1. #include <system.h>
  2. #define KEYB_PORT       0x60
  3. #define KEYCTRL         1
  4. #define KEYSHIFT        2
  5. #define KEYALT          4
  6.  
  7. char modifiers = 0;     /* This is a bit mask */
  8. char escaped = 0;
  9. /* I've set the '#' char on unprintable scancodes */
  10. char keymap[64] = {
  11.  '#', '#', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '#', '#', '\b',
  12.  '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\n',
  13.  '#', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '#', '#', '#',
  14.  '#', '\\', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '-', '#', '*',
  15.  '#', ' ', '#', '#', '#', '#', '#', '#' };
  16.  
  17. void keyboard_manager()
  18. {
  19.         unsigned scan_code = inportb(KEYB_PORT);
  20.         char c;
  21.         if (escaped) scan_code += 0x100;
  22.         switch (scan_code) {
  23.        
  24.                 case 0x00:      /* Error code */
  25.                                 puts("Keyboard error\n");
  26.                                 break;
  27.                 case 0x01:      /* ESC */
  28.                                 puts("Esc ");
  29.                                 break;
  30.                
  31.                 /* Shift down */
  32.                 case 0x2a:                              /* L_SHIFT */
  33.                 case 0x36:      modifiers |= KEYSHIFT;  /* R_SHIFT */
  34.                                 break;
  35.                 /* Shift up */
  36.                 case 0xaa:
  37.                 case 0xb6:      modifiers &= ~(KEYSHIFT);
  38.                                 break;
  39.                 /* Ctrl down */
  40.                 case 0x1d:                              /* L_CTRL */
  41.                 case 0x11d:     modifiers |= KEYCTRL;   /* R_CTRL */
  42.                                 break;
  43.                 /* Ctrl up */
  44.                 case 0x9d:
  45.                 case 0x19d:     modifiers &= ~(KEYCTRL);
  46.                                 break;
  47.                 /* Alt down */
  48.                 case 0x38:                              /* L_ALT */
  49.                 case 0x138:     modifiers |= KEYALT;    /* R_ALT */
  50.                                 break;
  51.                 /* Alt up */
  52.                 case 0xb8:
  53.                 case 0x1b8:     modifiers &= ~(KEYALT);
  54.                                 break;
  55.                 /* Escape sequence start */
  56.                 case 0xe0:      escaped = 1;
  57.                                 break;
  58.                 default:
  59.                         if (scan_code & 0x80) {
  60.                                 /* Ignore the break code */
  61.                                 escaped = 0;
  62.                         } else {
  63.                                 /* Echoes printable chars only */
  64.                                 if ((scan_code >= 0x02) && (scan_code < 64)) {
  65.                                         c = keymap[scan_code];
  66.                                         if ((c>='A') && (c<='Z'))
  67.                                                 c=(modifiers & KEYSHIFT) ?
  68.                                                         c : c - 'A' + 'a';
  69.                                         putch(c);
  70.                                 } else {
  71.                                         puts("Unknown scan code, sorry!\n");
  72.                                 }
  73.                                 escaped = 0;
  74.                         }
  75.                         break;
  76.         }
  77. }