§ Алгоритм

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

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

Первичная настройка
    mov     al, $A8
    call    kb_cmd          ; Отослать команду A8
    call    kb_read
    mov     al, $20
    call    kb_cmd          ; Отослать команду 20
    call    kb_read         ; Полученный результат сохранить
    push    ax
    mov     al, $60
    call    kb_cmd          ; Отослать команду 60
    pop     ax
    or      al, 3
    call    kb_write        ; Результат команды 20, установить 2 младших бита
    mov     al, $D4
    call    kb_cmd          ; Команда для разрешения PS/2
    mov     al, $F4
    call    kb_write        ; Запись F4 и чтение
    call    kb_read
    ret

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

Вызывается через IRQ#C.
    mov     al, $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
    mov     al, $AE                ; Разблокировать клавиатуру
    call    kb_cmd

§ Процедуры

Эти процедуры необходимы для чтения и записи данных и команд в PS/2 порт.
; Ожидание ответа от мыши #1
kb_wait:

    mov     cx, 4096
    push    ax
@@: in      al, $64
    and     al, ah
    loopnz  @b
    pop     ax
    ret

; Ожидание ответа от мыши #2
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