Мегаобучалка Главная | О нас | Обратная связь


Анализ и преобразование скэн-кода



2018-06-29 677 Обсуждений (0)
Анализ и преобразование скэн-кода 0.00 из 5.00 0 оценок




Действия BIOS ISR при нажатии и отпускании одной и той же клавиши различны. Клавиши в зависимости от алгоритма обработки их скэн-кода можно разделить на:

1. шифт-клавиши (Right-Shift, Left-Shift, Alt, Ctrl);

2. триггерные клавиши (NumLock, ScrollLock, CapsLock);

3. клавиши с буферизацией расширенного кода;

4. специальные клавиши (клавиша PrnScr, комбинация Alt-Ctrl-Del, комбинация Ctrl-C (Ctrl-Break)).

За каждой шифт- или триггерной клавишей закреплен свой бит в ячейках памяти по адресам 40: 17h и 40: 18h (табл. 4.1). При каждом нажатии или отпускании шифт-клавиши ISR BIOS инвертирует соответствующий бит. Таким образом, текущее состояние бита шифт-клавиши говорит о том, нажата она в данный момент или отпущена. За триггерными кла­вишами закреплены два бита: один из них инвертируется только при нажатии клавиши ("фиксирует" состояние "Вкл/Выкл"), другой - при нажатии и отпускании, отслеживая текущее состояние клавиши.

Текущее состояние шифт- и тригтерных клавиш используется BIOS-обработчиком прерывания от клавиатуры при определении правил преобразования скэн-кодов от других клавиш. Большинство клавиш и их комбинаций с шифт-клавишами - это клавиши с буферизацией расширенного кода: при их нажатии в специальный буфер памяти помещается двухбайтовый код, называемый BIOS-кодом клавиши. Младший байт этого кода равен ASCII-коду символа, либо нулю. Стар­ший байт равен скэн-коду клавиатуры, либо так называемому расширенному скэн-коду. Комбинация "ASCII-код/ скэн-код клавиатуры" генерируется в следующих случаях:

- если нажата клавиша клавиатуры, помеченная символом, входящим в ASCII-таблицу (называемая далее ASCII-клавишей). Так как прописные и строчные буквы имеют разный ASCII-код, при генерации BIOS-кода учитывается текущее состояние триггерной клавиши CapsLock и клавиши Shift.

- если нажаты некоторые из ASCII-клавиш в комбинации с нажатой и не отпущенной клавишей Ctrl, а также при нажатии клавиш Backspace, ENTER (Ввод), Tab и Esc (Ключ). В этом случае младший байт BIOS-кода клавиши равен одному из управляющих ASCII-кодов. Это ASCII-коды со значениями 00 - 31, которые не входят в число печатаемых символов, а используются для управления периферийными устройствами. Например, нажатие клавиши ENTER порождает управляющий символ Carriage Return (Возврат каретки), нажатие клавиши Tab порождает управляющий символ горизонтальной табуляции, комбинация Ctrl-L - управляющий символ Form Feed (Перевод формы), комбинация Ctrl-B - управляющий символ Bell (Звонок). Нажатие комбинации Ctrl-M соответствует также управляющему символу Carriage Return, но полный BIOS-код этой клавиши равен 13/50, а в случае нажатия клавиши ENTER - 13/28.

Таблица 4.1. Состояние шифт- и триггерных клавиш

Бит Состояние шифт- и триггерных клавиш
  Байт 40:17h
Нажата и не отпущена клавиша Right Shift
Нажата и не отпущена клавиша Left Shift
Нажата и не отпущена клавиша Ctrl
Нажата и не отпущена клавиша Alt
Зафиксирован скроллинг экрана (ScrollLock - включен)
Включена цифровая клавиатура (NumLock - включен)
Зафиксирован верхний регистр (CapsLock - включен)
Включен режим вставки (хотя клавиша Ins не является триггерной, BIOS-обработчик фиксирует каждое ее нажатие, а код клавиши помещается еще и в буфер клавиатуры)
  Байт40:18h
Нажата и не отпущена клавиша Left Ctrl
Нажата и не отпущена клавиша Left Alt
Нажата клавиша System Request (System)
Включен режим Pause(Ctrl-NumLock)
Нажата и не отпущена клавиша ScrollLock
Нажата и не отпущена клавиша NumLock
Нажата и не отпущена клавиша CapsLock
Нажата и не отпущена клавиша Ins

 

Двухбайтовый BIOS-код вида “0 / расширенный скэн-код” генерируется и записывается в буфер клавиатуры при нажатии клавиш Fl - F12, Ins, Del, клавиш управления курсором Home, Up, PgUp, Left, Right, End, Down, PgDn и их комбинации с клавишами Alt, Ctrl, Shift, а также при нажатии комбинации Alt-ASCII-клавиша. Значение расширенного скэн-кода определяется технической документацией BIOS. Правила BIOS таковы, что расширенный скэн-код и скэн-код от клавиатуры не совпадают.

Некоторые нажатия клавиш обрабатываются ISR BIOS особым образом. К их числу относятся:

1) клавиша PrnScr, при нажатии которой ISR BIOS выполняет программное прерывание 5;

2) комбинация Alt-Ctrl-Dei, обнаружив такую комбинацию, ISR BIOS передает управление программе начальной загрузки. Эта программа также входит в состав BIOS;

3) комбинация Ctrl-C (Ctrl-Break); ISR BIOS записывает по абсолютному адресу памяти 00471h значение 80h. Оно используется как флаг, сигнализирующий о желании пользователя остановить выполнение текущей программы. Значение этого флага проверяют при своем выполнении функции MS-DOS, работающие с файлами stdin, stdout, stdprn и stdaux.

Особым образом обрабатывается так называемый Alt-ввод. Если нажимается и удерживается нажатой клавиша Alt и на цифровой клавиатуре набираются цифры, то после отпускания клавиши Alt в буфер клавиатуры помещается двухбайтовый код, старший байт которого равен нулю, а младший байт содержит набранный цифрами код. Если набранный код больше 256, младший байт равен остатку от деления набранного кода на 256. Большинство прикладных программ обрабатывают ASCII-коды, сгенерированные простым нажатием клавиши и Alt-вводом одинаково, несмотря на различные старшие байты двухбайтового кода в буфере клавиатуры. Например, при нажатии клавиши 'Z' в буфер клавиатуры записывается "ASCII-код/скэн-код": 90/44, а при нажатии Alt-90 - "ASCII-код/0": 90/0. Alt-ввод очень удобен для ввода ASCII-симво­лов, не имеющих соответствующих клавиш, например симво­лов псевдографики.

 

Буфер клавиатуры

Буфер BIOS для записи кодов клавиш занимает 32 байта оперативной памяти с адреса 40:lEh до 40:3Eh. Запись информации в буфер выполняет ISR BIOS прерывания 9, чтение - функции ISR BIOS прерывания 16h. Буфер клавиатуры рассчитан на 15 нажатий клавиш, генерирующих двухбайтовые коды и поэтому имеет 30 байт для кодов клавиш и еще два дополнительных байта, которые резервируются под двухбайтовый код для клавиши ENTER.

Буфер организуется как кольцевая очередь, доступ к которой осуществляется с помощью указателя «головы» (head pointer), адрес которого 40:1Ah, и указателя «хвоста» (tail pointer), адрес которого 40:1Ch. Указатель "хвоста" задает смещение до слова, где будет записан обработчиком прерывания 9 код буферизуемой клавиши, т.е. первое свободное слово буфера. Указатель "головы" задает смещение слова, которое будет возвращено запросу буфе­ризованного ввода с клавиатуры, сделанного операционной системой или BIOSoм.

При каждом нажатии клавиши, для которой генерируется двухбайтовый код, ISR BIOS прерывания 9,'используя текущее значение указателя "хвоста", записывает в память образованный двухбайтовый код. После этого указатель "хвоста" увеличивается на 2. Если указатель "хвоста" перед доступом к буферу указывает на верхнюю границу буфера (на слово 40:3Eh), указатель после записи в буфер "перепрыгивает" на начало буфера, т.е. ему присваивается значение 40:1Eh. Поэ­тому значение указателя "хвоста" может быть и меньше значения указателя "головы". Это значит, что указатель "хвоста" "перескочил" назад к нижней границе буфера. Когда указатель "хвоста" догонит указатель "головы", наступит пере­полнение буфера. В этом случае указатель "хвоста" задает смещение до "холостой" позиции. Каждое новое нажатие клавиши игнорируется BIOS-обработчиком; код клавиши не помещается в буфер, и звучит сигнал динамика.

Указатель "головы" используется BIOS-обработчиком прерывания 16h, которое вызывается непосредственно из приклад­ной программы или функциями MS-DOS ввода с клавиатуры. Если выполняется чтение буфера с разрушением информации (функция АН = 0 прерывания 16h, ISR читает два байта памяти по адресу, смещение которого задает указатель "голо­вы", а сегмент равен 40h. Затем ISR прерывания 16h увеличи­вает (продвигает) указатель "головы" на 2. Если значения ука­зателей "головы" и "хвоста" равны между собой, буфер пуст. В этом случае ISR прерывания 16 выполняет бесконечный цикл ожидания, условием выхода из которого будет неравенство указателей. При нажатии клавиши, генерирующей двухбайтовый код, этот цикл будет прерван BIOS-обработчиком прерывания 9. В результате указатель "головы" продвинется на 2. После завершения ISR BIOS прерывания 9 возобновится выполнение ISR BIOS прерывания 16h. Так как буфер уже не пуст, произойдет выход из цикла и передача в точку вызова прочитанного в буфере двухбайтового кода.Если выполняется чтение буфера без разрушения информации (функция АН = 1 прерывания 16h), продвижение указателя "головы" не происходит, но прочитанный по этому указателю код передается в точку вызова, если только буфер не пуст. Если буфер пуст, ISR прерывания 16h не выполняет цикл ожидания. Вместо этого флаг переноса CF устанавливается в 1, и обработчик завершает свою работу.


На рис. 4.1. приведены примеры пустого буфера клавиатуры и буфера после ввода с клавиатуры строки "TEST", нажатия клавиш Left и F1 при условии, что текущая программа не выполняла в этот момент ввод с клавиатуры.

Рис. 4.1. Организация буфера клавиатуры:

а - пустой буфер (значения указателей "готовы" и "хвоста" равны); б- тот же буфер после набора на клавиатуре строки TEST, нажатия специальных клавиш Left и F1 (текущая программа не выполняет ввод информации и указатель "головы" не продвигается)

 

Буфер клавиатуры - это классический пример использования кольцевого буфера для организации асинхронного взаимодействия двух программ по схеме "производитель-потребитель". Одна из программ (ISR BIOS прерывания 9) "производит" информацию или, как говорят, является процессом-производителем. Исполняемая программа через функцию АН= 00h прерывания 16h BIOS "потребляет" информацию или является процессом-потребителем. Асинхронность взаимодействия означает, что запись в буфер новой информации и чтение из него происходят в случайные, не связанные между собой моменты времени. Так как производитель постоянно анализирует наличие переполнения буфера, не происходит переопределения не прочитанных еще потребителем кодов клавиатуры. Другими словами, при переполнении буфера производитель блокируется до тех пор, пока потребитель не прочитает одно или несколько слов из буфера. Если же буфер пуст и выполняется попытка чтения информации, функция АН = 00h прерывания 16h BIOS переходит к бесконечному циклу, условием которого является неравенство между собой указателей "головы" и "хвоста". Фактически текущая программа, выполняющая ввод с клавиатуры, блокируется, не давая "потребить" несуществующую еще информацию.

 



2018-06-29 677 Обсуждений (0)
Анализ и преобразование скэн-кода 0.00 из 5.00 0 оценок









Обсуждение в статье: Анализ и преобразование скэн-кода

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (677)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)