не делает.
После запуска программы выяснилось, что на клавиши навигации (стрелок вверх и вниз) новый обработчик неправильно реагирует и активизируется 2 раза.
В остальном все работает правильно. Подскажите, в чем ошибка?
.model tiny
.code
ORG 100h
main:
jmp Init
New_09h proc far
push ax dx ds es
mov ax,cs ;DS и ES адресуют данные резидента
mov ds,ax
mov es,ax
in al,60H ;читать ключ
cmp al,1Eh ;Если нажата клавиша 'A'
je do_pop ;да, активизировать popup
pop es ds dx ax
jmp dword ptr cs:[Old_09h]
do_pop: ;код отработки нажатия клавиши 'A'
in al,61H ;взять значениe порта упр. клавиатурой
mov ah,al ;сохранить его
or al,80h ;установить бит разрешения для клавы
out 61H,al ;и вывести его в управляющий порт
xchg ah,al ;извлечь исходное значение порта
out 61H,al ;и записать его обратно
mov al,20H ;послать сигнал "конец прерывания"
out 20H,al ;контроллеру прерываний 8259
pushf
call dword ptr cs:[Old_09h]
pop es ds dx ax
iret ;возврат из обработчика прерываний
New_09h endp
Old_09h DD ? ;определение ячейки памяти для хранения адреса системного обработчик
Init:
;выводим сообщение о загрузке резидента в память
mov ah,09h
mov dx,offset InitMsg
int 21h
;установим наш обработчик на прерывание 09h
mov ax,3509h
int 21h
mov word ptr Old_09h,bx
mov word ptr Old_09h+2,es
;запись стартового обработчика в вектор прерываний
mov ax,2509h
mov dx,offset New_09h
int 21h
;возврат в DOS, оставшись резидентным
mov dx,offset Init
int 27h
InitMsg DB "Resident installed in memory!",13,10,"$"
end main
В коде не доконца разобрался, надо думать. Есть моя программа 2001г. показывающая скан-коды клавиш. Может она чем поможет?
У стрелок двухбайтовый сканкод e0 75/72. Ты скорее всего съедаешь только вторую часть, тем самым ломая стейтмашину. Кроме этого ты отправляешь ACK, а потом вызываешь предыдущий обработчик, который тоже отправляет ACK. Это дополнительно всё ломает.
Обсуждают сегодня