снова она - Клавиатура

Тема в разделе "WASM.ELECTRONICS", создана пользователем Vic, 20 май 2008.

  1. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    Доброе время суток =)
    не сказать что очень компетентен в данном вопросе, так что если есть ошибки и не точности прошу поправить =)
    Собственно вопрос : если до того как стандартный код прерывания от клавиатуры обработает значения регистров контроллера клавиатуры, это значение считает посторонний код (именно считает и никаких изменений) то после возврата управления коду прерывания, он сможет так же получить эти значения и корректно обработать прерывание, или они (значения регистров контроллера) обновляются ??? т.е что обновляются это конечно понятно =)) только вот если действия произойдут в указанном порядке стандартное прерывание выполниться как и без постороннего кода??
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я не пробовал, но судя по тому, что в ДОСе на прерывание клавы вешали дофигища цепочечных обработчиков, которым тоже был интересен скан-код клавишы, то, скорее всего, его можно считывать вплоть до EOI.

    Если я не прав, поправьте)
     
  3. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Думаю, врядли. Если что то и получится, то не будет корректным решением.
    Установленный 0-й бит в порту 64h, свидетельствует о том, что порт данных содержит данные.
    Как я думаю, ты можешь считать данные из порта данных (60h) без какого либо вредительства, но котроллер может заготовить в своем буфере для передачи несколько байт данных, например, сканкоды правого шифта, стрелки и т.д. два байта и более. Что бы контроллер клавы выложил следующий байт в порт, необходимо передернуть блокировку, 7-й бит в управляющем порту (61h). После передергивания - снова анализ бита 0 в порту 64h. Т.е. передергивание бита блокировки своего рода квитирование приема данных от контр. клавы обработчиком прерывания.
    Да, в DOSе много чего вешалось на 9-й вектор. Но работать совместно с обработчиком прерываний не получится. В частности, я когда то делал резидент, который "корректировал" ASCI-коды. Но делал он это уже непосредственно в буфере клавы, что в сегменте данных BIOS. Т.е. управление по int 09h передавалось на мой обработчик, который тут же передавал упраление на стандартный обработчик, а после того как он обработает - управление снова попадало ко мне, тогда я лез в буфер и проверял его содержимое. Но это в DOSе. Под другими осями так низко спускаться не приходилось.
     
  4. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    Barbos, заглянешь на форум вечером, есть вопросы по написанному но сначала хочу еще разок прочесть инф-ю в книге? (чтобы по возможности не спрашивать глупостей=)
     
  5. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    меня можно найти в аське
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Barbos
    Для продвинутых контролеров была команда "Fetch" - она считывала код, оставляя все нетронутым для "других". Я так понимаю речь именно про это. Она для этого и была сделана, чтобы делать цепочку обработчиков - логгеры например.
     
  7. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    В 60-м порту содержится код последней нажатой клавиши и насколько я помню, его значение не меняется до следующего вызова IRQ1. Многие резиденты, например русификаторы, садятся перед оригинальным обработчиком и ничего, всё работает. Необходимо только помнить, что постоянно действующие обработчики прерываний не должны выполняться слишком долго чтобы не было проблем.
     
  8. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    я кодил под стандартный.
    код последней нажатой клавиши может быть несколько байт. Щас все в деталях не помню, но например, нажатие на стрелочку - 8042 выдает префикс расширения, код Shift, еще что то, причем что - зависит от состояния NumLock. Там набирается как минимум 4 байта. Вобщем, считав один байт из 60h - рановато делать какие либо выводы.
    см. архив выше, резидент тоже садится перед стандартным обработчиком, но прежде чем что то делать вызывает стандартный. "руссификация" происходит именно в буфере BIOS.

    Еще могу поделиться собственным обработчиком клавы. Код для защищенного режима, 32 бита, компиляция MASM 6.1a, глюков пока не замечал.
    Код (Text):
    1. Align256           macro   ;выравнивание на границу 256 байт
    2.     if (($ - @CurSeg) mod 256) ne 0
    3.                    org (($ - @CurSeg) and (not 255))+256
    4.     endif
    5.                    endm
    6.  
    7.  KbrdData           segment
    8. ;буфер клавиатуры
    9. ;каждый код символа в буфере представлен в виде двух байт, первый - сканкод, второй - ASCII
    10.                    Align256
    11.     KbrdBuff db 256 dup (?)    ;непосредственно буфер
    12.     BegKB    db 0              ;голова (указатели внутри буфера)
    13.     EndKB    db 0              ;хвост
    14.  
    15.  
    16.  KbrdData          ends
    17.  KbrdCode          segment
    18.  
    19. KbrdHandler        proc far
    20.  
    21.                    push EAX
    22.                    in AL,64h
    23.                    test AL,1     ;есть ли в выходном буфере 8042 данные
    24.                    jz short @@popEAX ;переход, если в буфере пусто
    25.                    push DS       ;сохраняем используемые регистры
    26.                    push EBX
    27.                    push EDX
    28.  
    29.                    mov AX,selDataKrn  ;загрузить селектор сегмента данных
    30.                    mov DS,AX
    31.  
    32.               ;получаем смещение байта, начиная с которого будем складывать коды
    33.                    movzx EBX,byte ptr EndKB
    34.                    add EBX,offset KbrdBuff
    35.     @@ReadKB:
    36.                    in AL,60h            ;читаем скан код
    37.  
    38.                    call KbrdInterpreter ;получение ASCII-кода по сканкоду
    39.                                  ;вход: AL - сканкод
    40.                                  ;выход: carry, тогда AH - ASCII, AL - сканкод
    41.                                  ;    not carry - сканкоду соответствующего ASCII нет
    42.                    jnc @@RSBK    
    43.                    mov word ptr [EBX],AX ;кладем в буфер
    44.                    add EndKB,2           ;подвигаем "хвост"
    45.     @@RSBK:
    46.     ;передернуть блокировку клавы
    47.                    in AL,61h
    48.                    mov AH,AL
    49.                    or AL,80h
    50.                    out 61h,AL
    51.                    mov AL,AH
    52.                    out 61h,AL
    53.     ;если в буфере есть еще что то, то повторяем чтение
    54.                    in AL,64h
    55.                    test AL,1
    56.                    jz short @@BufEmpt
    57.                    add BL,2
    58.                    jmp short @@ReadKB
    59.     @@BufEmpt:
    60.                    pop EDX
    61.                    pop EBX
    62.                    pop DS
    63.     @@popEAX:
    64.                    mov AL,20h ;неспецифическое окончание прерывания
    65.                    out 20h,AL
    66.                    pop EAX
    67.                    iretd
    68.  KbrdHandler       endp
    69.  KbrdCode          ends
    И, на закуску, пару манов, которых мне хватило.
     
  9. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    файлик прикрепляться не захотел. Вот версия в инете
    http://www.csd.uoc.gr/~hy325/spring-2006/docs/8042.pdf