-
Notifications
You must be signed in to change notification settings - Fork 1
/
KEYS.C
77 lines (69 loc) · 1.39 KB
/
KEYS.C
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
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include "keys.h"
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
typedef void interrupt (*VECTPROC)(__CPPARGS);
static VECTPROC oldint09 = NULL;
static KB_UPROC kbu_func = NULL;
void kb_stub(unsigned char butt) {
/* printf("‘ª ª®¤: %d\n", butt);*/
}
void interrupt newint09(__CPPARGS) {
unsigned char butt, v;
disable();
/* áç¨â ¥¬ ¢¢¥¤¥ë© ᨬ¢®« */
butt = inp(0x60);
/* ¨¨æ¨ «¨§ æ¨ï ª« ¢¨ âãàë */
v = inp(0x61);
outp(0x61, v | 0x80);
outp(0x61, v);
enable();
/* ¢ë§®¯ ¯/¯ ®¡à ¡®âª¨ ª« ¢¨è¨ */
kbu_func(butt);
/* ª®¥æ ¯à¥àë¢ ¨ï */
outp(0x20, 0x20);
/* asm {
cli
in al,60h ; áç¨â ¥¬ ¢¢¥¤¥ë© ᨬ¢®«
mov butt, al
in al, 61h ; ¨¨æ¨ «¨§ æ¨ï ª« ¢¨ âãàë
mov ah, al
or al, 80h
out 61h, al
mov al, ah
out 61h, al
sti
}
kbu_func(butt); // ¢ë§®¯ ¯/¯ ®¡à ¡®âª¨ ª« ¢¨è¨
asm { ; ª®¥æ ¯à¥àë¢ ¨ï
mov al, 20h
out 20h, al
}*/
}
void kb_on(void) {
if (!oldint09) {
if (!kbu_func) {
kbu_func = kb_stub;
}
oldint09 = getvect(0x09);
/* ãáâ ®¢ë© ¢¥ªâ®à ¯à¥à */
setvect(0x09, newint09);
}
}
void kb_off(void) {
if (oldint09) {
/* ãáâ ®¢ë© ¢¥ªâ®à ¯à¥à */
setvect(0x09, oldint09);
oldint09 = NULL;
}
}
void kb_set(KB_UPROC funcaddr) {
disable(); /* cli */
kbu_func = funcaddr;
enable(); /* sti */
}