таємо з порту даних клавіатури скан-код клавіші
cmp al, 1Eh ; Якщо це [А], то працюємо далі
jz @ @ ok
@ @ Exit: es ds
popa
jmp dword ptr cs: [old_09h] ; в старий обробник без повернення
@ @ ok:
mov ax, 40h
mov es, ax
mov al, [es: 17h] ; Отримаємо перший байт прапорів стану клавіатури
test al, 08h ; Клавіша Alt натиснута?
je @ @ Exit ; Ні, перейдемо в системний обробник
sti; Дозволимо апаратні переривання
mov [fl_active], 0 ; Заборонимо подальшу перевірку натискання клавіш
mov [active], 1bx, [cs: Deler] DIV64 ; Виклик процедури розподілу при ds = cs і es = 40h
cli; Заборонимо апаратні переривання
in al, 61h ; Дозволимо подальшу роботу контролеру клавіатури
or al, 80h61h, alal, 7fh61h, al al, 20h ; Пошлемо в контролер команду EOI
out 20h, al
pop es ds; Відновимо регістри і вийдемо з переривання
popa_09h endp: ax, 0c800h; перевірка на наявність в пам'яті
int 2fhal, 0ffhinstalldx, 8888hinstallax, [cs: 82h]
cmp ax, 'u /' deinstall
mov ah, 9dx, offset message 21h
jne exit
перевірка на off
deinstall: ax, 0c803h2fhexit: ah, 09hdx, offset Mes221h ah, 35h ; AH містить номер функції (це зрозуміло)
mov al, 09h ; AL вказує номер переривання, адресу (або вектор)
; якого потрібно отримати
int 21h; Тепер в ES: BX адресу (вектор) переривання
(ES - сегмент, BX - зміщення)
mov [word ptr cs: old_09h], bx
mov [word ptr cs: old_09h +2], es ax, 2509h
mov dx, offset new_09h; DX повинен вказувати на наш обробник
int 21h
mov ah, 35h ; AH містить номер функції (це зрозуміло)
mov al, 2fh ; AL вказує номер переривання, адресу (або вектор)
; якого потрібно отримати
int 21h; Тепер в ES: BX адресу (вектор) переривання
; (E...