Где хорошо - там и дом...

Категории каталога

xDSL [3]
Все материалы по xDSL
IT-Технологии [6]
Статьи по данной теме
Вирусняки [2]
Про вирусы
CISCO [2]
Здесь все о продукции этой известной компании
Unix, Linux [36]
Software [4]
Описания к прогам, всячинская инфа
Телефония [2]
Телефония и все к нрей относящееся
Games [1]
Windows [1]
Реклама, интересній софт [0]
Здесь можно прорекламировать любой софт

Наш опрос

Какому из производителей антивирусных продуктов Вы отдаете предпочтение?
Всего ответов: 477


Гидрометцентр России

Погода по львівськи

Штормовые предупреждения

onet.pl

meteo.pl

pogodynka.pl


HSDN - Информационная полоска
Locations of visitors to this page

Каталог статей

Главная » Статьи » Компьютеры, сети, оборудование, ОС, проги » IT-Технологии

Клавиатура
Управление клавиатурой
Клавиатура содержит интеловский микропроцессор,  который воспринимает  каждое нажатие  на  клавишу и выдает скан-код в порт A микросхемы интерфейса с периферией расположенной на системной плате. Скан-код это однобайтное число, младшие 7 битов которого представляют идентификационный номер, присвоенный  каждой клавише.

На всех машинах, кроме AT,  старший бит кода говорит о том, была ли клавиша нажата (бит  = 1,  код нажатия) или освобождена бит = 0,  код освобождения).  Например, 
7-битный скан-код клавиши B - 48  или 110000 в двоичной системе. Когда эта клавиша нажимается, то в порт A посылается код 10110000,  а когда ее отпустили - код 00110000.  Таким образом,  каждое нажатие на клавишу дважды регистрируется в микросхеме 8255.  И каждый раз микросхема 8255 выдает  подтверждение микропроцессору клавиатуры. AT
работает немного по-другому, посылая в обоих случаях один и тот же скан-код,  но предваряя его
кодом F0H, когда клавиша отпускается. Когда скан-код выдается в порт A,  то вызывается прерывание клавиатуры (INT 9). Процессор моментально прекращает свою работу и выполняет процедуру,  анализирующую скан-код.

Когда поступает код от клавиши сдвига  или переключателя,  то изменение статуса записывается в память. Во всех остальных случаях скан-код трансформируется в код символа,  при условии, что он подается при нажатии клавиши (в противном случае, скан-код отбрасывается). Конечно,  процедура сначала определяет установку клавиш сдвига  и  переключателей,  чтобы правильно получить вводимый код (это "a" или "A"?).  После этого введенный код помещается в буфер клавиатуры, который является областью памяти, способной запомнить до 15 вводимых символов, пока программа слишком занята, чтобы обработать их.

Имеется два типа кодов символов,  коды ASCII и расширенные коды.  Коды ASCII - это байтные числа, которые соответствуют расширенному набору  кодов  ASCII  для  IBM  PC. Для IBM PC этот набор включает обычные символы  пишущей машинки,  а  также ряд специальных букв и символов псевдографики. ASCII коды включают также 32 управляющих кода, которые обычно используются для передачи команд периферийным устройствам, а не выводятся как символы на экране;  однако каждый из них имеет  соответствующий символ, который может быть выведен на дисплей, с использованием прямой адресации дисплейной памяти.  (Строго говоря, только первые 128 символов являются настоящими символами ASCII, так как ASCII - это аббревиатура от Американский стандартный код для обмена информацией.  Но программисты обычно говорят о кодах ASCII,  чтобы
отличить их от других чисел. Например, "ASCII 8" относится к клавише "Backspace", в то время как "8" - это цифра, которой соответствует ASCII 56).

Второй набор  кодов,  расширенные коды,  присвоен клавишам или комбинациям клавиш, которые не имеют представляющего их  символа ASCII, таким как функциональные клавиши или комбинации с клавишей Alt.  Расширенные коды имеют длину 2 байта,  причем  первый байт всегда ASCII 0. Второй байт - номер расширенного кода.  Например, код 0:30 представляет Alt-A. Начальный  ноль позволяет программе определить принадлежит ли данный код набору ASCII или расширенному набору. 

Имеется несколько комбинаций клавиш,  которые выполняют специальные функции и не генерируют скан-коды. Эти комбинации включают <Ctrl-Break>,<Ctrl-Alt-Del>  и <PrtSc>,  плюс <SysReq> для AT и <Ctrl-Alt-стрелка влево,  -стрелка вправо,  -CapsLock, -Ins> для PCjr.  Эти исключения приводят к заранее предопределенным результатам.  Все остальные нажатия клавиш должны интерпретироваться  Вашей программой и если они имеют специальное назначение, скажем сдвинуть курсор влево,  то Ваша программа должна содержать код, обеспечивающий достижение этого эффекта. К счастью операционная система предоставляет различные процедуры для чтения кодов из буфера клавиатуры,  включая средства для получения сразу целой строки.  Поскольку эти процедуры  позволяют делать  практически все,  что Вы можете пожелать,  то практически бессмысленно писать свои процедуры обработки ввода с клавиатуры и поэтому в данной главе имеется очень мало примеров программирования на низком уровне. Однако содержится обсуждение вопроса о том, как перепрограммировать прерывание клавиатуры.


Очистка
буфера клавиатуры.

Программа должна очистить буфер клавиатуры, перед тем, как выдать запрос на ввод, исключая тем самым посторонние  нажатия  клавиш, которые могут к тому времени накопиться в буфере. Буфер может накапливать до 15 нажатий на клавишу,  независимо от того, являются ли  они  однобайтными  кодами ASCII или двухбайтными расширенными кодами.  Таким образом, буфер должен отвести два байта памяти для каждого нажатия на клавишу. Для однобайтных кодов первый байт содержит код ASCII,  а второй - скан-код клавиши. 

Для  расширенных кодов  первый байт содержит ASCII 0,  а второй номер расширенного кода.  Этот код обычно совпадает со  скан-кодом  клавиши,  но  не всегда,  поскольку
некоторые клавиши могут комбинироваться с клавишами сдвига для генерации различных кодов. Буфер устроен как циклическая очередь,  которую называют также буфером FIFO (первый вошел - первый ушел).  Как и любой буфер  он занимает непрерывную  область адресов памяти.  Однако не имеется определенной ячейки памяти,  которая хранит "начало строки" в буфере.  Вместо  этого два указателя хранят позиции головы и хвоста строки символов, находящейся в буфере в текущий момент. Новые нажатия клавиш запасаются в позициях, следующих за хвостом (в более старших адресах памяти) и  соответственно  обновляется  указатель хвоста буфера.  После того, как израсходовано все буферное пространство,  новые символы продолжают вставляться,  начиная с самого начала буферной области;  поэтому возможны ситуации, когда голова строки в буфере имеет больший адрес,  чем хвост.  После того  как буфер  заполнен,  новые  вводимые символы игнорируются,  при этом прерывание клавиатуры выдает гудок через динамик.

В то время как указатель на голову установлен на  первый введенный символ,  указатель на хвост установлен на позицию за последним введенным символом.  Когда оба указателя равны,  то буфер пуст.  Чтобы разрешить ввод 15 символов требуется 16-я пустая позиция,  2 байта которой  всегда  содержат  код  возврата  каретки (ASCII 13) и скан-код клавиши <Enter>,  равный 28. Эта пустая позиция непосредственно предшествует  голове строки  символов.  32 байта буфера начинаются с адреса 0040:001E. Указатели на голову и хвост расположены по адресам 0040:001A и 0040:001C, соответственно.  Хотя  под  указатели  отведено 2 байта,  используется только младший байт. Значения указателей меняются от 30 до 60, что соответствует позициям в области данных BIOS. Для очистки буфера надо просто установить значение ячейки 0040:001A равным значению ячейки 0040:001C.

Отметим, что программа имеет возможность вставлять  символы в буфер, завершая строку символом возврата каретки и соответственно меняя значения указателей.  Если это проделать правильным образом перед завершением программы,  то при возврате управления в MS DOS эти символы будут считаны и может  быть автоматически  загружена другая программа. Средний уровень. Функция 0C прерывания 21H выполняет любую из функций ввода с клавиатуры 1,  6,  7,  8 и A (описанных в этой главе), но перед этим чистит буфер клавиатуры. Надо просто поместить номер функции ввода в AL, очистка буфера перед ожиданием нажатия клавиши

;очистка буфера перед ожиданием нажатия клавиши

MOV AH,0CH

;выбираем функцию DOS 0CH

MOV AL,1

;выбираем  функцию ввода
символа

INT 21H

;чистим буфер, ждем ввода


Низкий уровень.Как и в примере высокого уровня  делаем  значение указателя  на хвост равным значению указателя на голову.  Для избежания влияния прерывания клавиатуры запрещаем прерывания на  время модификации указателя:

;выравниваем значения указателей на голову и хвост

CLI

;запрещаем прерывания

SUB  AX,AX

;обнуляем  регистр

MOV   ES,AX

;добавочный  сегмент - с начала памяти

MOV AL,ES:[41AH]

;берем указатель на голову буфера

MOV  ES:[41CH],AL 

;посылаем его в указатель хвоста STI

;разрешаем прерывания



Проверка символов в буфере


Вы можете проверить был ли ввод с клавиатуры, не удаляя символ из буфера клавиатуры. Буфер использует два указателя, которые от мечают  голову  и хвост очереди символов,  находящихся в буфере в текущий момент.  Когда значения этих указателей равны,  то  буфер пуст.  Надо  просто  сравнить содержимое ячеек памяти 0040:001A и 0040:001C.  (Нельзя
просто проверить символ, находящийся в голове очереди, поскольку буфер организован в виде циклической очереди и позиция ее головы постоянно меняется). Средний уровень. 
Функция 0BH прерывания 21H возвращает значение 0FFH в регистре AL, когда  буфер  клавиатуры  содержит  один или более символов и значение 0, когда буфер пуст:

;проверка наличия символа в буфере
MOV AH,0BH

;номер функции INT 21H

;вызываем прерывание 21H CMP

AL,0FFH

;сравниваем с 0FFH JE GET_KEYSTROKE

;переход если  буфер не пуст.

Функция 1 прерывания BIOS 16H предоставляет ту же возможность, но,  кроме того, показывает какой символ в буфере. Флаг нуля (ZF) сбрасывается,  если буфер пуст,  и устанавливается, если в буфере имеется символ.  В последнем случае копия символа, находящегося в голове буфера, помещается в AX, но символ из буфера не удаляется. В AL возвращается код символа  для  однобайтных  символов  ASCII, иначе ASCII 0 для расширенных кодов, и тогда номер кода - в AH.


;---проверяем наличие символа в буфере

MOV AH,1

;номер функции

 INT 16H

;проверка наличия символа

JZ   NO_CHARACTER

;переход если ZF = 1

;имеется символ - смотрим какой
  
CMP AL,0

;это расширенный код?  JE EXTENDED_CODE

;если да,  то на другую ветку




Низкий уровень. Как и в примере высокого уровня просто сравниваем
указатели:



;сравниваем указатели на голову и хвост

MOV AX,0

;устанавливаем добавочный сегмент

MOV ES,AX

;на начало   памяти

MOV   AL,ES:[41AH]

;берем 
один  указатель

MOV  AH,ES:[41CH]


;берем другой указатель

CMP AH,AL

;сравниваем 
их



JNE
GET_KEYSTROKE

;если неравны, то к процедуре ввода



Ожидать ввод символа и не выводить его на экран.

Обычно вводимые
символы выводятся на экран,  чтобы было
видно,
что напечатано.  Но
иногда автоматическое эхо на  экране  нежелательно. 
Например,  выбор пункта меню по
нажатию клавиши.  Иногда надо сначала проверить вводимые символы на ошибку  перед 
выводом на экран.  В
частности, любая программа, обрабатывающая расширенные коды,  должна
избегать автоматического эха,  так как
при этом первый  байт  этих 
кодов  (ASCII  0) 
будет выводиться на экран, вставляя пробелы между символами.

Средний уровень. Функции  7  и 8 прерывания 21H ожидают ввода символа,
если буфер клавиатуры пуст, а когда он появляется, то не выводится
на экран. При этом функция 8 определяет Ctrl-Break (и
инициирует  процедуру обработки Ctrl-Break), а функция 7 не реагирует на
него. В обоих случаях символ 
возвращается  в AL. Когда AL
содержит ASCII 0, то получен расширенный код.  Повторите прерывание и в AL  появится второй байт расширенного кода.

;---получаем введенный символ



MOV AH,7

;номер функции

INT 21H

;ожидаем ввод  символа

CMP AL,0

;проверка 
на  расширенный код

JE
EXTENDED_CODE

;если да, то на
особую процедуру

;иначе, код символа в AL
Категория: IT-Технологии | Добавил: astrolon (22.03.2013)
Просмотров: 1496 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Форма входа

Поиск

Друзья сайта


$$$ Зарабатывайте на своем сайте


Экономим вместе. Делимся опытом

Ресурс векторних зображень


Скутер-центр

База знаний от Димона

Зелеминский Форум Медведя

Bozhyk

Стеклим балконы

Борьба с мошенничеством



скорость интернет соединения

Разные релизы Ubuntu

PRCY.ru

Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0