Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Обработка прерывания клавиатуры
Посл.ответ Сообщение

Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 сентября 2010 11:38
· Личное сообщение · #1

Написал вот такую простейшую резидентную прогу:
Code:
  1. .286
  2. cseg segment
  3. assume cs:cseg, ds:cseg, ss:cseg, es:cseg
  4. org 100h
  5.  
  6. Begin:
  7.        jmp Init
  8. ; === Процедура обработки 09h прерывания (клавиатура) ===
  9. Int_09h_proc proc
  10.        pusha
  11.         
  12.        mov cl,'k' 
  13.        mov ah,5        
  14.        int 16h 
  15.         
  16.        popa
  17.     
  18.        jmp cs:Int_09h_vect
  19.        iret
  20.                                                     
  21. Int_09h_vect dd ? ;Переменная для хранения адреса 09h прерывания
  22. Int_09h_proc endp
  23.  
  24. Init:
  25.          
  26.        mov ax,3509h
  27.        int 21h       ;Получим и сохраним адрес (вектор) 09h прерывания
  28.        mov word ptr Int_09h_vect,bx ;Вначале младшее слово (смещение)...
  29.        mov word ptr Int_09h_vect+2,es        ;Затем старшее (сегмент)
  30.  
  31.        mov ax,2509h
  32.        mov dx,offset Int_09h_proc
  33.        int 21h       ;"Повесим" нашу процедуру на 09h прерывание
  34.          
  35.        mov ah,9
  36.        mov dx,offset Mess_hello
  37.        int 21h
  38.  
  39.        mov dx,offset Init
  40.        int 27h       ;Оставим программу резидентной в памяти.
  41.  
  42. Mess_hello db 'Program load$'
  43.  
  44. cseg ends
  45. end Begin

Возникло 2 проблемы. По нажатию клавиши на клавиатуре например клавишу d, на экране появляется kdk.Во первых k печатается 2 раза, но я понял из-за чего это происходит, так как мой обработчик реагирует когда я нажимаю клавишу , и когда я ее отпускаю. С этим я думаю разберусь, нужно просто проверку сделать, но вот как сделать , что бы что бы не печаталась d я не понимаю, она печатается из-за того что мы передаем управление старому обработчику, но если его не передавать, то вообще не чего происходить не будет. Не могли бы вы подсказать, как сделать что бы не печаталась нажатая клавиша?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 08 сентября 2010 12:29
· Личное сообщение · #2

www.google.com.ua/search?sourceid=chrome&ie=UTF-8&q=%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%B0+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8+09h+%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F+(%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D0%B0%D1%82%D1%83%D1%80%D0%B0)

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 сентября 2010 13:20
· Личное сообщение · #3

VodoleY спасибо, но во всех найденных примерах такого обработчика, все сводится к проверке скан кода , и последующей передачи управления оригинальному обработчику



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 08 сентября 2010 13:28
· Личное сообщение · #4

sanek-lp ты какбы чего добиваешся? перехват прерывания он на то и перехват, что если ты не передашь обратно вызов ТЫ ЗАХВАТЫВАЕШЬ просто все введенные символ , другими словами до других прог ниче недоходит, КОМП на клаву больше не реагирует

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 сентября 2010 13:35
· Личное сообщение · #5

VodoleY я добиваюсь того, что бы по нажатию клавиши, выводился заданный мной символ, и надо сделать так что бы не передавать управление обратно




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 08 сентября 2010 13:38 · Поправил: OKOB
· Личное сообщение · #6

sanek-lp пишет:
и последующей передачи управления оригинальному обработчику


а как ты хотел? Int 9 - это аппаратное прерывание (IRQ1 - KEYBOARD DATA READY) работающее с контроллером прерываний с кольцевым буфером клавиатуры и т.д. и т.п. давай не возвращай обработчику, но тогда сам сделай в своем все что необходимо для обработчика аппаратного прерывания

shackmaster.narod.ru/tsr.htm

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 08 сентября 2010 19:26
· Личное сообщение · #7

а не проще ли будет в перехватчике послать в нужный порт сообщение, об нажатой клавиши и вернуть управление прежнему обработчику ?




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 09 сентября 2010 04:35
· Личное сообщение · #8

sanek-lp пишет:
как сделать что бы не печаталась нажатая клавиша


1) нужно на входе вашего обработчика подготовить стек (адрес возврата, флаги) для возврата из старого обработчика командой IRET снова в ваш обработчик (ну конечно же не на начало :s12.
2) отдать управление старому обработчику для работы с аппаратурой.
3) получив управление обратно извлечь из кольцевого буфера скан код нажатой клавиши (по отпусканию) и скоректировать указатель головы буфера (или поместить в буфер скан-код другой клавиши - например "к").

4) не лениться 5ka.su/ref/informatika/2_object60411.html

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 1.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 сентября 2010 20:59
· Личное сообщение · #9

все, я разобрался.. спасибо всем большое, за то что ответили


 eXeL@B —› Программирование —› Обработка прерывания клавиатуры
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати