Я не знаю алгоритма. Просто я скопировал его из другого проекта, поэтому код представляется AS IS, на страх, фобии и риск всех, кто копирует этот чудо-алгоритм.
§ Основная программа
Первичная настройка
moval, $A8
call kb_cmd ; Отослать команду A8
call kb_read
moval, $20
call kb_cmd ; Отослать команду 20
call kb_read ; Полученный результат сохранить
pushax
moval, $60
call kb_cmd ; Отослать команду 60
popax
oral, 3
call kb_write ; Результат команды 20, установить 2 младших бита
moval, $D4
call kb_cmd ; Команда для разрешения PS/2
moval, $F4
call kb_write ; Запись F4 и чтение
call kb_read
ret
§ Обработчик прырываний
Вызывается через IRQ#C.
moval, $AD; Блокировка клавиатуры
call kb_cmd
call kb_read ; Считывание данных
; mov [mouse_btn], al
call kb_read ; Сдвиг по X
; mov [mouse_dx], al
call kb_read ; Сдвиг по Y
; mov [mouse_dy], al
moval, $AE; Разблокировать клавиатуру
call kb_cmd
§ Процедуры
Эти процедуры необходимы для чтения и записи данных и команд в PS/2 порт.
; Ожидание ответа от мыши #1
kb_wait:
movcx, 4096
pushax
@@:inal, $64
andal, ah
loopnz @b
popax
ret
; Ожидание ответа от мыши #2
kb_wait2:
movcx, 4096*8
pushax
@@:inal, $64
andal, 1
loopz @b
popax
ret
; Отправка команды
kb_cmd:
movah, 2
call kb_wait
out$64, al
call kb_wait
ret
; Запись данных
kb_write:
movah, $20
call kb_wait ; Ожидание готовности
pushax
inal, $60; Чтение данных из порта (не имеет значения)