
C_Kurs_Lekt / DOC_RAZNOE / 1 / Сканкоды клавиатуры
.pdf╔══════════════════════════════════════════════════════════════════════════════╗
║ |
Сканкоды клавиатуры |
║ |
╚══════════════════════════════════════════════════════════════════════════════╝
Когда клавиатура вызывает аппаратное прерывание, она передает обработчику прерываний "сканкод". Обработчик преобразует сканкод либо в код ASCII, либо в расширенный код ASCII . Для совместимости между различными типами клавиатур разумно привязываться к BIOS-интерпретации нажатой клавиши.
┌──────────────────────────────┐
│ Стандартная клавиатура PC/XT │ При отпускании клавиши, клавиатура посылает └──────────────────────────────┘ тот же сканкод с включенным старшим битом (например, [Ctrl] посылает 1dH при нажатии и 9dH при отпускании).
────────────╥─────────────╥───────────────╥────────────────╥──────────────────
Hex Dec Key ║Hex Dec Key ║Hex Dec Key ║Hex Dec Key ║Hex Dec Key
────────────╫─────────────╫───────────────╫────────────────╫──────────────────
01 |
1 |
Esc ║12 |
18 |
E |
║23 |
35 |
H |
║34 |
52 |
. > |
║45 |
69 |
NumLock |
||
02 |
2 |
1 |
! ║13 |
19 |
R |
║24 |
36 |
J |
║35 |
53 |
/ ? |
║46 |
70 |
ScrollLock |
|
03 |
3 |
2 |
@ ║14 |
20 |
T |
║25 |
37 |
K |
║36 |
54 |
Shft(Rt)║47 |
71 |
Home |
[7] |
|
04 |
4 |
3 |
# ║15 |
21 |
Y |
║26 |
38 |
L |
║37 |
55 |
PrtSc |
║48 |
72 |
|
[8] |
05 |
5 |
4 |
$ ║16 |
22 |
U |
║27 |
39 |
; : |
║38 |
56 |
Alt |
║49 |
73 |
PgUp [9] |
|
06 |
6 |
5 |
% ║17 |
23 |
I |
║28 |
40 |
" ' |
║39 |
57 |
spacebar║4a |
74 |
K - |
|
|
07 |
7 |
6 |
^ ║18 |
24 |
O |
║29 |
41 |
` ~ |
║3a |
58 |
CapsLock║4b |
75 |
|
[4] |
|
08 |
8 |
7 |
& ║19 |
25 |
P |
║2a |
42 |
Shft(L)║3b |
59 |
F1 |
║4c |
76 |
|
[5] |
|
09 |
9 |
8 |
* ║1a |
26 |
[ { |
║2b |
43 |
\ | |
║3c |
60 |
F2 |
║4d |
77 |
|
[6] |
0a |
10 |
9 |
( ║1b |
27 |
] } |
║2c |
44 |
Z |
║3d |
61 |
F3 |
║4e |
78 |
K + |
|
0b |
11 |
0 |
) ║1c |
28 |
Enter║2d |
45 |
X |
║3e |
62 |
F4 |
║4f |
79 |
End |
[1] |
|
0c |
12 |
- _ ║1d |
29 |
Ctrl ║2e |
46 |
C |
║3f |
63 |
F5 |
║50 |
80 |
|
[2] |
||
0d |
13 |
+ = ║1e |
30 |
A |
║2f |
47 |
V |
║40 |
64 |
F6 |
║51 |
81 |
PgDn |
[3] |
|
0e |
14 |
bksp║1f |
31 |
S |
║30 |
48 |
B |
║41 |
65 |
F7 |
║52 |
82 |
Ins |
[0] |
|
0f |
15 |
Tab ║20 |
32 |
D |
║31 |
49 |
N |
║42 |
66 |
F8 |
║53 |
83 |
Del |
[.] |
|
10 |
16 |
Q |
║21 |
33 |
F |
║32 |
50 |
M |
║43 |
67 |
F9 |
║ |
|
|
|
11 |
17 |
W |
║22 |
34 |
G |
║33 |
51 |
, < |
║44 |
68 |
F10 |
║ |
|
|
|
────────────╨─────────────╨───────────────╨────────────────╨──────────────────
┌────────────────────────────┐
│ 84-клавишная клавиатура AT │ Эта клавиатура посылает те же сканкоды, что и └────────────────────────────┘ типовая 83-клавишная, с тем добавлением, что
[SysReq] посылает сканкод 54H (десятичное 84).
Однако BIOS никогда не передает этот сканкод в прикладную программу. Вместо этого он вызывает INT 15H подф. 85H при нажатии и отпускании SysReq.
Отпускание клавиши обрабатывается иначе. При отпускании клавиши клавиатура посылает двухбайтовую последовательность: 0f0H, затем сканкод 'нажатия'. См. Функции клавиатуры AT о программировании такой клавиатуры.
┌──────────────────────────┐ │ 101-клавишная клавиатура │ Эта клавиатура имеет имеет три различных схемы
└──────────────────────────┘ сканкодов, выбираемых через порт 64H. На уровне сканкодов существует много существенных отличий от более старых клавиатур.
Эта версия Tech Help! не включает информации по 101-клавишной клавиатуре. Будущие версии будут содержать эти сведения (если вы попросите об этом). Посмотрите пока Расширенные клавиши ASCII - там есть интерфейс BIOS для этой клавиатуры. И, в конце концов, самое лучшее - привязаться к этому интерфейсу.
╔══════════════════════════════════════════════════════════════════════════════╗ ║ INT 16H: Сервис клавиатуры еще ║
╚══════════════════════════════════════════════════════════════════════════════╝
Это - интерфейс прикладного уровня с клавиатурой. Нажатия клавиш на самом деле обрабатываются асинхронно на заднем плане. Когда клавиша получена от клавиатуры, она обрабатывается прерыванием INT 09H и помещается в циклическую очередь.
См. Клавиатуру AT о способах ускорения клавиатуры и других сведениях.
AH Сервис
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
00H читать (ожидать) следующую нажатую клавишу
Выход: AL = ASCII символ (если AL=0, AH содержит Расширенный код ASCII ) AH = Сканкод или Расширенный код ASCII
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
01H Проверить готовность символа (и показать его, если так) Выход: ZF = 1 если символ не готов.
ZF = 0 если символ готов.
AX = как для подфункции 00H (но символ здесь не удаляется из очереди).
▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
02H Читать состояние shift-клавиш. Определить, какие shift-клавиши нажаты в данный момент, находится ли клавиатура в состоянии NumLock, и т.п. Выход: AL = статус клавиатуры -- см. Флаги клавиатуры
────────────────────────────────────────────────────────────────────────────────
Функции DOS: Символьный в/в Данные BIOS Функции ROM-BIOS
╔══════════════════════════════════════════════════════════════════════════════╗ ║ Флаги состояния клавиатуры еще ║
╚══════════════════════════════════════════════════════════════════════════════╝
Два байта с адресами 0:0417 и 0:0418 содержат состояние служебных клавиш и другую полезную информацию. Прерывание INT 16H возвращает первый байт в AL.
╓7┬6┬5┬4┬3┬2┬1┬0╖ |
|
|
|
|
║i│c│n│s│A│C│ │ ║ |
Вызовите INT 16H или извлеките байт по адресу 0:0417 |
|||
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ бит |
|
|
||
║ ║ ║ |
║ ║ ║ ║ ╚═ |
0: правая клавиша Shift (AL & 01H) 01H=нажата |
||
║ ║ ║ |
║ ║ ║ ╚═══ |
1: левая клавиша Shift (AL & 02H) 02H=нажата |
||
║ ║ ║ |
║ ║ ╚═════ |
2: Ctrl |
(AL & 04H) 04H=[Ctrl] нажата |
|
║ ║ ║ |
║ ╚═══════ |
3: Alt |
(AL & 08H) 08H=[Alt] нажата |
|
║ ║ ║ |
╚═════════ |
4: ScrollLock |
(AL & 10H) 10H=режим ScrollLock |
|
║ ║ ╚═══════════ |
5: NumLock |
(AL & 20H) 20H=режим NumLock |
||
║ ╚═════════════ |
6: CapsLock |
(AL & 40H) 40H=режим CapsLock |
||
╚═══════════════ |
7: Insert |
(AL & 80H) 80H=режим Insert |
||
╓7┬6┬5┬4┬3┬2┬1┬0╖ |
|
|
|
|
║I│C│N│S│ │ │ │ ║ |
извлеките AL=байт по адресу 0:0418 |
|||
╙╥┴╥┴╥┴╥┴╥┴╥┴╥┴╥╜ бит |
|
|
||
║ ║ ║ |
║ ║ ║ ║ ╚═ |
0: Ctrl (левая клавиша Ctrl) (AL & 01H) 01H=нажата |
||
║ ║ ║ |
║ ║ ║ ╚═══ |
1: Alt (левая клавиша Alt) |
(AL & 02H) 02H=нажата |
|
║ ║ ║ |
║ ║ ╚═════ |
2: SysReq |
(AL & 04H) 40H=SysReq нажата |
|
║ ║ ║ |
║ ╚═══════ |
3: задержка |
(AL & 08H) 08H Ctrl-NumLock (пауза) |
|
║ ║ ║ |
╚═════════ |
4: ScrollLock |
(AL & 10H) 10H=[ScrollLock] нажата |
|
║ ║ ╚═══════════ |
5: NumLock |
(AL & 20H) 20H=[NumLock] нажата |
||
║ ╚═════════════ |
6: CapsLock |
(AL & 40H) 40H=[CapsLock] нажата |
||
╚═══════════════ |
7: Insert |
(AL & 80H) 80H=[Ins] нажата |
Замеч: Биты 0-2 байта 0:0418 определены только для 101-клавишной клавиатуры. Бит 2 используется в PCjr для индикации ситуации "key click".
Некоторые старые программы изменяют биты NumLock и CapsLock (по адресу 0:0417), чтобы установить нужный статус. Это не следует делать, потому что современные клавиатуры снабжены световыми индикаторами, которые тем самым перестанут отражать текущий статус.
См. Клавиатуру AT на предмет более подробной информации.
Байты статуса PCjr по адресу 0:0488 опущены - неинтересно.
╔══════════════════════════════════════════════════════════════════════════════╗ ║ Расширенные клавиши ASCII еще ║
╚══════════════════════════════════════════════════════════════════════════════╝
Если |
INT 16H |
Fn 00H вернула AL=0, то |
AH содержит |
расширенный код клавиши ASCII, |
||||||||||||
как показано |
в этих таблицах. Если функция символьного в/в |
DOS возвращает |
|
|||||||||||||
символ 00H, вы должны вызвать ее еще |
раз, чтобы получить |
расширенный код ASCII. |
||||||||||||||
╓─────────────╥───────────────────╥───────────────────╥──────────────────╖ |
||||||||||||||||
║ |
Key Hex |
Dec ║ |
Key |
Hex Dec ║ |
Key |
Hex Dec ║ |
Key |
Hex |
Dec ║ |
|||||||
╟─────────────╫───────────────────╫───────────────────╫──────────────────╢ |
||||||||||||||||
║ |
F1 |
3b |
59 |
║ |
Shift-F1 |
54 |
84 |
║ |
Ctrl-F1 |
5e |
94 |
║ |
Alt-F1 |
68 |
104 |
║ |
║ |
F2 |
3c |
60 |
║ |
Shift-F2 |
55 |
85 |
║ |
Ctrl-F2 |
5f |
95 |
║ |
Alt-F2 |
69 |
105 |
║ |
║ |
F3 |
3d |
61 |
║ |
Shift-F3 |
56 |
86 |
║ |
Ctrl-F3 |
60 |
96 |
║ |
Alt-F3 |
6a |
106 |
║ |
║ |
F4 |
3e |
62 |
║ |
Shift-F4 |
57 |
87 |
║ |
Ctrl-F4 |
61 |
97 |
║ |
Alt-F4 |
6b |
107 |
║ |
║ |
F5 |
3f |
63 |
║ |
Shift-F5 |
58 |
88 |
║ |
Ctrl-F5 |
62 |
98 |
║ |
Alt-F5 |
6c |
108 |
║ |
║ |
F6 |
40 |
64 |
║ |
Shift-F6 |
59 |
89 |
║ |
Ctrl-F6 |
63 |
99 |
║ |
Alt-F6 |
6d |
109 |
║ |
║ |
F7 |
41 |
65 |
║ |
Shift-F7 |
5a |
90 |
║ |
Ctrl-F7 |
64 |
100 |
║ |
Alt-F7 |
6e |
110 |
║ |
║ |
F8 |
42 |
66 |
║ |
Shift-F8 |
5b |
91 |
║ |
Ctrl-F8 |
65 |
101 |
║ |
Alt-F8 |
6f |
111 |
║ |
║ |
F9 |
43 |
67 |
║ |
Shift-F9 |
5c |
92 |
║ |
Ctrl-F9 |
66 |
102 |
║ |
Alt-F9 |
70 |
112 |
║ |
║ |
F10 |
44 |
68 |
║ |
Shift-F10 |
5d |
93 |
║ |
Ctrl-F10 |
67 |
103 |
║ |
Alt-F10 |
71 |
113 |
║ |
╙─────────────╨───────────────────╨───────────────────╨──────────────────╜
──────────────╥───────────────╥────────────────╥─────────────────╥──────────────
Key Hex Dec ║ Key Hex Dec ║ Key Hex Dec ║ Key Hex Dec ║ Key Hex Dec
──────────────╫───────────────╫────────────────╫─────────────────╫──────────────
Alt-A |
1e |
30 |
║ Alt-N |
31 |
49 |
║ Alt-0 |
81 |
129 |
║ |
down |
|
50 |
80 |
║ |
|
|
Alt-B |
30 |
48 |
║ Alt-O |
18 |
24 |
║ Alt-1 |
78 |
120 |
║ |
left |
|
4b |
75 |
║ ^left |
73 |
115 |
Alt-C |
2e |
46 |
║ Alt-P |
19 |
25 |
║ Alt-2 |
79 |
121 |
║ |
right |
|
4d |
77 |
║ ^right 74 116 |
||
Alt-D |
20 |
32 |
║ Alt-Q |
10 |
16 |
║ Alt-3 |
7a |
122 |
║ |
up |
|
48 |
72 |
║ |
|
|
Alt-E |
12 |
18 |
║ Alt-R |
13 |
19 |
║ Alt-4 |
7b |
123 |
║ |
NUL |
|
03 |
3 |
║ |
|
|
Alt-F |
21 |
33 |
║ Alt-S |
1f |
31 |
║ Alt-5 |
7c |
124 |
║ |
Shft-Tab 0f |
15 |
║ |
|
|
||
Alt-G |
22 |
34 |
║ Alt-T |
14 |
20 |
║ Alt-6 |
7d |
125 |
║ |
Del |
|
53 |
83 |
║ |
|
|
Alt-H |
23 |
35 |
║ Alt-U |
16 |
22 |
║ Alt-7 |
7e |
126 |
║ |
End |
|
4f |
79 |
║ ^End |
75 |
117 |
Alt-I |
17 |
23 |
║ Alt-V |
2f |
47 |
║ Alt-8 |
7f |
127 |
║ |
Home |
|
47 |
71 |
║ ^Home |
77 |
119 |
Alt-J |
24 |
36 |
║ Alt-W |
11 |
17 |
║ Alt-9 |
80 |
128 |
║ |
Ins |
|
52 |
82 |
║ |
|
|
Alt-K |
25 |
37 |
║ Alt-X |
2d |
45 |
║ Alt-- |
82 |
130 |
║ |
PgDn |
|
51 |
81 |
║ ^PgDn |
76 |
118 |
Alt-L |
26 |
38 |
║ Alt-Y |
15 |
21 |
║ Alt-= |
83 |
131 |
║ |
PgUp |
|
49 |
73 |
║ ^PgUp |
84 |
132 |
Alt-M |
32 |
50 |
║ Alt-Z |
2c |
44 |
║ |
|
|
║ |
|
|
|
|
║ ^PrtSc 72 114 |
──────────────╨───────────────╨────────────────╨─────────────────╨──────────────
╔═══════════════════════════════════════════════╗ ║ Расширения 101-клавишной клавиатуры ──── BIOS ║
╓─────────╨─────────╥───────────────────────╥─────────────╨──────────╖ ║ Key Hex Dec ║ Key Hex Dec ║ Key Hex Dec ║
╟───────────────────╫───────────────────────╫────────────────────────╢
║ F11 |
85 |
133 |
║ Alt-Bksp |
|
0e |
14 |
║ Alt- K / |
|
a4 |
164 |
║ |
║ F12 |
86 |
134 |
║ Alt-Enter |
|
1c |
28 |
║ Alt- K * |
|
37 |
55 |
║ |
║ Shft-F11 |
87 |
135 |
║ Alt-Esc |
|
01 |
1 |
║ Alt- K - |
|
4a |
74 |
║ |
║ Shft-F12 |
88 |
136 |
║ Alt-Tab |
|
a5 |
165 |
║ Alt- K + |
|
4e |
78 |
║ |
║ Ctrl-F11 |
89 |
137 |
║ Ctrl-Tab |
|
94 |
148 |
║ Alt- K Enter |
a6 |
166 |
║ |
|
║ Ctrl-F12 |
8a |
138 |
║ |
|
|
|
║ |
|
|
|
║ |
║ Alt-F11 |
8b |
139 |
║ Alt-up |
|
98 |
152 |
║ Ctrl- K / |
|
95 |
149 |
║ |
║ Alt-F12 |
8c |
140 |
║ Alt-down |
|
a0 |
160 |
║ Ctrl- K * |
|
96 |
150 |
║ |
║ Alt-[ |
1a |
26 |
║ Alt-left |
|
9b |
155 |
║ Ctrl- K - |
|
8e |
142 |
║ |
║ Alt-] |
1b |
27 |
║ Alt-right |
|
9d |
157 |
║ Ctrl- K + |
|
90 |
144 |
║ |
║ Alt-; |
27 |
39 |
║ |
|
|
|
║ |
|
|
|
║ |
║ Alt-' |
28 |
40 |
║ Alt-Delete |
|
a3 |
163 |
║ Ctrl- K |
[8] 8d |
141 |
║ |
|
║ Alt-` |
29 |
41 |
║ Alt-End |
|
9f |
159 |
║ Ctrl- K 5 |
[5] 8f |
143 |
║ |
|
║ Alt-\ |
2b |
43 |
║ Alt-Home |
|
97 |
151 |
║ Ctrl- K |
[2] 91 |
145 |
║ |
|
║ Alt-, |
33 |
51 |
║ Alt-Insert |
|
a2 |
162 |
║ Ctrl- K Ins[0] 92 |
146 |
║ |
||
║ Alt-. |
34 |
52 |
║ Alt-PageUp |
|
99 |
153 |
║ Ctrl- K Del[.] 93 |
147 |
║ |
||
║ Alt-/ |
35 |
53 |
║ Alt-PageDown |
a1 |
161 |
║ |
|
|
|
║ |
╙───────────────────╨───────────────────────╨────────────────────────╜