§ Алгоритм

Я не знаю алгоритма. Просто я скопировал его из другого проекта, поэтому код представляется AS IS, на страх, фобии и риск всех, кто копирует этот чудо-алгоритм.

§ Основная программа

Первичная настройка
1    mov     al, $A8
2    call    kb_cmd          ; Отослать команду A8
3    call    kb_read
4    mov     al, $20
5    call    kb_cmd          ; Отослать команду 20
6    call    kb_read         ; Полученный результат сохранить
7    push    ax
8    mov     al, $60
9    call    kb_cmd          ; Отослать команду 60
10    pop     ax
11    or      al, 3
12    call    kb_write        ; Результат команды 20, установить 2 младших бита
13    mov     al, $D4
14    call    kb_cmd          ; Команда для разрешения PS/2
15    mov     al, $F4
16    call    kb_write        ; Запись F4 и чтение
17    call    kb_read
18    ret

§ Обработчик прырываний

Вызывается через IRQ#C.
1    mov     al, $AD                ; Блокировка клавиатуры
2    call    kb_cmd
3    call    kb_read                 ; Считывание данных
4  ; mov     [mouse_btn], al
5    call    kb_read                 ; Сдвиг по X
6  ; mov     [mouse_dx], al
7    call    kb_read                 ; Сдвиг по Y
8  ; mov     [mouse_dy], al
9    mov     al, $AE                ; Разблокировать клавиатуру
10    call    kb_cmd

§ Процедуры

Эти процедуры необходимы для чтения и записи данных и команд в PS/2 порт.
1; Ожидание ответа от мыши #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; Ожидание ответа от мыши #2
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