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

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
jkj
Сообщения: 2
Зарегистрирован: 18 сен 2009, 10:37

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

Правильно ли я мыслю? И если правильно, то как очистить "буфер"?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

нет, нужно примерно так:

1)с помощью 60h читаем скан-код клавиши.
2)Если скан-код НЕ совпадает с клавиешей, которую нам надо заблокировать, то передаем управление старому обработчику, иначе - не передаем
It's a long way to the top if you wanna rock'n'roll
jkj
Сообщения: 2
Зарегистрирован: 18 сен 2009, 10:37

Ну вот как я сделал. При нажатии на 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                             
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):pushf
pusha
in al,60h
cmp al,03h
jne re2

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

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

mov al, 20h
out 20h, al
It's a long way to the top if you wanna rock'n'roll
Ответить