§ Алгоритм
Я не знаю алгоритма. Просто я скопировал его из другого проекта, поэтому код представляется AS IS, на страх, фобии и риск всех, кто копирует этот чудо-алгоритм.
§ Основная программа
Первичная настройка
mov al, $A8
call kb_cmd
call kb_read
mov al, $20
call kb_cmd
call kb_read
push ax
mov al, $60
call kb_cmd
pop ax
or al, 3
call kb_write
mov al, $D4
call kb_cmd
mov al, $F4
call kb_write
call kb_read
ret
§ Обработчик прырываний
Вызывается через IRQ#C.
mov al, $AD
call kb_cmd
call kb_read
call kb_read
call kb_read
mov al, $AE
call kb_cmd
§ Процедуры
Эти процедуры необходимы для чтения и записи данных и команд в PS/2 порт.
kb_wait:
mov cx, 4096
push ax
@@: in al, $64
and al, ah
loopnz @b
pop ax
ret
kb_wait2:
mov cx, 4096*8
push ax
@@: in al, $64
and al, 1
loopz @b
pop ax
ret
kb_cmd:
mov ah, 2
call kb_wait
out $64, al
call kb_wait
ret
kb_write:
mov ah, $20
call kb_wait
push ax
in al, $60
mov ah, $02
call kb_wait
pop ax
out $60, al
call kb_wait
call kb_wait2
ret
kb_read:
call kb_wait2
mov cx, 16
@@: loop @b
in al, $60
ret