root/kbd.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. kbdgetc
  2. kbdintr

   1 #include "types.h"
   2 #include "x86.h"
   3 #include "defs.h"
   4 #include "kbd.h"
   5 
   6 int
   7 kbdgetc(void)
   8 {
   9   static uint shift;
  10   static uchar *charcode[4] = {
  11     normalmap, shiftmap, ctlmap, ctlmap
  12   };
  13   uint st, data, c;
  14 
  15   st = inb(KBSTATP);
  16   if((st & KBS_DIB) == 0)
  17     return -1;
  18   data = inb(KBDATAP);
  19 
  20   if(data == 0xE0){
  21     shift |= E0ESC;
  22     return 0;
  23   } else if(data & 0x80){
  24     // Key released
  25     data = (shift & E0ESC ? data : data & 0x7F);
  26     shift &= ~(shiftcode[data] | E0ESC);
  27     return 0;
  28   } else if(shift & E0ESC){
  29     // Last character was an E0 escape; or with 0x80
  30     data |= 0x80;
  31     shift &= ~E0ESC;
  32   }
  33 
  34   shift |= shiftcode[data];
  35   shift ^= togglecode[data];
  36   c = charcode[shift & (CTL | SHIFT)][data];
  37   if(shift & CAPSLOCK){
  38     if('a' <= c && c <= 'z')
  39       c += 'A' - 'a';
  40     else if('A' <= c && c <= 'Z')
  41       c += 'a' - 'A';
  42   }
  43   return c;
  44 }
  45 
  46 void
  47 kbdintr(void)
  48 {
  49   consoleintr(kbdgetc);
  50 }

/* [<][>][^][v][top][bottom][index][help] */