Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11656
Последний выпуск: 19.06.2015

Глава 10. клавиатура

ГЛАВА 10. КЛАВИАТУРА

[ Оглавление ]
     
     Клавиатура - это одно из основных звеньев взаимодействия
человека и компьютера. В этой главе  мы  подробно  рассмотрим
работу  клавиатуры  Персонального  компьютера  фирмы  "ИБМ" и
методы управления этой работой. Клавиатура IBM/PC  имеет  ряд
интересных особенностей, которые мы сейчас изучим.
     
     
     10.1. Основные принципы функционирования клавиатуры
     
     
     На  мой  взгляд,  один из наиболее впечатляющих моментов
конструкции  IBM/PC  -  это  способ  работы  с   клавиатурой.
Выбранный   подход   в   равной  мере  прост  и  элегантен  и
программистам необходимо знать две вещи, связанные  с  вводом
информации  от клавиатуры, следующие из этого конструктивного
подхода.
     На электронном  уровне  клавиатура  IBM/PC  представляет
собой   небольшой  самостоятельный  компьютер.  Внутри  блока
клавиатуры размещается  микропроцессор  8048  фирмы  "Интел",
который  выполняет  задачу  слежения  за  нажатиями  клавиш и
передачи  их   состояния.   Микропроцессор   8048   выполняет
различные  функции,  включая самодиагностику (после включения
питания    компьютера),    проверку    нажатия    клавиш    и
противодребезговую защиту (что не позволяет воспринимать одну
нажатую клавишу  как две).
     Микропроцессор 8048 позволяет также буферизовать  до  20
нажатий  клавиш,  если  центральный  процессор  не  может  их
принять сразу. Обычно этот буфер совершенно  пуст,  поскольку
ситуации,    когда    центральный   процессор   не   успевает
отреагировать на запрос клавиатуры.
     Вы, вероятно, слышали предупреждающий  звуковой  сигнал,
когда  нажатие Вами клавиш опережало возможности программы по
их вводу. Это не связано  с  заполнением  буфера  клавиатуры.
Процедура  ввода  с  клавиатуры  системы  BIOS  в  ПЗУ  имеет
собственный  буфер  и  звуковой  сигнал  раздается  в  случае
заполнения  этого буфера. Буфер клавиатуры может содержать 20
символов, а буфер системы BIOS - только 15. По мере  изучения
клавиатуры  мы  рассмотрим  как  код нажатой клавиши попадает
сначала в буфер клавиатуры, затем в буфер BIOS и, наконец,  в
программу.
     Блок   клавиатуры   не  связывает  с  клавишами  никаких
конкретных   значений.   Вместо   этого,   блок    клавиатуры
идентифицирует  по  ее  номеру  или  коду  сканирования.  Все
клавиши имеют коды сканирования от 1 до  83.  На  рис.  10.1.
показаны коды, соответствующие всем клавишам.
     При  нажатии  клавиши  блок  клавиатуры  передает ее код
сканирования   центральному   процессору.    Когда    клавиша
отпускается, клавиатура снова передает ее код, но увеличенный
на 128 (или шестнадцатиричное значение  80).  Таким  образом,
имеются различные коды для нажатия и освобождения клавиш.
     Для   работы   с   клавиатурой   используются   порты  и
прерывания. Когда выполняется какое-либо действие с  клавишей
(нажатие или освобождение), процессор клавиатуры обнаруживает
его и запоминает в своем буфере. Затем, процессор  клавиатуры
формирует  прерывание  с  номером  9.  В  ответ на прерывание
служебная  процедура  системы  BIOS  в  ПЗУ   считывает   код
сканирования  клавиши  из  порта клавиатуры (порт номер 96) и
затем пересылает в порт  клавиатуры  команду  очистить  буфер
процессора  клавиатуры.  Если  системный блок не реагирует на
прерывания клавиатуры, то коды сканирования  накапливаются  в
буфере  процессора  клавиатуры,  хотя  при  нормальной работе
этого не должно  происходить.  Специальный  код  сканирования
255,   шестнадцатиричное  значение  FF,  используется  блоком
клавиатуры, для сообщения, что его буфер заполнен.  
     Поскольку  информация  о  нажатии  клавиши  поступает  в
системный блок от клавиатуры  через  порт,  любая  программа,
имеющая  доступ  к  порту,  может  непосредственно общаться с
клавиатурой. На практике, однако, это  неприменимо,  так  как
блок   клавиатуры  вырабатывает  еще  и  прерывания,  которые
обрабатываются  системой  BIOS  в  ПЗУ.  Однако,  просто   из
любопытства,  можно  написать небольшую программу на Бейсике,
читающую порт клавиатуры и сообщающую, что она  там  находит.
Ниже приведен фрагмент этой программы.
     Поскольку  эта  программа состязается с системой BIOS за
получение  информации  от  клавиатуры,  ее  работа  несколько
хаотична.  Но  если  запустить  эту  программу  и нажимать на
клавиши,  она   все   же   зарегистрирует   несколько   кодов
сканирования.
     
     100  REM  Программа на Бейсике, пытающаяся считывать
               коды сканирования клавиатуры
     110  X=INP(96)  'чтение порта клавиатуры
     120  THROW.AWA4$ = INKEY$ 'отбросить любые коды,считан- 
                                системой BIOS
     130  IF X=0 THEN GOTO110 'если данных нет - продолжать
                               ожидание
     140  PRINT
     150  PRINT "Код сканирования клавиатуры"; XMOD128;'сооб-
                                               щить код
     160  IF X > 128 THEN PRINT "клавиша осбождена";
     170  IF X > 129 THEN PRINT "клавиша нажата";
     180  GO TO 110
     
     Клавиатура  IBM/PC  выполняет  еще  и функцию повторения 
клавиши. Блок  клавиатуры  следит  за  тем,  сколько  времени 
клавиша  остается  нажатой  и  формиирует  сигнал повторения. 
Функция повторения  распространяется  на  все  клавиши  блока 
клавиатуры. 
     Процедуры  системы BIOS в ПЗУ могут распознавать отличие 
повторных нажатий клавиши от повторения сигнала  удерживаемой 
в нажатом состоянии клавиши, путем анализа кодов сканирования 
освобожденной клавиши.  Если  для  одной  и  той  же  клавиши 
получены  два  кода нажатой клавиши и между ними не было кода 
освобожденной   клавиши,    значит    клавиша    удерживается 
процедурами  системы  BIOS  для подавления функции повторения 
тех клавиш,  которым  она  не  нужна,  таких  как,  например, 
клавиша смещения (shift). 
     Теперь  Вам  должны быть понятны основы того, как IBM/PC
работает  с  клавиатурой.  Блок  клавиатуры   сообщает,   что
происходит  с  клавиатурой:  какие  клавиши нажимаются, какие
освобождаются и, через определенный промежуток времени, какие
удерживаются   в   нажатом  состоянии.  Система  BIOS  в  ПЗУ
интерпретирует получаемую  от  блока  клавиатуры  информацию,
придавая  ей  определенный  смысл. Таким образом, имеет место
очень  ясное  и  четкое  разделение  труда.  Блок  клавиатуры
занимается  физической  стороной, механизмом функционирования
клавиатуры,  а  программы  системы  BIOS  в  системном  блоке
выполняют  все  логические операции по интерпретации действий
клавиатуры.
     Большинство пользователей даже не знает, что  клавиатура
IBM/PC  передает  сигналы  не  только  о  нажатии,  но  и  об
освобождении  клавиши,  поскольку  такая  информация   обычно
скрыта  от  пользователя.  Ее  можно  увидеть,  запустив тест
клавиатуры из набора диагностических  программ  IBM/PC.  Если
присмотреться,  можно  заметить,  что  изображение  на экране
меняется при каждом нажатии, освобождении клавиши  или  когда
клавиша удерживается в нажатом состоянии достаточно долго для
того, чтобы начала действовать функция повторения.
     
     10.2. Определение смысла нажатых клавиш
     
     Служебная процедура системы BIOS для  прерывания  9  или
прерывания  клавиатуры  определяет  смысл  каждого действия с
клавиатурой. Это включает  слежение  за  состоянием  смещения
кодов и преобразование нажатий клавиши в их значения, будь то
буквы алфавита или сигналы  функциональных  клавиш.  Ниже  мы
будем рассматривать эту функцию подробнее.
     Часть  щадачи обслуживания клавиатуры со стороны системы
BIOS заключается в слежении за всеми  возможными  состояниями
смещений.   Состояния   смещений   довольно   часто  вызывают
путаницу, поскольку клавиатура  обычной  пишущей  машинки,  с
котокой   большинство  из  нас  начинало  свое  знакомство  с
клавишами, имеет  всего  одну  клавишу  смещения,  Клавиатуры
многих  кимпьтеров,  в  том  числе  и  IBM/PC, имеют три типа
смещений.
     Во-первых, имеются обвчные функции клавиш,  без  всякого
смещения  (например,  для  получения букв в нижнем регистре).
Затем имеется  обычное  смещение,  такое  же  как  у  пишущих
машинок,  которое служит для получения букв верхнего региства
и, как правило, всех  знаков,  нанесенных  на  верхнюю  часть
клавиши.  Кроме  того,  имеются  еще   два   вида   смещения,
изменяющее  смещение ("ALT") и управляющее смещение ("CTRL").
Эти два специальных  вида  смещения  используются  аналогично
обычному  смещению  в том смысле, что просто "а" не совсем то
же самое, что "А" в верхнем регистре, и Ctrl-A и Alt-A  также
имеют собственные значения. (Некоторые читатели могут считать
клавишу "ESC" еще одной клавишей смещения. Это связано с тем,
что  в  некоторых  старых  терминалах  компьютеров,  особенно
таких,  которые  использовались  подобно  клавишам  смещения.
Однако, при использовании клавиши "ESC" она не удерживалась в
нажатом  состоянии,  подобно  клавишам  смещения,  -  сначала
нажималась  клавиша  "ESC",  а  после  нее  какая-либо другая
клавиша. Оба этих  нажатия  рассматривались  как  специальная
последовательность.  Такое  действие нельзя рассматривать как
операцию смещения. Обычно, клавиша "ESC" подобным  образом  в
IBM/PC не используется.) 
     Допустимыми  считаются не все сочетания обычных клавиш и
клавиш смещения. Если ввести одну из недопустимых комбинаций,
то  система BIOS ее просто проигнорирует, как будто ничего не
произошло.  Несколько  позже  мы  перечислим  все  допустимые
комбинации  смещений  клавиш,  чтобы Вы могли воспользоваться
ими в своих программах.
     На  клавиатуре   IBM/PC   имеется   четыре   специальных
"переключательных"  клавиши,  которые  действуют  в  качестве
тумблера "включения-отключения" для определенных функций. Эти
клавиши  Insert  (вставка),  Caps-Lock (закрапление заглавных
букв), Num-Lock (закрепление цифровой клавиатуры) и  клавиша,
которой  практически  не пользуются, Scroll-Lock (закрепление
"роллинга").  Две  из  этих  клавиш,  Caps-Lock  и  Num-Lock,
являются   частью   механизма   смещения,  а  оставшиеся  две
управляют определенными специальными режимами работы.
     Информация о  состоянии  этих  четырех  переключательных
клавиш  и  том,  удерживается  ли  в  данный момент в нажатом
состоянии одна из  клавиш  смещения,  хранится  в  специально
выделенной   для   этих   целей   области  в  нижних  адресах
оперативной памяти. Вся эта информация хранится в двух байтах
с  адресами 1047 и 1048 (или 417 и 418 шестнадцатиричных). Во
время работы IBM/PC,  в  этих  двух  байтах  сохраняются  все
состояния  смещения  и состояния переключателей. Емтественно,
что после выключения  компьютера  эти  байты  сбрасываются  в
нормальное состояние.
     Программа  на  Бэйсике,  листинг которой 10.1 приведен в
конце этой главы, отображает эти два  байта  и  демонстрирует
воздействие  на них нажатий клавиш смещения и переключателей.
Описание смысла отдельных битов приведено ниже.
     Поскольку клавиши смещения действуют  только  в  нажатом
состоянии,   система   BIOS   следит   за   их   нажатиями  и
освобождениями и вносит необходимые изменения в интерпретацию
обычных  клавиш.  Система  BIOS следит за кодами сканирования
при освобождении только для клавиши  смещения,  так  как  для
всех остальных клавиш эта функция не имеет смысла.
     Когда  система  BIOS  получает  код сканирования обычной
клавиши, она проверяет все варианты  смещения  и  преобразует
этот  код  в соответствующее значение, которое может быть как
символьным кодом ASCII, так и кодом специального назначения.
     Процедура обслуживания клавиатуры системы BIOS следит не
только за состояниями смещения. Состояние клавиатуры хранится
в первых тринадцати битах указанных выше двух байт по  адресу
1047.  Ниже  приведена таблица значений этих битов, изменения
которых можно проследить с помощью программы 10.1:
     
_____________________________________________________________
   Байт  Бит    Смысл             Значение, когда бит равен 1
_____________________________________________________________
     
     1    1     Insert              состояние активное
     1    2     Caps-Lock           состояние активное
     1    3     Num-Lock            состояние активное
     1    4     Scroll-Lock         состояние активное
     1    5     Alt                 клавиша нажата
     1    6     Ctrl                клавиша нажата
     1    7     смещение слева      клавиша нажата 
     1    8     смещение справа     клавиша нажата
     2    1     Insert              клавиша нажата
     2    2     Caps-Lock           клавиша нажата
     2    3     Num-Lock            клавиша нажата
     2    4     Scroll-Lock         клавиша нажата
     2    5     Состояние захвата   активное состояние
     2    6     (не используется)   (после Ctrl-Num-Lock)
     2    7     (не используется)
     2    8     (не используется)
____________________________________________________________
     

     
     В этой таблице нашел отражение ряд интересных  моментов.
Во-первых, можно отметить параллельность использования первых
четырех  битов  обоих  байтов  для  клавиш-переключателей.  В
первом байте  отражается  текущее  состояние  клавиши,  а  во
втором  байте  указывается  нажатие  соответствуюших  клавиш*
Во-вторых. обратив внимание на биты, соответствующие  нажатию
обычных  клавиш  смещения,  расположенные  в правой и в левой
частях клавиатуры, распознаются по  отдельности.  Для  такого
разделения  трудно  придумать  разумное применение, но тем не
менее оно имеет место.
     Кроме того, система BIOS следит за  состоянием  вставки,
управляемым  переключателем.  Эта функция обычно игнорируется
программами, которые  используют  клавишу  Iusert,  например,
текстовыми прогцессорами. Обычно. все программы, использующие
эту клавишу, сами следят за  режимом  вставки.  Практического
значени[  это не имеет, но нам показалось любопытным отметить
и такой факт.
     И, наконец, обратите внимание на бит состояния  захвата,
который   устанавливается,   когда   процедура   обслуживания
клавиатуры  системы  BIOS  обнаруживает  комбинацию   клавиши
Ctrl-NumLock.  Эта  комбинация используется системой BIOS для
управления состоянием захвата, которое программам  обнаружить
трудно,  поскольку в этом состоянии программы не выполняются.
В состоянии захвата система  BIOS  выполняет  короткий  цикл,
ожидая  нажатия  клавиши,  которое  выводит  систему из этого
состояния. В этом состоянии распознаются и обслуживаются  все
прерывания.  Если  прерывание  поступит  от  клавиатуры  (при
нажатии обычной клавиши), то состояние  захвата  завершается,
код  нажатой  клавиши отбрасывается и управление возвращается
той программе, которая выполнялась до установления  состояния
захвата.   Если   прерывание  имело  другую  природу  (номер,
прерывание от дисков), то  оно  обслуживается,  но  состояние
захвата сохраняется пока не будет нажата клавиша.
     Комбинация клавиш Ctrl-NumLock -  это  один  из  четырех
особых  случаев, отслеживаемых процедурой системы BIOS. Когда
процедура   обслуживания   клавиатуры   обрабатывает    коды,
принимаемые  от клавиатуры, она постоянно проверяет появление
одной из четырех  особых  комбинаций,  которые  обслуживаются
специальным образом. 
     Фактически,  эти  четыре  комбинации рассматриваются как 
команды, по которым должно начинаться выполнение определенных 
служебных  процедур.  Эти  четыре  комбинации:  Ctrl-NumLock, 
PrtSc, Ctrl-Alt-Del и Ctrl-Break. 
     Как мы уже видели, комбинация Ctrl-NumLock  используется 
для  приостановки  работы  компьютера. Процедура обслуживания 
клавиатуры  не  позволяет  компьютеру  продолжать  выполнение 
любой программы, пока приостановка не будет отменена нажатием 
клавиши. 
     Команда распечатки экрана или  PrtSc  предназначена  для 
вывода содержимого экрана на устройство печати. Поскольку эта 
операция выполняется на  самом  примитивном  уровне,  она  не 
может  использовать  возможности  ДОС,  такие  как  пересылка 
сообщения в линию связи вместо устройства  печати.  Процедура 
распечатки  экрана  доступна  и  Вашим  программам  на уровне 
прерываний, что будет показано в главе 11. 
     Комбинация   клавиш   Ctrl-Alt-Del   используется    для 
перезапуска  или  для перезагрузки системы. Когда встречается 
такая комбинация, процедура обслуживания клавиатуры  передает 
управление   программе  проверки  системы  и  запуска  работы 
операционной системы. 
     Эту комбинацию клавиш можно использовать в любой  момент 
времени  для  перезапуска  системы, если произошло какое-либо 
отклонение от нормального функционирования. Однако, как можно 
заметить,  эта  комбинация  действует  не всегда. В некоторых 
случаях IBM/PC необходимо бывает  выключить,  а  затем  снова 
включить  и  уже  после  этого пытаться ее перезапустить. Для 
чего   это   бывает   необходимо?   Комбинация   Ctrl-Alt-Del 
срабатывает  всегда,  когда  работает  процедура обслуживания 
клавиатуры. Это условие может оказаться невыполненным в  двух 
случаях. Первый и наиболее распространенный связан с запретом 
прерываний.  Из  главы  3  Вам  должно  быть  известно,   что 
прерывания   запрещаются   машинной   командой   CLI   и   не 
обслуживаются  пока  не  будет  выдана  команда  STI.  Обычно 
команда  STI  следует  за  командой  CLI через очень короткий 
промежуток  времени.  Однако,  если  программа   по   ошибке, 
оставила   прерывания   запрещенными,   то   нажатие   клавиш 
Ctrl-Alt-Del не  приведет  ни  к  какому  результату.  Другая 
причина  нарушения  работы  процедуры обслуживания клавиатуры 
может быть связана с изменением значения  вектора  прерывания 
от  клавиатуры.  Если  изменить  ячейки  памяти с 36 по 39, в 
которых находится  вектор  прерывания  от  клавиатуры,  тогда 
клавиатура   не   будет  работать,  в  том  числе  и  клавиши 
Ctrl-Alt-Del.  Естественно,  что  прогармма   запуска   после 
включения питания восстанавливает все вектора прерываний. 
     Комбинация   Ctrl-Break   предназначена  для  прерывания 
текущей операции. В отличие  от  остальных  трех  специальных 
комбинаций  она  может  отрабатываться программно. Прерывание 
номер 27, шестнадцатиричное значение 1В, зарезервировано  для 
процедуры,  которая  должна  вызываться  при  нажатии  клавиш 
Ctrl-Break. Если программа хочет использовать  это  средство, 
она  должна занести адрес процедуры обслуживания прерывания в 
ячейки  вектора  прерывания  27  -  ячейку  с  адресом   108, 
шестнадцатиричное   значение   6С.   Эту   возможность  можно 
исследовать,  нажимая  клавиши  Ctrl-Break   при   работе   с 
интерпретатором  БЕЙСИКА или редактором Edlin, поставляемым в 
составе ДОС. Если программа не устанавливает адрес  процедуры 
обслуживания   прерывания  в  ячейку  108,  то  система  BIOS 
совместно с ДОС прерывают выполнение  текущей  программы  или 
файла пакетной обработки. Управление возвращается ДОС. 
     Поскольку   блок   клавиатуры  сообщает  обо  всем,  что 
происходит  с  клавишами  и  процедуры  системы  BIOS  в  ПЗУ 
интерпретируют  любые  действия,  выполняемые  с клавиатурой, 
Ваша   программа   может   следить   за   всеми   действиями, 
производимыми   с  клавиатурой.  Программам  редко  требуются 
какие-либо   сведения   помимо   тех,   которые    сообщаются 
процедурами  обслуживания  клавиатуры  системы  BIOS  в  ПЗУ, 
поэтому не обеспечена  специальная  возможность,  позволяющая 
программе  определить какие в точности действия выполнялись с 
клавиатурой. 
     Если Вам все-таки  необходимо  более  точно  знать,  что 
происходит  с  клавиатурой,  Ваши  программы  могут подменить 
вектор  прерываний  для  клавиатуры,  который  расположен  по 
адресу   36,   шестнадцатиричное   значение   24.   Если   Вы 
разрабатываете собственную процедуру обслуживания  прерываний 
от  клавиатуры,  то  она  может  либо выполнять абсолютно все 
функции  обслуживания,  либо  служить  пред-процессором   для 
стандартной   процедуры  системы  BIOS.  Предпроцессор  может 
извлекать  любую  информацию,  которая  Вам   необходима,   и 
передавать  управление  стандартной  процедуре для выполнения 
обычных действий. 
       
       
       10.3.Символьные клавиши
       
     Коды сканирования клавиши преобраззуются системой BIOS в 
расширенные  коды  ASCII,  состоящие  из  всез  256 возможных 
байтовых комбинаций, кроме одной (байт с нулевым  значением). 
В  этот  набор  кодов  входят  обычные символы, набор которых 
описывается в различных  руководствах  по  IBM/PC.  Эти  коды 
можно  формировать  либо  с  помощью  нажатия  обычных клавиш 
(например,  клавиши  А  для  "А"  и  таек  далее)  или  путем 
использования клавиатуры и клавиши Alt. 
     Для  формирования  кодов  ASCII по второму методу нужно, 
удерживая клавишу "Alt" в нажатом состоянии, вводить числовое 
значение  кода  ASCII. Значение должно вводиться в десятичном 
виде (от 1 до  255)  и  можно  использовать  только  числовые 
клавиши в правой части клавиатуры (но не числа в верхнем ряду 
средней части клавиатуры). При  использовании  клавиши  "Alt" 
процедуры  системы  BIOS  работают  особым образом, поскольку 
несколько нажатий клавиш должны интерпретироваться  как  один 
символ.  Пока  нажата  клавиша  "Alt"  можно  нажиматьсколько 
угодно цифровых клавиш. Когда  клавиша  "Alt"  будет  наконец 
освобождена,    будет    сформирован   код   символа   ASCII, 
соответствующий введенному числовому  значению.  Если  ввести 
слишком  большое  число,  используется его значение по модулю 
256. Например, если ввести Alt-1000,  то  будет  сгенерирован 
символ  CHR$(232).  Деление  1000  на  256  дает остаток 232, 
поэтому и генерируется символ с кодом CHR$(232). 
     Единственное значение в коде ASCII,  которое  невозможно 
ввести  с  клавиатуры  - это нулевое значение или CHR$(0). На 
это имеется несколько причин (код 0 определен в системе кодов 
ASCII  как  пустой  символ,  который  должен игнорироваться), 
однако, главная  причина  заключается  в  использовании  нуля 
системой   BIOS   для  указания  на  наличие  второго  набора 
символов, специальных символов. Хотя некоторые руководства по 
IBM/PC  указывают,  что  нулевой  код  генерируется  нажатием 
клавиши Ctrl-2 или с помощью клавиши "Alt", это неверно. Если 
удерживать  клавишу  "Ctrl"  в  нажатом  состоянии  и  нажать 
цифровую клавишу "2" будет сформирован  один  из  специальных 
символов  и этот символ должен интерпретироваться как CHR$(0) 
из набора кодов  ASCII.  Это  не  совсем  то  же  самое,  что 
формирование     действительного    кода    ASCII    CHR$(0). 
Использование  клавиши   "Alt"   тоже   не   даст   желаемого 
результата,  будете ли Вы нажимать клавиши Alt-0 или пытаться 
"обмануть"  систему,  вводя  эквиваленты   по   модулю   256, 
например, Alt-256 или Alt-512. 
     Специальные   символы   используются   для   обозначения 
специальных  клавиш,  таких  как  "Home",  "End"   и   десять 
функциональных  клавиш  (фактически,  как  Вы  скоро увидите, 
имеется сорок функциональных клавиш). 
     Специальные символы позволяют  использовать  специальные
клавиши,  такие  как  функциональные клавиши, не используя ни
один из 256 символов расширенного кода ASCII.
     Механизм  кодирования,  который  система  BIOS   в   ПЗУ
использует для указания, какой символ был введен с клавиатуры
( и определение того, обычный это  символ  или  специальный),
работает  с  двумя  байтами.  Если  первый  из двух байтов не
нулевой, то введен символ  расширенного  кода  ASCII  и  этот
символ хранится в первом байте. Есоли же первый байт нулевой,
то с клавиатуры введен специальный символ и его код  хранится
во  втором  байте. Здравый смысл подсказывает, что можно было
бы  использовать  один  бит  второго  байта  для  обычных   и
специальных  символов.  Это  было  бы  проще  и  позволило бы
вводить нулевой код ASCII.  
     В то время как в расширенном наборе ASCII 256 кодов (255 
из них можно ввести с клавиатуры), специальных кодов столько, 
сколько  требуется  для   выполнения   всех   предусмотренных 
клавиатурой  IBM/PC  функций.  Например, сорок кодов выделено 
для функциональных клавиш (десять обычных и еще тридцать  для 
трех возможных смещений - обычного и с помощью клавиш "Alt" и 
"Ctrl").  Ниже  приведена   таблица   специальных   кодов   и
комбинаций  клавиш,  которыми  они вырабатываются. Вы конечно
заметите  определенную  хаотичность  этих  кодов.   Некоторые
комбинации  с  клавишей "Alt" разрешены, а другие нет, причем
без какой-либо видимой причины.  То  же  можно  сказать  и  о
комбинациях с клавишей "Ctrl".
     
  Значение            Клавиши, с помощью
  специального        которых он формируется
  кода
  ____________        __________________________________
     
     3                Ctrl-2 (что должно соответствовать коду
                      CHR$(0) или ASCII NULL)
     15               обратная табуляция (shift-tab)
    16-25             от Alt-a до Alt-p (верхний ряд букв)
    30-38             от Alt-A до Alt-L (средний ряд букв)
    44-50             от Alt-Z до Alt-M (нижний ряд букв)
    59-68             от F1 до F10 (функциональные клавиши)
     71               клавиша "Home" (курсор в верхний левый 
                      угол экрана)
     72               клавиша "Курсор вверх"
     73               клавиша "PgUp" (страница вверх)
     75               клавиша "Курсор влево"
     77               клавиша "Курсор вправо"
     79               клавиша "End" (конец)
     80               клавиша "Курсор вниз"
     81               клавиша "PgDn" (страница вниз)
     82               клавиша "Ins" (вставка)
     83               клавиша "Del" (удалить)
    84-93             от смещение-F1  до смещение-F10 (функ-
                      циональные клавиши с обычным смещением)
   94-103             от Ctrl-F1 до Ctrl-F10     
   104-113            от Alt-F1 до Alt-F10
     114              Ctrl-PrtSc
     115              Ctrl-Курсор влево
     116              Ctrl-Курсор вправо
     117              Ctrl-End
     118              Ctrl-PgDn
     119              Ctrl-Home
   120-131            от Alt-1 до Alt-= (верхний ряд клавиш)
     132              Ctrl-PgUp

     Как Вы могли заметить, эта таблица не слишком регулярна.
Вы,  наверное,  заметили,  что  имеется  сорок  комбинаций  с
функциональными  клавишами  -  каждая  из  клавиш  в одном из
четырех смещенных состояний (обычном, смещенном,  с  клавишей
"Ctrl" и с клавишей "Alt").
     Имея  в своем распоряжении все эти коды, любая программа
не будет испытывать недостатка кодов специального назначения.
Обычно,  для  любой программы хватает функциональных клавиш и
нескольких клавиш специального назначения, таких как "Home" и
клавиши   управления   курсором.   Однако,  если  потребуются
дополнительные клавиши, Вы сможете их найти в этой таблице.
     Доступ  к  этим  специальным  кодам   символов   требует
изменения  определенных  особых  методов.  В  следующих  двух
разделах мы рассмотрим как это делается.
     
     
     10.4. Процедура обслуживания клавиатуры в системе BIOS
     
     Рассмотрим  теперь  служебные  процедуры  системы  BIOS,
позволяющие осуществлять доступ к клавиатуре.
     Процедуры   обслуживания   клавиатуры   в  системе  BIOS
вызываются с помощью прерывания номер  22,  шестнадцатиричное
значение  16.  Таких процедур всего три, поскольку не слишком
много функций можно запросить для клавиатуры.
     Первая процедура, имеющая код  0,  возвращает  очередной
принятый от блока клавиатуры символ. Эта процедура возвращает
управление вызввающей программе  только  тогда,  когда  будет
введен символ, так что программе не приходится проверять, был
ли  действительно  введен  символ.   Код   обычного   символа
возвращается  в  регистре  AL,  но  если содержимоое AL равно
нулю, то в регистре АН находится  код  специального  символа.
Эти   регистры   соответствуют   первому  и  второму  байтам,
упоминавшимся  выше,  при  рассмотрении   кодов   специальных
символов.   Ниже   описана   логика   процесса  распознавания
получаемых символов:
     
     если AL=0 то
      начало
        спец_символ:= истина;
        введенный_символ:= АН
      конец
     иначе
      начало
        спец_символ:= AL
      конец;
     
     Можно  сделать  ряд  интересных  замечаний,   касающихся
значений,  возвращаемых  этой процедурой. Если введен обычный
код АSCII (то есть, AL не равняется нулю), то в  регистре  АН
содержится  код  сканирования  для  нажатой клавиши. Но, если
код ASCII был введен с помощью клавиши "Alt", то  в  регистре
АН  будет  ноль. Этту информацию программа может использовать
для определения способа вода символа. Некоторые символы  кода
ASCII встречаются на клавиатуре IBM/PC дважды. 
     
1000 REM Листинг 10.1 - программа отображения битов
1010 REM состояния клавиатуры
1030 GOSUB 2000  'вывод заголовка
1040 GOSUB 3000  'дополнительная информация
1050 GOSUB 4000  'отображение битов клавиатуры
1060 GOSUB 5000  'проверка завершения ввода с клавиатуры
1070 GOTO 1050

2000 REM Подпрограмма вывода заголовка
2010 KEY OFF : CLS : WIDTHS 80 : LOCATE  ,,0
2020 REM
2030 LOCATE 5,1
2040 PRINT " Программы для книги 'Персональный компьютер"
2050 PRINT " фирмы ИБМ', автор Питер Нортон, 1983"
2060 PRINT
2070 PRINT "Программа 10-1: Отображение битов состояния"
2080 PRINT "клавиатуры"
2999 RETURN

3000 REM Подпрограмма отображения вспомогательной информации
3010 LOCATE 11,28
3020 PRINT "Байт 1   Байт 2";
3030 LOCATE 12,28
3040 PRINT "12345678 12345678";
3050 LOCATE 17,10
3060 PRINT "Чтобы увидеть изменение битов состояния нажмите";
3065 PRINT "и удерживайте любую из";
3070 LOCATE 18,15
3080 PRINT "-- Левую или правую клавишу смещения";
3090 LOCATE 19,15
3100 PRINT "--Ctrl,Alt,Num-Lock,Scroll-Lock,Caps-Lock,Ins";
3110 LOCATE 21,10
3120 PRINT "(обратите внимание на влияние смещения и"
3125 PRINT "Num-Lock yf клавишу Ins) ";
3130 LOCATE 24,10 
3140 PRINT "Для выхода в ДОС нажмите любую клавишу ввода";
3999 RETURN

4000 REM Подпрограмма отображения битов состояния клавиатуры
4010 DEF SEG = &H40
4020 CONTROL% = PEEK(&H17)
4030 CHECK% = 128
4040 FOR I% = 1 TO 8
4050   LOCATE 14,27 + I%
4060   IF CONTROL% >= CHECK% THEN COLOR 30,0 ELSE COLOR 7,0
4070   IF CONTROL% >= CHECK% THEN PRINT "1"; ELSE PRINT "0";
4080   IF CONTROL% >= CHECK% THEN CONTROL% = CONTROL%-CHECK%
4090   CHECK% = CHECK / 2
4100 NEXT I%
4110 CONTROL% = PEEK(&H18)
4120 CHECK% = 128
4130 FOR I% = 1 TO 8
4140   LOCATE 14,36 + I%
4150   IF CONTROL% >= CHECK% THEN COLOR 30,0 ELSE COLOR 7,0
4160   IF CONTROL% >= CHECK% THEN PRINT "1" ELSE PRINT "0"
4170   IF CONTROL% >= CHECK% THEN CONTROL% = CONTROL%-CHECK%
4180   CHECK% = CHECK% / 2
4190 NEXT I%
4999 RETURN

5000 REM Подпрограмма ожидания завершения работы
5010 K$ = INKEY$
5020 IF LEN(K$) = 0 THEN RETURN 'ожидание ввода с клавиатуры
5030 IF (LEN(K$) = 2) AND (CHR$(82) = MID(K$,2,1)) THEN
5035 RETURN  'Нажата клавиша Ins
5040 CLS : LOCATE ,,1
5999 SYSTEM

9999 REM Конец программы 10-1
[ Оглавление ]

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог