Obsah

Scan kódy kláves (keyboard scan codes)

Tyhle kódy jsou na portu 60h (0x60) po přerušení od klávesnice IRQ 1.
Při puštění klávesy je kód větší o 128 (80h).

ESC
1
F1
59
F2
60
F3
61
F4
62
F5
63
F6
64
F7
65
F8
66
F9
67
F10
68
F11
87
F12
88
`~
41
1!
2
2@
3
3#
4
4$
5
5%
6
6^
7
7&
8
8*
9
9(
10
0)
11
-_
12
=+
13
BSP
14
NUM
69
/
*53
*
55
-
74
TAB
15
Q
16
W
17
E
18
R
19
T
20
Y
21
U
22
I
23
O
24
P
25
[{
26
]}
27
ENT
28
INS
*82
HOM
*71
PGU
*73
7
71
8
72
9
73
+
78
CPS
58
A
30
S
31
D
32
F
33
G
34
H
35
J
36
K
37
L
38
;:
39
'"
40
\|
43
DEL
*83
END
*79
PGD
*81
4
75
5
76
6
77
LSH
42
Z
44
X
45
C
46
V
47
B
48
N
49
M
50
,
51
.
52
/?
53
RSH
54
U
*72
1
79
2
80
3
81
ENT
*28
CRL
29
WIN
91
ALT
56
\|
86
SP
57
ALT
*56
WIN
92
MNU
93
CRL
*29
L
*75
D
*80
R
*77
0
82
.
83

* před kódem znamená, že předchází kód 224 (0E0h).

Příklad: stisknutí a puštění pravýho ctrl za předpokladu, že IRQ1 je mapovaný na int 21h.

port[0x60] = 224 ; 0E0h
int 0x21
port[0x60] = 29 ; 1Dh
int 0x21
...
port[0x60] = 224 ; 0E0h
int 0x21
port[0x60] = 128 + 29 ; 9Dh
int 0x21

Vzor obsluhy IRQ1

IRQ1:
pushad
 in al, 60h
 ; ...
 mov al, 20h
 out 20h, al
popad
iret

Vzor nastavení LED na klávesnici

; IN: ah = 1 scroll + 2 num + 4 caps
; DESTROY: al
h_kbd_set_leds:
call empty_8042
mov al, 0xED
out 0x60, al
call empty_8042
mov al, ah
out 0x60, al
ret

empty_8042:
call delay
in al, 0x64
test al, 1
jz l_empty_8042_no_output
  call delay
  in al, 0x60
  jmp empty_8042
l_empty_8042_no_output:
test al, 2
jnz empty_8042
ret

delay:
jmp short l_delay_8
l_delay_8:
ret