Меню сайта

Урок 159. Клавиатура ( данные клавиатуры )

Программы BIOS, обслуживающие клавиатуру, дают примеры различной
— — — программной техники. — Прежде всего программы обслуживания
— — — клавиатуры BIOS имеют большой обработчикпрерываний, который
— — — преобразует коды сканирования клавиатуры вкоды ASCII. — Обработчик
— — — прерываний обслуживает обычные ирегистровые клавиши. — Программа
— — — обслуживания клавиатуры также поддерживаеткольцевой буфер длиной
— — — 15 символов, позволяя вам печататьбыстрее, чем программа может
— — — обрабатывать нажатия клавиш.

Данные клавиатуры


— — — Поле данных программ клавиатуры начинаетсяу смещения 17H в
— — — сегменте DATA. — Две флаговых переменных, KB_FLAG и KB_FLAG_1, имеют
— — — битовое значение и отслеживают текущееположение регистровых
— — — клавиш. -За определением этих переменных следуют выражения,
— — — показывающие назначение их битов. — Например, бит 3 переменной
— — — KB_FLAG следит за состоянием клавишиALT. — Если она нажата, этот
— — — бит равен 1. — Если клавиша ALT не нажата, бит равен 0. — Биты
— — — переменной KB_FLAG определяют текущеесостояние всех регистровых
— — — клавиш, обычных и триггерных. — Триггерные клавиши управления
— — — регистрами используют биты переменнойKB_FLAG_1. — Эти клавиши
— — — изменяют состояние клавиатуры всякий раз,когда нажимаются.
— — — Например, клавиша CAPS LOCK переключаетклавиатуру с больших букв
— — — на маленькие и наоборот каждый раз, когданажимается.

— — — — — BIOS использует биты переменной KB_FLAG_1для того, чтобы
— — — отслеживать, нажата ли в текущий моментклавиша CAPS LOCK (а также
— — — другие триггерные клавиши). BIOS должнаотслеживать их из-за того,
— — — что все клавиши клавиатуры имеютвстроенную функцию автоповторения
— — — по прошествии некоторого времени. Если быBIOS переключала бит
— — — CAPS_STATE каждый раз, когда получала код»нажатия» от клавиши CAPS
— — — LOCK, автоповторение клавиши сделало быневозможным для оператора
— — — определение текущего состояния клавиатуры.BIOS переключает бит
— — — клавиши CAPS_STATE, когда поступает первыйкод нажатия. Затем
— — — программа BIOS игнорирует все коды нажатиядо тех пор, пока он не
— — — получит код отпускания от клавиши CAPSLOCK, означающий, что
— — — клавиша отпущена.

— — — — — BIOS использует переменную ALT_INPUT дляобеспечения
— — — специального режима ввода в альтернативномрегистре. Когда нажата
— — — клавиша альтернативного регистра, можноввести десятичное число с
— — — помощью цифровой клавиатуры. Когда клавишаальтернативного регистра
— — — отпускается, программа клавиатурывозвращает символ кода ASCII,
— — — соответствующий этому десятичному числу.Такая техника позволяет
— — — оператору вводить в IBM PC любые символы,даже если их нет на
— — — клавиатуре. Например, нажмите клавишу ALT,затем напечатайте с
— — — помощью цифровой клавиатуры 1, 1, 1 иотпустите клавишу ALT.
— — — Появится символ «o». Этот символимеет код со значением 111 в коде
— — — ASCII.

— — — — — Переменная ALT_INPUT хранит текущеезначение кода, который
— — — вводится в альтернативном регистре. Когдана цифровой клавиатуре
— — — печатается цифра, и состояние клавиатурыпоказывает, что включен
— — — альтернативный регистр, программа BIOSумножает текущее значение
— — — переменной ALT_INPUT на 10, и прибавляет кнему новое число. Когда
— — — клавиша альтернативного регистраотпускается, в переменной
— — — ALT_INPUT содержится введенный символ.Обычно переменная ALT_INPUT
— — — устанавливается равной нулю, и программаBIOS не считает нулевое
— — — значение правильным результатом ввода вальтернативном регистре.
— — — Это позволяет оператору использоватьклавишу альтернативного
— — — регистра вместе с другими клавишами,нажимая и отпуская ее (как это
— — — делается в интерпретаторе языка Бейсик,где ALT-A порождает строку
— — — символов AUTO и не вводя при этом кода 0 вмомент отпускания этой
— — — клавиши.

— — — — — Остальные переменные поддерживают буферклавиатуры. По мере
— — — того, как на клавиатуре печатаютсясимволы, возникают прерывания.
— — — Программа KB_INT, входящая в BIOSпринимает прерывание от
— — — клавиатуры, читает код сканирования изпорта 60H, и опре
деляет код
— — — ASCII этой клавиши. Затем программа BIOSзаписывает это значение в
— — — буфер клавиатуры KB_BUFFER. В этом буфереесть 16 слов — каждая
— — — клавиша записывается в виде слова. Первыйбайт — это код ASCII
— — — клавиши, второй байт — код сканированияили расширенный код
— — — сканирования клавиши. Использованиерасширенного кода сканирования
— — — позволяет передавать в прикладнуюпрограмму символы, которые не
— — — имеют кода ASCII.

— — — — — У буфера есть два указателя. ПеременнаяBUFFER_HEAD содержит
— — — смещение первого символа в буфере всегменте DATA, соответствующего
— — — клавише, нажатой раньше других. ПеременнаяBUFFER_TAIL указывает на
— — — символ, соответствующий самой последнейнажатой клавише. Если
— — — указатели имеют одинаковые значения, буферпуст.

— — — — — Когда обработчик прерывания BIOS реагируетна очередное нажатие
— — — клавиши, при котором должен бытьсгенерирован символ, он помещает
— — — этот символ в буфер. Если буфер незаполнен, обработчик прерывания
— — — помещает символ по адресу, на которыйуказывает переменная
— — — BUFFER_TAIL. Затем он увеличиваетпеременную BUFFER_TAIL на два,
— — — чтобы указывать на следующую ячейкубуфера. Если увеличение
— — — указателя перемещает его за пределыбуфера, указатель перемещается
— — — на начало буфера. Это означает, что буферклавиатуры «закольцован».
— — — После шестнадцатого нажатия очереднойсимвол попадает в начало
— — — буфера. Такая организация буфера такженазывается циклической, так
— — — как позиции буфера образуют замкнутыйцикл, а не расположены в ряд.

— — — — — Программа клавиатуры BIOS, вызываемая покоманде INT 16H, имеет
— — — три функции. — Одна из них удаляет символ из буфера. — Указатель
— — — BUFFER_HEAD указывает на первый символбуфера. — Если буфер не пуст,
— — — (что получается, если указатель началаравен указателю конца), BIOS
— — — удаляет слово по указателю BUFFER_HEAD иувеличивает указатель
— — — начала на два. — Если указатель превышает значение указателя
— — -BUFFER_END, он перемещается назад в начало буфера. — — — — — Подпрограмма K4
— — — в программе клавиатуры BIOS обеспечиваетсдвиг указателя и, если
— — — необходимо, его перенос в начало.

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

— — — — — На Фиг. 9.3 показан листинг программы наязыке ассемблера,
— — — которая прибавляет единицу кчетырехбайтовому целому числу всякий
— — — раз, когда она проходит через цикл. Когдаоператор нажимает клавишу
— — — пробела, происходит выход из программы.Эта программа использует
— — — две функции BIOS. Когда регистр AHустановлен в 1, BIOS возвращает
— — — состояние буфера клавиатуры. Еслиустановлен флаг нуля, символа
— — — нет. Если символ есть, программа должнатакже прочитать этот
— — — символ, иначе он останется в буфере до техпор, пока следующая
— — — программа (или эта же, но позднее) незапросит символ. В этом
— — — примере символ из буфера извлекаетсявызовом функции программы
— — — обслуживания клавиатуры BIOS с нулевымзначением в регистре AH.
— — — BIOS возвращает символ в регистре AL, ипрограмма сравнивает
— — — значение символа с пробелом. Этот примерпоказывает, как можно
— — — организовать проверку определенногосимвола в каждом проходе цикла.

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

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