24
|
1 #include "kernel.h"
|
|
2
|
|
3 static int shiftstate = 0;
|
|
4 static volatile uint8_t charAvail = 0;
|
|
5 static volatile char kbdchar = ' ';
|
|
6
|
|
7 static char keymap[128] = {
|
|
8 '?','?','1','2', '3', '4', '5','6', '7', '8','9', '0', '-','=', 0xe, '?',
|
|
9 'q','w','e','r', 't', 'y', 'u','i', 'o', 'p','[', ']', '\n','?', 'a', 's',
|
|
10 'd','f','g','h', 'j', 'k', 'l',';', '\'', '?','?', '?', 'z','x', 'c', 'v',
|
|
11 'b','n','m',',', '.', '/', '?','?', '?', ' ','?', '?', '?','?', '?', '?',
|
|
12
|
|
13 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
|
|
14 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
|
|
15 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
|
|
16 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?'
|
|
17 };
|
|
18
|
|
19 static char keymapUPPER[128] = {
|
|
20 '?','?','!','@', '#', '$', '%','^', '&', '*','(', ')', '_','+', '?', '?',
|
|
21 'Q','W','E','R', 'T', 'Y', 'U','I', 'O', 'P','{', '}', '|','?', 'A', 'S',
|
|
22 'D','F','G','H', 'J', 'K', 'L',':', '"', '?','?', '?', 'Z','X', 'C', 'V',
|
|
23 'B','N','M','<', '>', '?', '?','?', '?', ' ','?', '?', '?','?', '?', '?',
|
|
24
|
|
25 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
|
|
26 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
|
|
27 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
|
|
28 '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?'
|
|
29 };
|
|
30
|
|
31 void keyboardDriverUpdate(unsigned char scancode)
|
|
32 {
|
|
33 switch(scancode) {
|
|
34 case 0x2a:
|
|
35 shiftstate = 1;
|
|
36 break;
|
|
37 case 0xaa:
|
|
38 shiftstate = 0;
|
|
39 break;
|
|
40 default:
|
|
41 if (scancode < 128) {
|
|
42 if (charAvail == 0) {
|
|
43 if (shiftstate == 0) {
|
|
44 kbdchar = keymap[scancode];
|
|
45 } else {
|
|
46 kbdchar = keymapUPPER[scancode];
|
|
47 }
|
|
48
|
|
49 charAvail = 1;
|
|
50 }
|
|
51 } else {
|
|
52 // Key release
|
|
53 //printf("Unhandled scancode: 0x%x\n", scancode);
|
|
54 }
|
|
55 break;
|
|
56 }
|
|
57 }
|
|
58
|
|
59 char getChar()
|
|
60 {
|
|
61 while (charAvail == 0);
|
|
62 char c = kbdchar;
|
|
63 charAvail = 0;
|
|
64 return c;
|
|
65 }
|
|
66
|
|
67 void getline(char *buffer, int len)
|
|
68 {
|
|
69 char c;
|
|
70 int i = 0;
|
|
71 while (i < len-1) {
|
|
72 c = getChar();
|
|
73 //printf("%x", c);
|
|
74 if (c == '\n') {
|
|
75 // Enter
|
|
76 break;
|
|
77 }
|
|
78 if (c == 0x0e)
|
|
79 {
|
|
80 // Backspace
|
|
81 if (i>0)
|
|
82 {
|
|
83 int r, c;
|
|
84 get_cursor(&r, &c);
|
|
85 set_cursor(r, c - 1);
|
|
86 printf(" ");
|
|
87 set_cursor(r, c - 1);
|
|
88 i--;
|
|
89 }
|
|
90 continue;
|
|
91 }
|
|
92 buffer[i] = c;
|
|
93 printf("%c", c);
|
|
94 i++;
|
|
95 }
|
|
96 buffer[i] = 0;
|
|
97 }
|
|
98
|