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