Лисья Нора

Оглавление


§ Алгоритм

Я не знаю алгоритма. Просто я скопировал его из другого проекта, поэтому код представляется 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