-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKEYBOARD.C
186 lines (162 loc) · 3.53 KB
/
KEYBOARD.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
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/**********************************************************************/
/* */
/* Malte System/Keyboard */
/* 1992/07/08 */
/* */
/* Copyright (C) par les Chevaliers de Malte */
/* */
/**********************************************************************/
#ifndef __Malte_Keyboard__
#define __Malte_Keyboard__
#ifndef __PASCAL__
#include <KEYBOARD\MEM_KEY.H>
#include <KEYBOARD\BIOS_KEY.H>
#include <KEYBOARD\KEYBOARD.H>
Byte KeyboardMethode = 0; // (0)Direct (100% compatible) /
// (1)BIOS / (2)DOS (Windows mode)
Byte KeyPressed(void)
{
return(MEM_KeyPressed());
}
Word ReadKey(void)
{
if(KeyboardMethode == 0) return(MEM_ReadKey());
else return(BIOS_ReadKey());
}
Word NextKey(void)
{
if(KeyboardMethode == 0) return(MEM_NextKey());
else return(BIOS_NextKey());
}
Byte KeyFlags(void)
{
if(KeyboardMethode == 0) return(MEM_KeyFlags());
else return(BIOS_KeyFlags());
}
Byte GetModeInsert(void)
{
if(KeyboardMethode == 0) return(MEM_GetModeInsert());
else return(BIOS_GetModeInsert());
}
Byte GetKeyboardMethode(void)
{
return(KeyboardMethode);
}
void SetKeyboardMethode(Byte Methode)
{
if(Methode < 3) KeyboardMethode = Methode;
}
#else
typedef unsigned char Byte;
typedef unsigned int Word;
extern Byte KeyboardMethode; // (0)Direct (100% compatible) /
// (1)BIOS / (2)DOS (Windows mode)
Byte KeyPressed(void)
{
{
asm MOV AX,0x0040;
asm MOV ES,AX;
asm MOV DX,ES:[0x001A];
asm CMP DX,ES:[0x001C];
asm JE V0;
return(1);
V0:
return(0);
}
}
Word ReadKey(void)
{
if(KeyboardMethode == 0)
{
asm MOV AX,0x0040;
asm MOV ES,AX;
asm MOV SI,0x001A;
L: asm MOV DI,ES:[SI];
asm CMP DI,ES:[0x001C];
asm JE L;
asm MOV BX,ES:[0x0080];
asm MOV CX,ES:[0x0082];
asm SUB CX,BX;
asm MOV AX,ES:[DI];
asm SUB DI,BX;
asm ADD DI,6;
asm AND DI,CX;
asm ADD DI,BX;
asm MOV ES:[SI],DI;
return(_AX);
}
else
{
asm MOV AH,0x00;
asm INT 0x16;
return(_AX);
}
}
Word NextKey(void)
{
if(KeyboardMethode == 0)
{
asm MOV AX,0x0040;
asm MOV ES,AX;
asm MOV DI,ES:[0x001A];
asm MOV AX,ES:[DI];
return(_AX);
}
else
{
asm MOV AH,0x01;
asm INT 0x16;
return(_AX);
}
}
Byte KeyFlags(void)
{
if(KeyboardMethode == 0)
{
asm MOV AX,0x0040;
asm MOV ES,AX;
asm MOV AL,ES:[0x0017];
return(_AL);
}
else
{
asm MOV AH,0x02;
asm INT 0x16;
return(_AL);
}
}
Byte GetModeInsert(void)
{
if(KeyboardMethode == 0)
{
asm MOV AX,0x0040;
asm MOV ES,AX;
asm MOV AL,ES:[0x0017];
asm ROL AL,1;
asm AND AL,1;
return(_AL);
}
else
{
asm MOV AH,0x02;
asm INT 0x16;
return((_AL >> 7) & 1);
}
}
Byte GetKeyboardMethode(void)
{
return(KeyboardMethode);
}
void SetKeyboardMethode(Byte Methode)
{
if(Methode < 3) KeyboardMethode = Methode;
}
Byte KeyFlagsAT(void)
{
asm MOV AX,0x0040;
asm MOV ES,AX;
asm MOV AL,ES:[0x0018];
return(_AL);
}
#endif
#endif