Необходимо заблокирывать клавишу в перехваченном прерывании 09h, делая это на уровне портов.
В моем представлении это выглядит так:
1)с помощью 60h читаем скан-код клавиши.
2)Если скан-код совпадает с клавиешей, которую нам надо заблокировать очищаем "буфер" и возвращаем управление старому обработчику.
3)Если не совпадает сразу же возвращаем управление старому обработчику.
Правильно ли я мыслю? И если правильно, то как очистить "буфер"?
Блокировка клавиши. Перехват 09h. Порты.
Модератор: Andy
нет, нужно примерно так:
1)с помощью 60h читаем скан-код клавиши.
2)Если скан-код НЕ совпадает с клавиешей, которую нам надо заблокировать, то передаем управление старому обработчику, иначе - не передаем
1)с помощью 60h читаем скан-код клавиши.
2)Если скан-код НЕ совпадает с клавиешей, которую нам надо заблокировать, то передаем управление старому обработчику, иначе - не передаем
It's a long way to the top if you wanna rock'n'roll
Ну вот как я сделал. При нажатии на 2, идет сбой.
Код: Выделить всё
.model tiny
.code
.186
org 2Ch
envseg dw ?
org 100h
begin:
old_int09h:
jmp short initialize
dw 0
int09h_handler proc far
pushf
pusha
in al,60h
cmp al,03h
jne re2
iret
re2:
popa
popf
jmp dword ptr cs :o ld_int09h
int09h_handler endp
initialize proc near
mov ax,3509h
int 21h
mov word ptr old_int09h,bx
mov word ptr old_int09h+2,es
mov ax,2509h
mov dx,offset int09h_handler
int 21h
mov ah,49h
mov es,word ptr envseg
int 21h
mov dx,offset initialize
int 27h
initialize endp
end begin
Во первых перед IRET не были сняты все регистры и флаги. Во вторых если не вызывается стандартный обработчик, то нужно сообщать о завершении прерывания цепочкой команд" писал(а):pushf
pusha
in al,60h
cmp al,03h
jne re2
iret
Код: Выделить всё
mov al, 20h
out 20h, al
It's a long way to the top if you wanna rock'n'roll