Страница 1 из 1

Блокировка клавиши. Перехват 09h. Порты.

Добавлено: 18 сен 2009, 12:46
jkj
Необходимо заблокирывать клавишу в перехваченном прерывании 09h, делая это на уровне портов.
В моем представлении это выглядит так:
1)с помощью 60h читаем скан-код клавиши.
2)Если скан-код совпадает с клавиешей, которую нам надо заблокировать очищаем "буфер" и возвращаем управление старому обработчику.
3)Если не совпадает сразу же возвращаем управление старому обработчику.

Правильно ли я мыслю? И если правильно, то как очистить "буфер"?

Re: Блокировка клавиши. Перехват 09h. Порты.

Добавлено: 18 сен 2009, 13:24
somewhere
нет, нужно примерно так:

1)с помощью 60h читаем скан-код клавиши.
2)Если скан-код НЕ совпадает с клавиешей, которую нам надо заблокировать, то передаем управление старому обработчику, иначе - не передаем

Re: Блокировка клавиши. Перехват 09h. Порты.

Добавлено: 18 сен 2009, 20:44
jkj
Ну вот как я сделал. При нажатии на 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                             

Re: Блокировка клавиши. Перехват 09h. Порты.

Добавлено: 18 сен 2009, 22:17
somewhere
&quot писал(а):pushf
pusha
in al,60h
cmp al,03h
jne re2

iret
Во первых перед IRET не были сняты все регистры и флаги. Во вторых если не вызывается стандартный обработчик, то нужно сообщать о завершении прерывания цепочкой команд

Код: Выделить всё

mov al, 20h
out 20h, al