-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkeyboard.cpp
More file actions
executable file
·109 lines (91 loc) · 3.93 KB
/
keyboard.cpp
File metadata and controls
executable file
·109 lines (91 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "keyboard.h"
void printf(char* str);
KeyboardDriver::KeyboardDriver(InterruptManager* manager)
: InterruptHandler(0x21,manager), //键盘中断号 0x21
dataport(0x60), // 数据端口号
commandport(0x64) //指令端口号
{
/*while(commandport.Read() & 0x1 ) //取结果二进制最右位
dataport.Read();
commandport.Write(0xAE); //通知 pic 开始键盘中断
commandport.Write(0x20); // 当前状态
uint8_t status = (dataport.Read() | 1) & ~0x10;
commandport.Write(0x60);
dataport.Write(status);
dataport.Write(0xF4);*/
while(commandport.Read() & 0x1)
dataport.Read();
commandport.Write(0xae); // activate interrupts
commandport.Write(0x20); // command 0x20 = read controller command byte
uint8_t status = (dataport.Read() | 1) & ~0x10;
commandport.Write(0x60); // command 0x60 = set controller command byte
dataport.Write(status);
dataport.Write(0xf4);
}
KeyboardDriver::~KeyboardDriver(){
}
uint32_t KeyboardDriver::HandleInterrupt(uint32_t esp){
printf("KEYBOARD INT!\n");
uint8_t key = dataport.Read();
if(key < 0x80)
{
switch(key)
{
case 0xFA: break;
case 0x45: break;
/*case 0x04: handler->OnKeyDown('3'); break;
case 0x05: handler->OnKeyDown('4'); break;
case 0x06: handler->OnKeyDown('5'); break;
case 0x07: handler->OnKeyDown('6'); break;
case 0x08: handler->OnKeyDown('7'); break;
case 0x09: handler->OnKeyDown('8'); break;
case 0x0A: handler->OnKeyDown('9'); break;
case 0x0B: handler->OnKeyDown('0'); break;
case 0x10: handler->OnKeyDown('q'); break;
case 0x11: handler->OnKeyDown('w'); break;
case 0x12: handler->OnKeyDown('e'); break;
case 0x13: handler->OnKeyDown('r'); break;
case 0x14: handler->OnKeyDown('t'); break;
case 0x15: handler->OnKeyDown('z'); break;
case 0x16: handler->OnKeyDown('u'); break;
case 0x17: handler->OnKeyDown('i'); break;
case 0x18: handler->OnKeyDown('o'); break;
case 0x19: handler->OnKeyDown('p'); break;
case 0x1E: handler->OnKeyDown('a'); break;
case 0x1F: handler->OnKeyDown('s'); break;
case 0x20: handler->OnKeyDown('d'); break;
case 0x21: handler->OnKeyDown('f'); break;
case 0x22: handler->OnKeyDown('g'); break;
case 0x23: handler->OnKeyDown('h'); break;
case 0x24: handler->OnKeyDown('j'); break;
case 0x25: handler->OnKeyDown('k'); break;
case 0x26: handler->OnKeyDown('l'); break;
case 0x2C: handler->OnKeyDown('y'); break;
case 0x2D: handler->OnKeyDown('x'); break;
case 0x2E: handler->OnKeyDown('c'); break;
case 0x2F: handler->OnKeyDown('v'); break;
case 0x30: handler->OnKeyDown('b'); break;
case 0x31: handler->OnKeyDown('n'); break;
case 0x32: handler->OnKeyDown('m'); break;
case 0x33: handler->OnKeyDown(','); break;
case 0x34: handler->OnKeyDown('.'); break;
case 0x35: handler->OnKeyDown('-'); break;
case 0x1C: handler->OnKeyDown('\n'); break;
case 0x39: handler->OnKeyDown(' '); break;*/
default:
{
char* foo = "KEYBOARD 0x00 \n";
char* hex = "0123456789ABCDEF";
foo[11] = hex[(key >> 4) & 0x0F]; //key的前四位
foo[12] = hex[key & 0x0F]; //后四位
printf("fuck!");break;
}
}
}
/*char* foo = "KEYBOARD 0x00 ";
char* hex = "0123456789ABCDEF";
foo[11] = hex[(key >> 4) & 0x0F]; //key的前四位
foo[12] = hex[key & 0x0F]; //后四位
printf(foo);*/
return esp;
}