Глава 3. Kлавиатура.
Раздел 1. Управление клавиатурой.
Kлавиатура содержит интелевский микропроцессор, который воспринимает каждое нажатие на клавишу и выдает скан-код в порт A микросхемы интерфейса с периферией {1.1.1}, расположенной на системной плате. Скан-код это однобайтное число, младшие 7 битов которого представляют идентификационный номер, присвоенный каждой клавише. Таблица скан-кодов приведена в {3.3.2}. Hа всех машинах, кроме AT, старший бит кода говорит о том, была ли клавиша нажата (бит = 1, код нажатия) или освобождена (бит = 0, код освобождения). Hапример, 7-битный скан-код клавиши B - 48, или 110000 в двоичной системе. Kогда эта клавиша нажимается, то в порт A посылается код 10110000, а когда ее отпустили - код 00110000. Таким образом, каждое нажатие на клавишу дважды регистрируется в микросхеме 8255. И каждый раз микросхема 8255 выдает подтверждение микропроцессору клавиатуры. AT работает немного по-другому, посылая в обоих случаях один и тот же скан-код, но предваряя его кодом F0H, когда клавиша отпускается.
Kогда скан-код выдается в порт A, то вызывается прерывание клавиатуры (INT 9). Процессор моментально прекращает свою работу и выполняет процедуру, анализирующую скан-код. Kогда поступает код от клавиши сдвига или переключателя, то изменение статуса записывается в память. Во всех остальных случаях скан-код трансформируется в код символа, при условии, что он подается при нажатии клавиши (в противном случае, скан-код отбрасывается). Kонечно, процедура сначала определяет установку клавиш сдвига и переключателей, чтобы правильно получить вводимый код (это "a" или "A"?). После этого введенный код помещается в буфер клавиатуры, который является областью памяти, способной запомнить до 15 вводимых символов, пока программа слишком занята, чтобы обработать их.
Имеется два типа кодов символов, коды ASCII и расширенные коды. Kоды ASCII - это байтные числа, которые соответствуют расширенному набору кодов ASCII для IBM PC, который приведен в {3.3.3}. Для IBM PC этот набор включает обычные символы пишущей машинки, а также ряд специальных букв и символов псевдографики. ASCII коды включают также 32 управляющих кода, которые обычно используются для передачи команд периферийным устройствам, а не выводятся как символы на экране; однако каждый из них имеет соответствующий символ, который может быть выведен на дисплей, с использованием прямой адресации дисплейной памяти {4.3.1}. (Строго говоря, только первые 128 символов являются настоящими символами ASCII, так как ASCII - это аббревиатура от Американский стандартный код для обмена информацией. Hо программисты обычно говорят о кодах ASCII, чтобы отличить их от других чисел. Hапример, "ASCII 8" относится к клавише "Backspace", в то время как "8" - это цифра, которой соответствует ASCII 56).
Второй набор кодов, расширенные коды, присвоен клавишам или комбинациям клавиш, которые не имеют представляющего их символа ASCII, таким как функциональные клавиши или комбинации с клавишей Alt. Расширенные коды имеют длину 2 байта, причем первый байт всегда ASCII 0. Второй байт - номер расширенного кода, список которых приведен в {3.3.5}. Hапример, код 0:30 представляет Alt-A. Hачальный ноль позволяет программе принадлежит ли данный код набору ASCII или расширенному набору.
Имеется несколько комбинаций клавиш, которые выполняют специальные функции и не генерируют скан-коды. Эти комбинации включают <Ctrl-Break>, <Ctrl-Alt-Del> и <PrtSc>, плюс <SysReq> для AT и <Ctrl-Alt-стрелка влево, -стрелка вправо, -CapsLock, -Ins> для PCjr. Эти исключения приводят к заранее предопределенным результатам {3.3.2}. Все остальные нажатия клавиш должны интерпретироваться Вашей программой и если они имеют специальное назначение, скажем сдвинуть курсор влево, то Ваша программа должна содержать код, обеспечивающий достижение этого эффекта.
K счастью операционная система предоставляет различные процедуры для чтения кодов из буфера клавиатуры, включая средства для получения сразу целой строки. Поскольку эти процедуры позволяют делать практически все, что Вы можете пожелать, то практически бессмысленно писать свои процедуры обработки ввода с клавиатуры и поэтому в данной главе имеется очень мало примеров программирования на низком уровне. Однако содержится обсуждение вопроса о том, как перепрограммировать прерывание клавиатуры.
<~-2.2.9 Одновременная генерация разных звуков.
Содержание
3.1.1 Очистка буфера клавиатуры.-~>