xv6

port of xv6 to x86-64
git clone http://frotz.net/git/xv6.git
Log | Files | Refs | README | LICENSE

kbd.h (3535B)


      1 // PC keyboard interface constants
      2 
      3 #define KBSTATP         0x64    // kbd controller status port(I)
      4 #define KBS_DIB         0x01    // kbd data in buffer
      5 #define KBDATAP         0x60    // kbd data port(I)
      6 
      7 #define NO              0
      8 
      9 #define SHIFT           (1<<0)
     10 #define CTL             (1<<1)
     11 #define ALT             (1<<2)
     12 
     13 #define CAPSLOCK        (1<<3)
     14 #define NUMLOCK         (1<<4)
     15 #define SCROLLLOCK      (1<<5)
     16 
     17 #define E0ESC           (1<<6)
     18 
     19 // Special keycodes
     20 #define KEY_HOME        0xE0
     21 #define KEY_END         0xE1
     22 #define KEY_UP          0xE2
     23 #define KEY_DN          0xE3
     24 #define KEY_LF          0xE4
     25 #define KEY_RT          0xE5
     26 #define KEY_PGUP        0xE6
     27 #define KEY_PGDN        0xE7
     28 #define KEY_INS         0xE8
     29 #define KEY_DEL         0xE9
     30 
     31 // C('A') == Control-A
     32 #define C(x) (x - '@')
     33 
     34 static uchar shiftcode[256] =
     35 {
     36   [0x1D] CTL,
     37   [0x2A] SHIFT,
     38   [0x36] SHIFT,
     39   [0x38] ALT,
     40   [0x9D] CTL,
     41   [0xB8] ALT
     42 };
     43 
     44 static uchar togglecode[256] =
     45 {
     46   [0x3A] CAPSLOCK,
     47   [0x45] NUMLOCK,
     48   [0x46] SCROLLLOCK
     49 };
     50 
     51 static uchar normalmap[256] =
     52 {
     53   NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00
     54   '7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t',
     55   'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10
     56   'o',  'p',  '[',  ']',  '\n', NO,   'a',  's',
     57   'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20
     58   '\'', '`',  NO,   '\\', 'z',  'x',  'c',  'v',
     59   'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30
     60   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
     61   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
     62   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
     63   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
     64   [0x9C] '\n',      // KP_Enter
     65   [0xB5] '/',       // KP_Div
     66   [0xC8] KEY_UP,    [0xD0] KEY_DN,
     67   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
     68   [0xCB] KEY_LF,    [0xCD] KEY_RT,
     69   [0x97] KEY_HOME,  [0xCF] KEY_END,
     70   [0xD2] KEY_INS,   [0xD3] KEY_DEL
     71 };
     72 
     73 static uchar shiftmap[256] =
     74 {
     75   NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00
     76   '&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t',
     77   'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10
     78   'O',  'P',  '{',  '}',  '\n', NO,   'A',  'S',
     79   'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':',  // 0x20
     80   '"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V',
     81   'B',  'N',  'M',  '<',  '>',  '?',  NO,   '*',  // 0x30
     82   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
     83   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
     84   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
     85   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
     86   [0x9C] '\n',      // KP_Enter
     87   [0xB5] '/',       // KP_Div
     88   [0xC8] KEY_UP,    [0xD0] KEY_DN,
     89   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
     90   [0xCB] KEY_LF,    [0xCD] KEY_RT,
     91   [0x97] KEY_HOME,  [0xCF] KEY_END,
     92   [0xD2] KEY_INS,   [0xD3] KEY_DEL
     93 };
     94 
     95 static uchar ctlmap[256] =
     96 {
     97   NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO,
     98   NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO,
     99   C('Q'),  C('W'),  C('E'),  C('R'),  C('T'),  C('Y'),  C('U'),  C('I'),
    100   C('O'),  C('P'),  NO,      NO,      '\r',    NO,      C('A'),  C('S'),
    101   C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO,
    102   NO,      NO,      NO,      C('\\'), C('Z'),  C('X'),  C('C'),  C('V'),
    103   C('B'),  C('N'),  C('M'),  NO,      NO,      C('/'),  NO,      NO,
    104   [0x9C] '\r',      // KP_Enter
    105   [0xB5] C('/'),    // KP_Div
    106   [0xC8] KEY_UP,    [0xD0] KEY_DN,
    107   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
    108   [0xCB] KEY_LF,    [0xCD] KEY_RT,
    109   [0x97] KEY_HOME,  [0xCF] KEY_END,
    110   [0xD2] KEY_INS,   [0xD3] KEY_DEL
    111 };
    112