§ Алгоритм
Я не знаю алгоритма. Просто я скопировал его из другого проекта, поэтому код представляется AS IS, на страх, фобии и риск всех, кто копирует этот чудо-алгоритм.
§ Основная программа
Первичная настройка
1 mov al, $A8
2 call kb_cmd
3 call kb_read
4 mov al, $20
5 call kb_cmd
6 call kb_read
7 push ax
8 mov al, $60
9 call kb_cmd
10 pop ax
11 or al, 3
12 call kb_write
13 mov al, $D4
14 call kb_cmd
15 mov al, $F4
16 call kb_write
17 call kb_read
18 ret
§ Обработчик прырываний
Вызывается через IRQ#C.
1 mov al, $AD
2 call kb_cmd
3 call kb_read
4
5 call kb_read
6
7 call kb_read
8
9 mov al, $AE
10 call kb_cmd
§ Процедуры
Эти процедуры необходимы для чтения и записи данных и команд в PS/2 порт.
1
2kb_wait:
3
4 mov cx, 4096
5 push ax
6@@: in al, $64
7 and al, ah
8 loopnz @b
9 pop ax
10 ret
11
12
13kb_wait2:
14
15 mov cx, 4096*8
16 push ax
17@@: in al, $64
18 and al, 1
19 loopz @b
20 pop ax
21 ret
22
23
24kb_cmd:
25
26 mov ah, 2
27 call kb_wait
28 out $64, al
29 call kb_wait
30 ret
31
32
33kb_write:
34
35 mov ah, $20
36 call kb_wait
37 push ax
38 in al, $60
39 mov ah, $02
40 call kb_wait
41 pop ax
42 out $60, al
43 call kb_wait
44 call kb_wait2
45 ret
46
47
48kb_read:
49
50 call kb_wait2
51 mov cx, 16
52@@: loop @b
53 in al, $60
54 ret