09hdx, offset mes21hds dx ax
old_2fh dd? ; Старі адреси векторів переривань
old_09h dd?
; Рядок, яка буде виводиться
Mes db 'Резидент в пам'яті!', 13,10, '$'
Mes1 db 'Резидент вивантажений!', 13,10, '$'
Mes2 db 'Резидент встановлено!', 13,10, '$'
new_2fh endp
; кінець обробника
Operand DQ 0
Deler Dw 0DQ 0DW 0DB 0 DB 0DB 0; прапор активації резидента
fl_active db 0; прапор активності клавіатури
Error db 0
buf dd?
Neg64 proc; Cмена знака 64 розрядного числа
; bx-адреса числа
; переклад за схемою! A +1
push ds csds [word ptr bx +6] [word ptr bx +4] [word ptr bx +2] [word ptr bx] [word ptr bx], 1 [word ptr bx +2 ], 0 [word ptr bx +4], 0 [word ptr bx +6], 0ds
Neg64 endp
---------
Div64 proc; поділ 64 розрядного числа
cmp bx, 0; якщо нульовий дільник
jne ggood
mov [cs: Error], 1; то помилка: ds csds [SignR], 1 [SignC], 1bx, bx; знак делітеляpositive1 [SignR]; враховуємо якщо-bx: si, [word ptr Operand +6]; знак діленого si, si
jns positive2; враховуємо якщо мінус
neg [SignR] [SignC] bxbx, offset OperandNeg64bx: dx, dx; деленіеax, [word ptr Operand +6] bx [word ptr result +6], axax, [word ptr Operand +4 ] bx [word ptr result +4], axax, [word ptr Operand +2] bx [word ptr result +2], axax, [word ptr Operand] bx [word ptr result], ax [Rem], dx p>
cmp [word ptr result +6], 8000h; якщо отримали довше максимального полодітельного
jne welldon [word ptr result +4], 0000hwelldon [word ptr result +2], 0000hwelldon [word ptr result], 0000hwelldon [cs: error], 1; то помилка: [SignC], 1ok1 [Rem]; встановити вірні знаки: [SignC], 1ok2bx, offset operandNeg64: ds64 endp
new_09h proc; Новий обробник переривання 09h
pusha; Збережемо регістри
push ds es
mov ax, csds, ax ; ds = cs [fl_active], 1 ; Проводити перевірку кодів натискання клавіш?
je @ @ work ; Та @ @ Exit ; Ні
@ @ work: ; відфільтровує комбінацію Alt-A
in al, 60h ; Чи...