Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



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



 

Действия 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 (табл. 3.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.

 

 

Табл. 3.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, и обработчик завершает свою работу.


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

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

 

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



Просмотров 817

Эта страница нарушает авторские права




allrefrs.su - 2025 год. Все права принадлежат их авторам!