xref: /xv6-public/kbd.h (revision 5e8c5d8b)
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 
113