diff options
author | Robert Morris <[email protected]> | 2019-06-05 11:42:03 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-06-05 11:42:03 -0400 |
commit | f1a727b971a59bab6025b4c4111342c27356ca40 (patch) | |
tree | d22d52c613bfc003e6fb75b5d137aeff9d954201 /kbd.c | |
parent | ec3d3a1fceee437c640f9c5c05fc517edfb1899e (diff) | |
download | xv6-labs-f1a727b971a59bab6025b4c4111342c27356ca40.tar.gz xv6-labs-f1a727b971a59bab6025b4c4111342c27356ca40.tar.bz2 xv6-labs-f1a727b971a59bab6025b4c4111342c27356ca40.zip |
start at support for multiple CPUs
Diffstat (limited to 'kbd.c')
-rw-r--r-- | kbd.c | 50 |
1 files changed, 0 insertions, 50 deletions
@@ -1,50 +0,0 @@ -#include "types.h" -#include "x86.h" -#include "defs.h" -#include "kbd.h" - -int -kbdgetc(void) -{ - static uint shift; - static uchar *charcode[4] = { - normalmap, shiftmap, ctlmap, ctlmap - }; - uint st, data, c; - - st = inb(KBSTATP); - if((st & KBS_DIB) == 0) - return -1; - data = inb(KBDATAP); - - if(data == 0xE0){ - shift |= E0ESC; - return 0; - } else if(data & 0x80){ - // Key released - data = (shift & E0ESC ? data : data & 0x7F); - shift &= ~(shiftcode[data] | E0ESC); - return 0; - } else if(shift & E0ESC){ - // Last character was an E0 escape; or with 0x80 - data |= 0x80; - shift &= ~E0ESC; - } - - shift |= shiftcode[data]; - shift ^= togglecode[data]; - c = charcode[shift & (CTL | SHIFT)][data]; - if(shift & CAPSLOCK){ - if('a' <= c && c <= 'z') - c += 'A' - 'a'; - else if('A' <= c && c <= 'Z') - c += 'a' - 'A'; - } - return c; -} - -void -kbdintr(void) -{ - consoleintr(kbdgetc); -} |