::Главная страница :: Assembler :: Статьи ::
Организация буфера клавиатуры.
 Формирование ASCII кодов.

     Записанная в ПЗУ BIOS подпрограмма обработки  прерывания 09H,
вызванного  процессором  клавиатуры при нажатии (отжатии) клавиши,
читает скан-код из порта 60H и, если это скан-код клавиши-переклю-
чателя (правый Shift, левый Shift, Ctrl, Alt, ScrollLock, NumLock,
CapsLock  и  Insert),  то  изменяется  содержимое   ячеек   памяти
0040:0017H и 0040:0018H,  хранящих состояния клавиш-переключате-
лей.  В буфер клавиатуры при этом ничего  не  пишется  (исключение
составляет  клавиша Insert).  В таблице 1 приведен формат байта по
адресу 0040:0017H, а в таблице 2 - по адресу 0040:0018H.

                                 Таблица 1
         Формат байта по адресу 0040:0017H
     --------------------------------------
      Бит     Значение, когда бит=1
     --------------------------------------
       0      нажата клавиша правый Shift
       1      нажата клавиша левый Shift
       2      нажата клавиша Ctrl
       3      нажата клавиша Alt
       4      режим ScrollLock включен
       5      режим NumLock включен
       6      режим CapsLock включен
       7      режим вставки включен
    ----------------------------------------

                                             Таблица 2
           Формат байта по адресу 0040:0018H.
    --------------------------------------------------
      Бит     Значение, когда бит=1
    --------------------------------------------------
       0      нажаты клавиши левый Shift вместе с Ctrl
       1      нажаты клавиши левый Shift вмести с Alt
       2      нажата клавиша SysReq
       3      нажаты клавиши Ctrl вместе с NumLock
       4      режим ScrollLock включен
       5      режим NumLock включен
       6      режим CapsLock включен
       7      режим вставки включен
     ---------------------------------------------------
    Состояния клавиш-переключателей  могут быть изменены программно.
    Если же это скан-код клавиши,  не являющейся переключателем, то
в  соответствии  с ее скан-кодом и состоянием клавиш-переключателей
формируется или однобайтный ASCII код данной клавиши, который вмес-
те  со  скан-кодом записывается в буфер клавиатуры,  или двубайтный
расширенный код, первым байтом которого является 0, а второй байт в
большинстве  случаев  совпадает со скан-кодом.  Эти два байта также
записываются в буфер клавиатуры. При отжатии клавиши в буфер ничего
не  записывается  и изменяется только состояние клавиш-переключате-
лей.
    Программа обработки  прерывания 09H отслеживает также некоторые
комбинации клавиш.  В табл.3 приведены эти комбинации  и  действия,
выполняемые обработчиком прерывания при их обнаружении:
                                                       Таблица 3
                          Функции клавиш
   --------------------------------------------------------------
    Комбинация клавиш   Выполняемые действия
   --------------------------------------------------------------
    Ctrl-Alt-Del       Сброс и перегрузка системы
    Ctrl-NumLock       Перевод машины в состояние ожидания
    Shift-PrtSc        Распечатка на принтере содержимого экрана
                       (обработка прерывания 05H)
    Ctrl-Break         Завершение выполнения программы
   ---------------------------------------------------------------
     Структура буфера  клавиатуры  изображена  на   рис.1.   Буфер
клавиатуры  расположен  по адресам 0040:001H - 0040:003cH опера-
тивной памяти и позволяет накапливать данные (ASCII и скан-коды) о
15 нажатиях клавиш (на месте, предшедствующем началу строки симво-
лов в буфере хранятся ASCII код возврата каретки (ASCII 13) и скан
-код клавиши "Enter").
     В ячейке 0040:001aH (указатель начала) хранится адрес перво-
го введенного символа, а в ячейке 0040:001cH (указатель хвоста) -
адрес первой свободной ячейки после последнего введенного символа.
Адреса  хранятся  в виде байта смещения (второй байт ячейки не ис-
пользуется). Если буфер пуст,  то содержимое указателя начала сов-
падает с содержимым указателя хвоста.
                 15           0
                +--------------+
0040:003с  ¦              ¦
                +--------------¦
            3a  ¦              ¦      Содержимое ячейки буфера
                +--------------¦
            38  ¦              ¦      15        8  7          0
                +--------------¦     +-------------------------+
            36  ¦              ¦     ¦ скан-код   ¦     ASCII  ¦
                +--------------¦     +-------------------------+
            34  ¦    "R"       ¦
                +--------------¦      если ASCII код равен 0, то
            32  ¦    "E"       ¦      вместо скан-кода указывается
                +--------------¦      номер расширенного кода
            30  ¦    "F"       ¦      (в большинстве случаев сов-
                +--------------¦       падающего со скан-кодом)
            2e  ¦    "F"       ¦
                +--------------¦
            2c  ¦    "U"       ¦
                +--------------¦
            2a  ¦    "B"       ¦
                +--------------¦
            28  ¦              ¦
                +--------------¦
            26  ¦              ¦
                +--------------¦
            24  ¦              ¦
                +--------------¦
            22  ¦              ¦
                +--------------¦
            20  ¦              ¦
                +--------------¦
            1e  ¦              ¦
                +--------------¦
            1c  ¦     36       ¦  Указатель хвоста
                +--------------¦
     0040:001a  ¦     2a       ¦  Указатель начала
                +--------------+
                               Рис.1
     Запись в буфер осуществляется по адресу указателя хвоста, при
этом  содержимое  указателя  увеличивается на 2.  Чтение из буфера
производится по адресу указателя начала,  при этом содержимое ука-
зателя  также  увеличивается  на  2 (если указатель содержит адрес
последней ячейки буфера - 3cH,  то вместо увеличения на 2  в  него
необходимо записать адрес начала буфера - 1H).


(c) Национальный Технический Университет
"Харьковский Политехнический Институт"
Харьков 2001
А.И.Поворознюк,
И.С.Зыков,
С.Ю.Леонов


Тематические ссылки
Ваша ссылка Ваша ссылка

Обмен кнопками, ведение статистики, реклама.