5. Клавиатура ibm pc
Клавиатура – клавишное (кнопочное) устройство управления управляющей ЭВМ. Она служит для ввода алфавитно-цифровых символов (данных), а также команд управления. Его основные функции не нуждаются в поддержке специальными системными программами (драйверами). Необходимое программное обеспечение уже имеется в микросхеме ПЗУ в составе базовой системы ввода вывода (BIOS), и поэтому компьютер реагирует на нажатия клавиш сразу после включения. Принцип действия клавиатуры заключается в следующем [1].
1.При нажатии на клавишу специальная микросхема (микропроцессор в составе клавиатуры) выдает так называемый скан-код клавиши. Скан-код - это однобайтовый код, свой для каждой клавиши.
2.Скан-код по последовательному каналу связи передается на микросхему, находящуюся на материнской плате компьютера и выполняющую функции порта специального аппаратно-программного устройства, отвечающего за связь внешних устройств с процессором (порт А с адресом 60h).
3.Порт клавиатуры выдает сигнал аппаратного прерывания на контроллер прерываний, который выдает процессору cигнал требования прерывания INT и номер прерывания, равный 9 (Interrupt 9)
4.Получив
прерывание процессор откладывает
текущую работу, посылая в стек полный
адрес команды прерванной программы и
по номеру прерывания обращается в
специальную область памяти (таблица
векторов прерываний, адрес 0000:0000…0000:2FF)
к ячейкам с адресом = 9
4=
0:36, 0:39, в которых хранится так называемый
вектор прерывания по клавиатуре,
представляющий полный адрес программы
обслуживания прерывания. В первом слове
находится смещение, а во втором - адрес
сегмента системной программы обслуживания
аппаратного прерывания от клавиатуры.
5.Определив адрес начала программы обработчика клавиатурного прерывания процессор переходит к ее выполнению. Программа обработки клавиатурного прерывания «зашита» в микросхему ПЗУ (область BIOS).
6.Системная программа-обработчик прерывания направляет процессор к порту клавиатуры (60h), где он находит введенный скан-код, читает его в свои регистры и под управлением программы определяют, какой код символа соответствует данному скан-коду. Соответствие между скан-кодом и символом определяется таблицей в программе обслуживания, называемой «раскладка клавиатуры». Имеется два типа кодов символов: коды ASCII и расширенные коды. Коды ASCII – это байтовые числа, соответствующие расширенному набору кодов для IBM PC: обычные символы пишущей машинки, а также 32 управляющих кода, которые обычно используются для передачи команд периферийным устройствам, а не выводятся как символы на экран; однако, каждый из них имеет соответствующий символ, который может быть выведен на дисплей с использованием прямой адресации дисплейной памяти.
Второй набор кодов, расширенные коды, присвоены клавишам или комбинациям клавиш, которые не имеют представляющего их символа ASCII. Функциональные клавиши или комбинации с клавишей Alt имеют расширенные коды длиной 2 байта, причем первый байт всегда 0, а второй байт- номер расширенного кода. Начальный ноль позволяет определить принадлежит ли данный код набору ASCII или расширенному набору.
7.Далее обработчик прерывания направляет полученный код символа в небольшую область памяти, известную как буфер клавиатуры, и прекращает свою работу, известив об этом процессор (команда iret - выход из прерывания).
8.Процессор возвращается к отложенной задаче, из которой он ушел на обслуживание прерывания.
Итог нажатия клавиши: двухбайтовый код в буфере клавиатуры. В одном байте находится скан-код, в другом код символа или нуль (для функциональных клавишей)
9.Введенный символ хранится в буфере клавиатуры до тех пор, пока его не заберет оттуда другая программа, например, текстовый редактор. Если символы поступают в буфер чаще, чем забираются оттуда, наступает эффект переполнения буфера. В этом случае программой обслуживания клавиатурных прерываний ввод новых символов на некоторое время прекращается, переполнение буфера проявляется в виде предупреждающего звукового сигнала при нажатии клавиши и отсутствия его изображения на экране.
Извлечение кодов из буфера клавиатуры выполняется посредством сервисов DOS, BIOS через программные прерывания int, включенные в состав макрокоманд.
Для этого широко используем следующие макрокоманды:
KeyTest (KeyRead) – проверка наличия кода в буфере клавиатуры
KeyTest MACRO
mov ah,1 ;функция 1, проверка буфера клавиатуры
int 16h ;программное прерывание с номером 16h
ENDM ;конец макроопределения
Результатом выполнения макрокоманды KeyTest является установка флага ZF во флаговом регистре, если буфер пуст. Данная макрокоманда позволяет обратиться к чтению буфера только при факте ввода с клавиатуры.
KeyWait – чтение кода из буфера клавиатуры с ожиданием ввода, если буфер пуст.
KeyWait MACRO
mov ah, 0 ;функция 0
int 16h ;программное прерывание номер 16h
ENDM
KeyWait MACRO
mov ah, 0 ;функция 0
int 16h ;программное прерывание номер 16h
ENDM
Данная макрокоманда переносит содержимое буфера клавиатуры в регистр АХ, причем для символьных клавишей в старшем байте регистра (ah) содержится скан-код, а в младшем байте (al) – код символа клавиши. Для функциональных клавишей в старшем байте – нуль, а в младшем – расширенный код. Если буфер пуст, процессор переходит в режим ожидания ввода с клавиатуры. Данное свойство макрокоманды позволяет останавливать выполнение программы на данной макрокоманде и продолжать ее выполнение после нажатия любой клавиши (ожидание ввода с клавиатуры).
