Меню сайта

Урок 133. Клавиатура

Следующее устройство ввода-вывода, котороемы рассмотрим, —
— — — клавиатура. Клавиатура отделена от ЭВМ иподключено к системе
— — — четырехжильным проводом. Хотя внутриклавиатуры и находится
— — — отдельный микропроцессор, для егопрограммирования нет простого
— — — способа, так что мы оставим эту задачуинженерам фирмы IBM. Мы же
— — — можем заняться информацией, которуюклавиатура посылает в систему.

— — — — — Цепь обслуживания клавиатуры на системнойплате подключена к
— — — системе прерываний. Кадый раз, как этацепь регистрирует нажатие
— — — клавиши, она возбуждает прерывание всистеме. Это прерывание
— — — передает управление обработчику прерыванийот клавиатуры. Эта
— — — процедура получает от клавиатуры данные исохраняет их для
— — — дальнейшего использования. Обработчикпрерываний клавиатуры
— — — обслуживает также специальные случаи,например, перезагрузка
— — — системы (CTL-ALT-DEL) и снятие програмы(CTL-BREAK). Но мы не будем
— — — рассказывать, как это делается, доследующей главы, поскольку все
— — — это обслуживает встроенная системапрограмм BIOS. Пока же осмотрим,
— — — как можно управлять аппаратуройобслуживания клавиатуры.

— — — — — Когда клавиатура посылает сигналпрерывания, он, прежде, чем
— — — попадет в микропроцессор 8088, проходитчерез контроллер прерываний
— — — 8259. Этот контроллер обслуживает системупрерываний IBM PC почти
— — — во всех ее аспектах.

— — — — — Микросхема 8259 может обслужить до восьмипрерывающих
— — — устройств. К линиям прерываний в IBM PCподключен системный таймер,
— — — клавиатура, адаптер асинхронной связи,фиксированный диск
— — — (винчестер), накопитель на гибкихмагнитных дисках и печатающее
— — — устройство. Остальные уровни прерыванийдоступны другим устройствам
— — — ввода-вывода, подключенным к системномуканалу ввода-вывода.
— — — Конструктивно каждое из прерывающихустройств назначено к своему
— — — входу прерывания микросхемы 8259. Входпрерывания, к которому
— — — подключено прерывающее устройство,называется уровнем прерывания
— — — этого устройства. Как мы сейчас увидим,микросхема 8259
— — — упорядочивает приоритеты прерываний всоответствии с уровнем. На
— — — Фиг. 8.3 показаны уровни прерыванийкаждого устройства ЭВМ.

— — — — — Прерывание от каждого устройства можнопо-отдельности
— — — заблокировать или разблокировать.Микросхема 8259 работает точно
— — — так же, как микропроцессор 8088, которыйимеет флаг прерываний,
— — — разрешающий или запрещающий прерывания покомандам STI и CLI. Но
— — — 8259 имеет восемь флагов прерываний — поодному на каждое возможное
— — — прерывающее устройство. Эти флаги содержитрегистр маски прерываний
— — — IMR (Interrupt Mask Register),расположенный в порту по адресу 21H.
— — — Бит 7 соответствует прерыванию 7, бит 6 -прерыванию 6, и так
— — — далее. Если вы установите бит в 1,устройство не может вызвать
— — — прерывание- если же бит сброшен в 0,контроллер прерываний передает
— — — прерывание дальше, микропроцессору 8088.Разумеется, даже если
— — — какое-либо прерывание разблокировано врегистре IMR, прежде чем это
— — — прерывание сможет произойти, необходимотакже сбросить флаг
— — — прерываний в микропроцессоре 8088.

— — — — — В зависимости от уровня прерывания контроллерназначает
— — — приоритеты каждому прерывающемуустройству. Уровень прерывания
— — — определяется аппаратным подключением и неможет быть изменен
— — — программным путем. Прерывание номер 0имеет высший приоритет,
— — — прерывание номер 7 — низший. Если любыедва устройства пытаются
— — — одновременно возбудить прерывание,обслуживается устройство более
— — — высокого приоритета. Обслуживаниеустройства более низкого
— — — приоритета откладывается до тех пор, покане будет обслужено
— — — устройство с более высоким приоритетом.Микросхема 8259
— — — автоматически реализует такое разбиение поприоритетам, но в

— — — — Уровень — — — — — — — — — — — Устройство
— — —————————————————
— — — — — 0 — — — — Каналтаймера 0
— — — — — 1 — — — — Клавиатура
— — — — — 2 — — — — —
— — — — — 3 — — —
— Асинхронныекоммуникации
— — — — — 4 — — — — Упорядоченныеасинхронные коммуникации
— — — — — 5 — — — — Фиксированныйдиск
— — — — — 6 — — — — Дискета
— — — — — 7 — — — — Принтер
— — —————————————————
— — — — — Фиг. 8.3 Уровни прерываний для микросхемы8259

— — — управлении прерываниями должна приниматьучастие и ваша программа-
— — — именно, она должна сообщить контроллеру8259 о том, что она
— — — закончила работу с текущим прервавшимустройством. Такая команда
— — — называется EOI (конец прерывания), онасообщает микросхеме 8259,
— — — что обработка прерывания от устройства снаивысшим приоритетом
— — — закончилась, и теперь вызвать прерывание всистеме может устройство
— — — с более низким приоритетом.

— — — — — Контроллер 8259 также предотвращаетпрерывание микропроцессора
— — — устройством с более низким приоритетом,если система в этот момент
— — — обслуживает прерывание с более высокимприоритетом. Микросхема 8259
— — — запоминает текущее активное прерывание, исчитает, что
— — — микропроцессор обслуживает это прерываниедо тех пор, пока не
— — — получит команду EOI. Микросхема 8259делает это с помощью двух
— — — внутренних регистров. Первый из нихидентифицирует устройства,
— — — которые к настоящему моменту выдали запросна прерывание- этот
— — — регистр называется регистром запросовпрерываний IRR. Другой
— — — регистр следит за текущими обслуживаемымипрерываниями, и
— — — называется регистром обслуживаемыхпрерываний ISR. Если вы забыли
— — — выполнить команду EOI, микропроцессорсможет прерывать только
— — — программы обработки прерываний отустройств с боле высоким
— — — приоритетом. Если вы не выполнили командуEOI после прерывания от
— — — таймера, система попадает в останов. Таккак таймер имеет наивысший
— — — приоритет, отсутствие завершения егопрерывания блокирует
— — — возбуждение всех других прерываний.

— — — — — Контроллер 8259, кроме того, упорядочиваетвсе прерывания. Это
— — — означает, что контроллер заставляетмикропроцессор правильно
— — — выбирать обработчик прерываний. Когдаконтроллер распознает
— — — прерывание, он вынуждвет микропроцессор8088 начинать работу по
— — — адресу, указанному в одном из 256 векторовпрерываний в первом
— — — килобайте памяти. IBM PC отображает восемьуровней прерывания
— — — контроллера 8259 на вектора прерываний от8 до 0FH включительно.
— — — Так, если поступает прерывание отклавиатуры (уровень 1),
— — — начинается выполнение программы по адресуCS:IP, определенному
— — — двойным словом в векторе прерываний 9,лежащему по адресам от 24H
— — — до 27H.

— — — — — Давайте посмотрим, как все это вместепроисходит в IBM PC.
— — — Сначала процедура самопроверки привключении питания (POST)
— — — инициализирует контроллер 8259 ссоответствующей управляющей и
— — — упорядочивающей информацией. В это жевремя процедура POST снимает
— — — маску прерываний от таймера, клавиатуры, атакже прерываний от
— — — дискет в регистре маски прерываниймикросхемы 8259. После
— — — завершения процедуры POST включаетсясистема прерываний по команде
— — — STI. Теперь система готова к приемупрерываний.

— — — — — Вы нажимаете клавишу на клавиатуре.Клавиатура посылает символ
— — — в системную плату, где он записывается врегистр и возбуждает
— — — прерывание уровня 1. Далее начинает работумикросхема 8259. Она
— — — устанавливает бит 1 в регистре IRR,отмечая запрос на прерывание.
— — — Если не установлены ни нулевой, ни первыйбиты регистра ISR,
— — — показывающие обслуживание прерывания сболее высоким приоритетом,
— — — контроллер возбуждает вход прерываниямикропроцессора 8088. Когда
— — — микропроцессор окажется готов к приемупрерывания, он выполнит цикл
— — — подтверждения прерывания. Микропроцессор8088 поместит в стек
— — — текущее содержимое регистра флагов, CS иIP. Контроллер 8259
— — — отвечает на цикл подтверждения прерыванияномером прерывания, в
— — — данном случае это 9- затем контроллер установитравным единице бит
— — — 1 в регистре ISR, показывая, чтопрерывание 1 обслуживается. Тем
— — — временем микропроцессор 8088 загружаетпару регистров CS:IP из

— — ячеек 24H- 27H и начинает работу суказанного в них адреса.

— — — — — Затем микропроцессор выполняет программуобработки прерываний
— — — от клавиатуры. На Фиг. 8.4 показана схемаобработчика прерывания от
— — — клавиатуры. Обратите внимание, что перваякоманда, которую должна
— — — выполнить эта программа, сохраняетсодержимое регистра AX в стеке.
— — — Это делается потому, что программаизменяет содержимое регистра AX.
— — — Если обработчик прерываний не восстановитпервоначальное значение
— — — этого регистра перед возвратом впрерванную программу, возникнет
— — — ошибка выполнения. Это ведь очень трудно -писать верно работающие
— — — программы, если во время их выполнениясодержимое регистров будет
— — — произвольно изменяться другимипрограммами. Если обработчику
— — — прерывания потребуется больше регистров,то он должен все их
— — — сохранить, а затем восстановить.
— — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — 1/1/80 04:05:14
— — — — — — — — — -Фиг. 8.4 — — — Управление клавиатурой — — — — — — — — — — — — — — — — — — — — Page — — — — — — — 1-1

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — -,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — TITLE — -Фиг. 8.4 — Управление клавиатурой

— — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — CODE — — -SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ASSUME -CS:CODE

— — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — KEYBOARD_INTERRUPT — — — — — PROC — — -FAR

— — — — — — — — — — -0000 — 50 — — — — — — — — — — — — — — — — — — -PUSH — — — AX — — — — — — — Сохранение регистра AX
— — — — — — — — — — -0001 — E4 60 — — — — — — — — — — — — — — — — — — — — — — IN — — — — — AL, 60H — — — — — — — Выборка номера клавиши
— — — — — — — — — — -0003 — 50 — — — — — — — — — — — — — — — — — — -PUSH — — — AX — — — — — — — Сохранение номера клавиши
— — — — — — — — — — -0004 — E4 61 — — — — — — — — — — — — — — — — — — — — — — IN — — — — — AL, 61H
— — — — — — — — — — -0006 — 8A E0 — — — — — — — — — — — — — — — — — — — — — — MOV — — — — AH, AL — — — — — — — — Сохранение текущего значения регистра AL
— — — — — — — — — — -0008 — 0C 80 — — — — — — — — — — — — — — — — — — — — — — OR — — — — — AL, 80H
— — — — — — — — — — -000A — E6 61 — — — — — — — — — — — — — — — — — — — — — — OUT — — — — 61H, AL — — — — — — — Сигнал об успешном получении символа
— — — — — — — — — — -000C — 8A C4 — — — — — — — — — — — — — — — — — — — — — — MOV — — — — AL, AH
— — — — — — — — — — -000E — E6 61 — — — — — — — — — — — — — — — — — — — — — — OUT — — — — 61H, AL — — — — — — — Возврат Клавиатуры в нормальный режим
— — — — — — — — — — -0010 — 58 — — — — — — — — — — — — — — — — — — -POP — — — — AX
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — …

— — — — — — — — — — -0011 — B0 20 — — — — — — — — — — — — — — — — — — — — — — MOV — — — — AL, 20H
— — — — — — — — — — -0013 — E6 20 — — — — — — — — — — — — — — — — — — — — — — OUT — — — — 20H, AL — — — — — — — Сигнал об окончании прерывания
— — — — — — — — — — -0015 — 58 — — — — — — — — — — — — — — — — — — -POP — — — — AX — — — — — — — Восстановление регистра AX
— — — — — — — — — — -0016 — CF — — — — — — — — — — — — — — — — — — -IRET — — — — — — — — — — — — Возвращение в пр
ерванную программу
— — — — — — — — — — -0017 — — — — — — — — — — — — — — — — — KEYBOARD_INTERRUPT — — — — — ENDP
— — — — — — — — — — -0017 — — — — — — — — — — — — — — — — — CODE — — -ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — END

— — — — — — — — — — — Фиг. 8.4 Контроль клавиатуры

— — — — — Обработчик прерывания читает код клавиши,так называемый код
— — — сканирования, из порта 60H. Программадоложна «убрать» прерывание,
— — — сообщив устройству ввода-вывода, что онодолжно снять запрос на
— — — прерывание. Программа сбрасываетпрерывание от клавиатуры,
— — — устанавливая бит 7 порта 61H. Это нетолько отменяет запрос на
— — — прерывание, но и сообщает клавиатуре, чтоона может присылать
— — — следующий символ в микропроцессор 8088.Теперь программа прерывания
— — — может обработать код от клавиши.

— — — — — Когда обслуживание прерывания завершено,обработчик прерывания
— — — посылает в микросхему 8259 команду EOI.Она сбрасывает в 0 бит 1 в
— — — регистре ISR, и теперь могут произойтилюбые ожидающие обслуживания
— — — прерывания с меньшими приоритетами.Выполнение команды EOI состоит
— — — в посылке в порт 20H кода 20H. Программаобработки прерывания
— — — восстанавливает содержимое регистра AX,команда IRET
— — — восстанавливает регистры флагов IP, CS, атакже приводит флаги к их
— — — первоначальному виду до прерывания.

— — — — — Точно такая же последовательность событийпроисходит в случае
— — — любого прерывания, исходящего отмикросхемы 8259 и обслуживаемого
— — — микропроцессором 8088. Единственнаяразница заключается в том,
— — — какое именно прерывание возникает. Отэтого изменяется установка
— — — битов в регистрах IRR и ISR, и номервектора прерывания,
— — — выдаваемого микропроцессору 8088.Обработчик прерывания должен все
— — — также сохранять состояние микропроцессорав момент прерывания, а
— — — программа должна выполнить команду EOI вконце обработки
— — — прерывания, или когда определит, чтовыполняемая программа может
— — — принять прерывание меньшего приоритета. Иеще одно предостережение.
— — — Ваша программа обработки прерывания недолжена посылать две команды
— — — EOI. Если выполняющаяся программаобработки прерывания прервала
— — — работу обработчика с меньшим приоритетом,вторая команда EOI
— — — поступит вместо этой команды отобработчика с меньшим приоритетом.
— — — Это может привести к неприемлимымпоследствиям, почему вам и не
— — — следует допускать такого наложения.

— — — — — Итак, мы обработали прерывание отклавиатуры, правильно
— — — установили все биты и выполнили всекоманды. Что же мы получили?
— — — Клавиатура посылает в микропроцессор»коды сканирования». Их
— — — значения отражают расположение клавиш наклавиатуре и не имеют
— — — никакого отношения к символу,изображенному на клавише. Например,
— — — клавише ESC возвращает код сканирования 1,клавиша «1» — код 2, и
— — — так далее. Клавише DEL соответствует кодсканирования 83. Каждая
— — — клавиша имеет свой собственный уникальныйкод сканирования. Так что
— — — данные из порта 60H не могутрассматриваться как символ кода ASCII.
— — — Код сканирования нужно еще перекодироватьв правильный код
— — — символа.

— — — — — Клавиатура передает несколько больше, чемтолько эти 83 кода
— — — сканирования. Первые коды, от 1 до 83,известные как «коды нажатия»
— — — клавиатура посылает, при нажатии клавиши.Когда клавиша
— — — отпускается, клавиатура посылает другойкод сканирования, «код
— — — отпускания». Код отпусканияформируется прибавлением числа 128 к
— — — коду нажатия. То есть коды отпусканияпопадают в диапазон от 129 до
— — — 211- их легко распознать по 7-му биту,равному 1.

— — — — — Поскольку клавиатура посылает различныекоды для каждого
— — — нажатия и отпускания клавиши, программаможет отследить состояние
— — — каждой клавиши. Вы узнаете о нажатииклавиши, получив от клавиатуры
— — — код нажатия. Клавиша нажата, пока вы неполучите код отпускания,
— — — сообщающий, что клавиша отпущена. Длябольшинства клавиш э
та
— — — информация не важна, но для регистровыхклавиш (например, клавиши
— — — верхнего регистра) она решающая. Например,большие буквы
— — — формируются только тогда, когда клавишаверхнего регистра нажата.
— — — Так как такая информация доступна от любойклавиши клавиатуры IBM,
— — — работа с регистровыми клавишами несоставляет труда. Если вы
— — — пожелаете изменить кодировку клавиатуры,устроив свое собственное
— — — расположение клавиш, любая клавиша можеттрактоваться вами как
— — — регистровая.

— — — — — И наконец, каждая клавиша клавиатуры IBMимеет встроенный
— — — механизм автоповторения. Если вы держителюбую клавишу нажатой
— — — более 1/2 секунды, клавиатура начинаетпосылать коды нажатия со
— — — скоростью 10 раз в секунду. Это удобно дляобычных клавиш, особенно
— — — для клавиш управления курсором. Вы простодержите их нажатыми, и
— — — курсор движется в нужное место. Но если увас есть клавиши,
— — — выполняющие некоторую работу только вмомент первого нажатия (и не
— — — может использовать автоповторение), выопять-таки должны
— — отслеживать нажатия и отпускания этойклавиши. Только первый код
— — — нажатия должен вызывать ее срабатывание, аостальные коды нажатия
— — — вы должны игнорировать.

Категория: Программирование на Ассемблере | Дата: 11.03.13

Меню раздела
Блок