Контроллер клавиатуры

Здесь приводятся выдержки из файла kbd.def.

Основой послужила книга «Руководство по архитектуре IBM PС AT» / Ж.К. Голенкова, А.В. Заболоцкий, М.Л. Мархасин и др.; Под общ. ред. М.Л. Мархасина. — Минск: ООО «Консул», 1992. — 949 c.: ил.

Структура контроллера клавиатуры

Структура контроллера клавиатуры 8042, установленного на материнской плате приведена ниже

Выходной буфер (8-разрядный регистр) доступен системе только как читаемый порт с адресом 60h, он используется для передачи системе полученных от клавиатуры кодов сканирования и прочитанных по команде системы байтов данных. Выходной буфер должен быть прочитан только после того, как установлен признак "буфер полон" (Разряд 0 регистра состояния).

Входной буфер (8-разрядный регистр) доступен системе только как записываемый порт с адресом 60h (устанавливается флажок, указывающий на последующую запись данных) или 64h (устанавливает флажок, указывающий на последующую запись команды). Данные, записанные в порт 60h, отсылаются клавиатуре, если не являются командой контроллера. Данные должны быть записаны во входной буфер только после того, как сброшен признак "буфер полон" (разряд 1 регистра состояния).

Регистр состояния клавиатуры (8 разрядов) доступен системе только как читаемый порт с адресом 64h. Назначение разрядов приведено ниже.



Назначение разрядов регистра состояния (только читаемый порт 64h).
Разряд Назначение
0 0 — В выходном буфере нет новых данных; 1 — Контроллер поместил новые данные в выходной буфер, но система ещё не приняла их, когда система прочитает значение порта 60h, разряд станет нулевым.
1 0 — входной буфер пуст (порт 60h или 64h) 1 — система поместила данные во входной буфер, но контроллер их ещё не принял. После того, как контроллер их прочитает этот разряд станет нулевым.
2 0 — сброс по включению питания (холодный пуск); 1 — программный сброс (горячий пуск).
3 0 — во входном буфере данные (запись производилась по адресу 60h) 1 — во входном буфере команда (запись производилась по адресу 64h)
4 0 — защитный замок закрыт; 1 — защитный замок открыт
5 1 — Тайм-аут передачи. Передача данных, начатая контроллером не завершена
6 1 — Тайм-аут приёма. Передача данных, начата клавиатурой, но не завершена в запрограммированный промежуток времени (2 мс)
7 1 — Ошибка паритета. Последний байт данных был получен от клавиатуры с чётным паритетом. Клавиатура должна посылать байт с нечётным паритетом.


В приведённой ниже таблице указаны причины ошибки при различных комбинациях пятого, шестого и седьмого битов регистра состояния.



Причины ошибки контроллера клавиатуры
Разряды    Причина ошибки
7 6 5
0 0 1 Нет синхроимпульса
0 1 1 Есть синхроимпульс, нет отклика
1 0 1 Есть синхроимпульс, ошибка паритета


В файле kbd.def определены следующие константы для портов:

QKBDState        equ  64h  ; Порт состояния контроллера клавиатуры (только читаемый)
QKBDIn           equ  64h  ; Адрес входного буфера (только записываемый)
QKBDOutp         equ  60h  ; Адрес выходного буфера (только читаемый)
QeKBDCtrl1       equ  64h  ; Командный порт контроллера клавиатуры 1. В него
                           ; помещается первый командный байт
QeKBDCtrl2       equ  60h  ; Командный порт контроллера клавиатуры 2. В него
                           ; помещается второй командный байт

Макросы в kbd.def проверяют следующие биты регистра состояния (Cm… — маска, F… — номер бита).

CmKBDOutFull     equ  00000001b      ; Выходной буфер полон,
FKBDOutFull      equ  0              ;     если бит установлен

CmKBDInpFull     equ  00000010b      ; Входной буфер полон,
FKBDInpFull      equ  1              ;     если бит установлен

CmKBDErr         equ  11100000b      ; Ошибка данных работы с клавиатурой
FKBDErr          equ  5

Для работы с контроллером клавиатуры в файле kbd.def определены следующие макросы.

KBDInpBufFree BufFull — проверяет, свободен ли входной буфер (возможна ли запись в него), Если нет, то выход по метке BufFull. Портит CF. В AL помещается байт состояния контроллера клавиатуры.


   KBDInpBufFree macro BufFull

KBDWtInpBufFree — ждёт, когда выходной буфер станет свободным. Портит CF, AL. В AL помещается байт состояния контроллера клавиатуры


    KBDWtInpBufFree

KBDOutpBufFull ExErr — проверяет, есть ли данные в выходном буфере. Если данных нет, то выход по метке ExErr. Портит AL.


    KBDOutpBufFull macro ExErr

KBDOutpBufFree — освобождает выходной буфер.


    KBDOutpBufFree

KBDWtOuputBufFull — ждёт, когда во входной буфер поступят данные. Портит AL.


    KBDWtOuputBufFull

OutputBufFree ExErr — проверяет, есть ли данные в выходном буфере. Если данные есть, то выход по метке ExErr. Портит AL.


    OutputBufFree ExErr

KBDInterfaceError ExErr — проверяет, произошла ли ошибка при работе с клавиатурой. Если да, то выход по метке ExErr. Портит AL.


    KBDInterfaceError ExErr



Назначение разрядов входного порта
Разряд Назначение
0 Резерв изготовителя (состояние перемычки)
1 Резерв изготовителя
2 Резерв изготовителя
3 Резерв изготовителя
4 Объём ОЗУ на системной плате
5 Резерв изготовителя
6 Тип первичного монитора (0 — цветной, 1 — черно-белый)
7 Замок клавиатуры (0 — заблокирована, 1 — разблокирована)


Назначение разрядов выходного порта
Разряд Назначение
0 Системный сброс
1 Gate A20
2 Резерв изготовителя
3 Резерв изготовителя
4 Выходной буфер полон
5 Входной буфер пуст
6 Синхросигнал клавиатуры (выход)
7 Данные клавиатуры (выход)


Наиболее важны следующие разряды выходного порта, определённые в kbd.def:

FKBDPCReset       equ     0h ; Системный сброс (флаг сброшен), до 486.
FKBDGateA20       equ     1h ; Разрешить A20   (флаг установлен)

На процессорах, начиная с 586, бит 0 к системному сбросу уже не подключён.

Для управления контроллером клавиатуры используются следующие команды



Коды команд контроллера 8042 (порт вывода 64h)
Код Функция
20h Поместить текущий командный байт в порт 60h
60h Загрузить новый командный байт, это часть двухбайтовой операции. Чтобы записать новый командный байт необходимо: а) в порт 64h поместить 60h, б) записать в порт 60h командный байт. Командный байт определет режим работы контроллера клавиатуры.
A5h Специальное чтение. 8042 помещает в выходной буфер истинное значение выходного порта 2 за исключением разрядов 4 и 5, которым даётся следующее определение 5: =0 - клавиатура XT, =1 - клавиатура AT; 4: =0 - запрещено прерывание по заполнению выходного буфера, =1 - разрешено прерывание.
AAh Инициализация. 8042 инициализирует порты 1 и 2, запрещает клавиатуру и очищает указатели буфера. После этого, помещает в выходной буфер 55h
ABh Контроль интерфейса клавиатуры. Выходной буфер после тестирования будет содержать: 00h — нет ошибок; 01h — линии синхронизации клавиатуры остаётся нулевой; 02h — линия синхронизации клавиатуры остаётся единичной; 03h — линия данных клавиатуры остаётся нулевой; 04h — линия данных клавиатуры остаётся единичной.
ACh Резерв для диагностики
ADh Запретить клавиатуру (устанавливает разряд 4 командного байта 8042, который запрещает интерфейс клавиатуры). До разрешения клавиатуры данные не передаются и не принимаются.
AEh Разрешить клавиатуру. Сбрасывает разряд 4 командного байта, который разрешает клавиатуру
C0h Прочитать входной порт. Передаёт содержимое входного порта в выходной буфер (порт 60h), использовать только при пустом выходном буфере
D0h Прочитать выходной порт. Передаёт содержимое выходного порта в выходной буфер (порт 60h), использовать только при пустом выходном буфере
D1h Поместить байт, записанный по адресу 60h в выходной порт, разряд 0 не должен быть нулевым, т. к. иначе система перезагрузится.
E0h Прочитать входы TEST0 и TEST1. После выполнения 0-ой бит порта 60h содержит TEST0, а 1-ый бит — TEST1
F0h–FFh Пульсация разрядов выходного порта. Может быть вызвана пульсация разрядов 0–3 выходного порта (перевод в нулевое состояние на 2–6 мкс). Разряды 0—3 в этой команде указывают, какой разряд выходного порта должен пульсировать.


Константы команд управления контроллером клавиатуры, определённые в kbd.def:

CeqKBDGetCmd     equ   020h  ; Читать командный байт из клавиатуры
CeqKBDSetCmd     equ   060h  ; Послать команду в контроллер клавиатуры
CeqKBDRdOutBuf   equ   0a5h  ; Читает выходной порт за исключением битов 4 и 5, которые
                             ;    трактуются иначе (см. табл.)
CeqKBDCtrlIni    equ   0aah  ; Инициализация портов, запрет клавиатуры, очистка указателей
                             ;    буферов, затем в выходной буфер помещается 55h
CeqKBDChkIntrf   equ   0abh  ; Контроль интерфейса 00h - ошибок нет
CeqKBDDumpRes    equ   0ach  ; Резерв диагностирования
CeqKBDIntrfDes   equ   0adh  ; Запрет интерфейса клавиатуры
CeqKBDIntrfEna   equ   0aeh  ; Разрешение клавиатуры
CeqKBDRdInpPort  equ   0c0h  ; Читать входной порт
CeqKBDRdOutPort  equ   0d0h  ; Читать выходной порт
CeqKBDWrOutPort  equ   0d1h  ; Записать в выходной порт
CeqKBDRdTestPort equ   0e0h  ; Читать выходы клавиатуры
CeqKBDPulsOutBuf equ   0f0h  ; Пульсация  разрядов 0-3 выходного порта F0h-FFh, последние
                             ; четыре бита указывают какой разряд должен пульсировать

Коды ответов контроллера клавиатуры


KBDEndOfInit      equ     055h     ; Окончание инициализации клавиатуры

Для записи в выходной порт необходимо ввести команду D1h по адресу 64h, затем ввести нужное значение данных для выходного порта по адресу 60h.

Чтобы прочитать значение выходного порта необходимо ввести команду D0h по адресу 64h, затем прочитать данные по адресу 60h. Команда должна вводиться только когда выходной буфер пуст. При изменении состояния бита, управляющего адресной линией A20, программа, чтобы нормально продолжать работу, должна быть уверена, что бит установлен правильно. Для этого рекомендуется в контроллер выдавать холостую команду после последовательности записи в порт нужного значения. После выполнения этой холостой команды программа может быть уверена, что предыдущая команда выполнена и разряд адреса A20 установлен аппаратно на требуемое значение. Нельзя использовать команду D1 для изменения любого разряда, кроме первого.

Данные в выходном буфере (порт 60h) — это данные клавиатуры, только если контроллер не получил определённую команду.

  1. 64h — Прочитать регистр состояния 8042;
  2. 64h — вывести команду 8042;
  3. 60h — Прочитать данные клавиатуры или ответ на команду;
  4. 60h — Вывести данные на клавиатуру или второй байт команды.

В kbd.def определены следующие макросы работы с контроллером клавиатуры

KBDPCReset осуществляет сброс системы, путём подачи команды пульсации нулевого разряда выходного порта. Работает до 486.


KBDPCReset

KBDDesable запрещает клавиатуру. Макрос должен вызываться при пустом входном буфере. Портит al.


   KBDDesable

KBDEnable разрешает клавиатуру. Макрос должен вызываться при пустом входном буфере. Портит al.


   KBDEnable

KBDSetA20 JGateA20AlreadySet устанавливает линию GateA20. Необязательный параметр JGateA20AlreadySet — метка, по которой выполняется переход, если A20 была установлена до выполнения макроса. Портит ax.


   KBDSetA20 JGateA20AlreadySet

KBDResetA20 JGateA20AlreadyReset сбрасывает линию GateA20 Необязательный параметр JGateA20AlreadyReset — метка, по которой выполняется переход, если A20 была сброшена до выполнения макроса. Портит ax.


    KBDResetA20 JGateA20AlreadyReset

KBDResetSystem — дожидается, когда входной буфер будет пуст, и сбрасываеть систему. Только для ПК не старше 486 и не под управлением windows.


    KBDResetSystem

Режимы работы контроллера клавиатуры определяются разрядами, установленными командой 60h.



Назначение разрядов байта для команды 60h
Разряд Назначение
00 — не генерировать прерывание по заполнению выходного буфера, 1 — генерировать;
1Резерв, должен быть равным нулю;
2Системный флажок. Записывается во второй разряд регистра состояния.
30 — подчиниться защитному замку; 1 — игнорировать защитный замок
40 — разрешить интерфейс клавиатуры; 1 — запретить.
50 — использовать 11-разрядные коды клавиатуры (PC AT); 1 — использовать коды клавиатуры, совместимые с PC XT
60 — не преобразовывать коды клавиатуры в IBM PC совместимый; 1 — преобразовывать коды клавиатуры в совместимые с XT.
7Резерв, должен быть равным нулю


CmKBDIntEn       equ     00000001b ; Разрешить прерывания
CmKBDLockIgnore  equ     00001000b ; Отменить блокировку замка
CmKBDIntrfDes    equ     00010000b ; Запретить интерфейс клавиатуры
CmKBDKeybXT      equ     00100000b ; Работать с XT клавиатурой
CmKBDModeXT      equ     01000000b ; Работать в режиме совместимости с XT клавиатурой и
                                   ; преобразовывать коды

Макрос KBDRdCmdByte читает командный байт контороллера клавиатуры в AL.


      KBDRdCmdByte

Макрос KBDWrCmdByte CmdByte записывает командный байт контороллера клавиатуры. CmdByte — значение командного байта, не должно быть регистром AL.


      KBDWrCmdByte CmdByte

Клавиатура

При каждой передаче команды или данных от системы на клавиатуру система требует подтверждения от клавиатуры. Если только система не запретит вывод данных с клавиатуры, последняя даёт ответ в течение 20 мс. Если ответ клавиатуры недействителен или содержит ошибку паритета, система повторно посылает ей команду или данные. Двухбайтовые команды требуют особой обработки. Если переданы и подтверждены команды команды F3h, F0h или EDh, а также передан байт данных, но ответ оказался недействительным или с ошибкой паритета, то система передаст повторно и команду и байт данных.

Клавиатура AT имеет 3 режима работы:

Здесь будет рассматриваться в основном режим 3. В этом режиме должно быть запрещено преобразование кодов у контроллера клавиатуры, т. к. он не может обрабатывать этот набор кодов сканирования. BIOS также не может обрабатывать этот код сканирования, поэтому прикладная система, использующая этот режим, должна обрабатывать их сама. Каждой клавише присвоен свой уникальный 8-разрядный код нажатия, который передаётся при нажатии клавиши. Код отжатия состоит из двух байтов первый — префикс отжатия (F0h), а второй идентичен коду нажатия данной клавиши. В этом наборе кодов каждая клавиша посылает только один код сканирования и состояние любой клавиши не зависит от состояния других.

За исключением клавиши Pause все клавиши работают на нажатие/отжатие и являются повторяемыми (т.е. при нажатой и удерживаемой клавише через определённые промежутки клавиатура посылает код нажатия этой клавиши). Если нажаты и удерживаются несколько клавиш, то повторяется код только той клавиши, которая была нажата последней. После её отпускания коды повторений перестают пересылаться, даже если ещё остаются нажатые клавиши. Если клавиша нажата во время запрета клавиатуры, то в буфер клавиатуры поступает только первый код нажатия.

Общение с клавиатурой происходит черз порт 60h.

QKEYB        equ  60h   ; Порт обмена с клавиатурой

Макрос KEYBReceive ждёт ответ от клавиатуры. Ответ клавиатуры в регистре al. Используется просто:


   KEYBReceive  macro

Макрос KEYBWtACK ждёт подтверждения от клавиатуры. У него два параметра: обязательный JNotACK и необязательный JResend. Если ответ от клавиатуры отличен от ACK, осуществляется переход по метке JNotACK Если указан параметр JResend, то если от клавиатуры поступает ответ Resend, выполняется переход по метке JResend. Выход: al — ответ клавиатуры.


   KEYBWtACK  macro  JNotACK:req, JResend

Макрос KEYBsend послает команду клавиатуре. Команда может содержать до трёх байт. Команды задаются параметрами CMD, CMD1 и CMD2. Коды команд клавиатуры см. ниже. Если параметр DontWaitACK пустой, то перед посылкой очередного байта (CMD1 или CMD2) ожидается приём подтверждения от клавиатуры. (После посылки CMD2 подтверждения не ожидается) Если DontWaitACK не пустой (любое значение), то ответ от клавиатуры не ожидается.


   KEYBsend     macro     CMD:req, CMD1, CMD2, DontWaitACK

Команды управления клавиатурой

CeqKEYBSetLEDs        equ     0edh       ; Установить индикаторы состояния. После получения
                                         ; команды возвращает ACK и ждёт байт конфигурации
                                         ; светодиодных индикаторов. После получения
                                         ; байта выдаёт  ACK и возобновляет сканирование.
                                         ; Двухбайтная команда.
   CmKEYBScrollLock   equ     00000001b  ; Зажечь ScrollLock
   FKEYBScrollLock    = 0
   CmKEYBNumLock      equ     00000010b  ; Зажечь NumLock
   FKEYBNumLock       = 1
   CmKEYBCapsLock     equ     00000100b  ; Зажечь CapsLock
   FKEYBCapsLock      = 2
   MKEYBLeds          equ     00000111b  ; Маска светодиодов

CeqKEYBecho           equ     0eeh    ; После получения этой команды клавиатура выдаёт echo.
                                      ; Используется для диагностики. Однобайтная команда.

CeqKEYBMode         equ     0f0h    ; Выбрать альтернативный режим работы клавиатуры  или указать
                                    ; текущий. Клавиатура подтверждает полученную команду ACK,
                                    ; сбрасывает выходные буферы и повторения клавиш и готовится
                                    ; к приёму байта конфигурации  и устанавливает новый режим
                                    ; или возвращает текущий. ACK возвращает? Двухбайтная команда.
  CKEYBCurMode      equ     00h     ; Выдать текущий режим
  CKEYBXTMode       equ     01h     ; Эмуляция XT
  CKEYBATMode       equ     02h     ; Режим по умочанию
  CKEYBATExtMode    equ     03h     ; Расширенный режим

Байт команды в диапазоне от EF до F1 — резервные. Это холостые однобайтные команды, которые клавиатура принимает и выдаёт ответ CeqKEYBResend, никаких других действий не предпринимается.


CeqKEYBNop          equ     0f1h    ;EF-F1- резерв - холостые команды

CeqKEYBExtKBD       equ     0f2h    ; Идентификатор расширенной клавиатуры. Передаётся при включении клавиатуры,
                                    ; клавиатура отвечает ACK и передаёт идентификатор клавиатуры KAnsExt
                                    ; (двухбайтный ответ), начиная с младшего байта.  Однобайтная команда.

CeqKEYBSetDelay     equ     0f3h    ; Установить частоту повторения клавиш. Клавиатура возвращает ACK и ждёт
                                    ; байт частоты повторения и  времени  задержки. Двухбайтная команда.

   ; Время задержки (вермя, в течение  которого  клавиша  должна  быть  удержана нажатой прежде, чем начнётся
   ; функция повторения)

     CKEYBWait250   equ       00000000b     ;  250  мс
     CKEYBWait500   equ       00100000b     ;  500  мс
     CKEYBWait750   equ       01000000b     ;  750  мс
     CKEYBWait1000  equ       01100000b     ; 1 000 мс

   ; Частота повторения (показывает, сколько раз в секунду клавиша повторяется)

     CKEYBRep30_0   equ       00000000b     ;  30,0
     CKEYBRep26_6   equ       00000001b     ;  26,6
     CKEYBRep24_0   equ       00000010b     ;  24,0
     CKEYBRep21_8   equ       00000011b     ;  21,8

     CKEYBRep20_0   equ       00000100b     ;  20,0
     CKEYBRep18_4   equ       00000101b     ;  18,4
     CKEYBRep17_1   equ       00000110b     ;  17,1
     CKEYBRep16_0   equ       00000111b     ;  16,0

     CKEYBRep15_0   equ       00001000b     ;  15,0
     CKEYBRep13_3   equ       00001001b     ;  13,3
     CKEYBRep12_0   equ       00001010b     ;  12,0
     CKEYBRep10_9   equ       00001011b     ;  10,9

     CKEYBRep10_0   equ       00001100b     ;  10,0
     CKEYBRep09_2   equ       00001101b     ;   9,2
     CKEYBRep08_6   equ       00001110b     ;   8,6
     CKEYBRep08_0   equ       00001111b     ;   8,0

     CKEYBRep07_5   equ       00010000b     ;   7,5
     CKEYBRep06_7   equ       00010001b     ;   6,7
     CKEYBRep06_0   equ       00010010b     ;   6,0
     CKEYBRep05_5   equ       00010011b     ;   5,5

     CKEYBRep05_0   equ       00010100b     ;   5,0
     CKEYBRep04_6   equ       00010101b     ;   4,6
     CKEYBRep04_3   equ       00010110b     ;   4,3
     CKEYBRep04_0   equ       00010111b     ;   4,0

     CKEYBRep03_7   equ       00011000b     ;   3,7
     CKEYBRep03_3   equ       00011001b     ;   3,3
     CKEYBRep03_0   equ       00011010b     ;   3,0
     CKEYBRep02_7   equ       00011011b     ;   2,7

     CKEYBRep02_5   equ       00011100b     ;   2,5
     CKEYBRep02_3   equ       00011101b     ;   2,3
     CKEYBRep02_1   equ       00011110b     ;   2,1
     CKEYBRep02_0   equ       00011111b     ;   2,0



CeqKEYBEnable       equ     0f4h    ; Разрешить клавиатуру. Возвращает код ACK, сбрасывает выходной буфер
                                    ; и начинает сканирование.  Однобайтная команда.

CeqKEYBDesable      equ     0f5h    ; Запрет по умолчанию. Всё сбрасывает, включая повторения клавиш, сбрасывает
                                    ; последнюю повторяемую клавишу, возвращает ACK, ожидает дальнейших команд.
                                    ; Однобайтная команда.

CeqKEYBSetDefault   equ     0f6h    ; Установить условия по умолчанию. Клавиатура посылает ACK, всё
                                    ; сбрасывает и продолжает сканирование Однобайтная команда.

Однобайтные команды


CeqKEYBSetKAR         equ     0F7h    ; Установить все клавиши только повторение
CeqKEYBSetKAPF        equ     0F8h    ; Установить все клавиши только нажатие\отжатие
CeqKEYBSetKAP         equ     0F9h    ; Установить все клавиши только нажатие
CeqKEYBSetKAPFR       equ     0FAh    ; Установить все клавиши повторение\нажатие\отжатие

После получения подтверждает KACK, очищает выходной буфер и продолжает сканирование (если оно было разрешено ранее). используется только в режиме 3.

Следующие команды установливают отдельные клавиши только повторение, только нажатие\отжатие, только нажатие. Клавиатура получает первый байт, посылает KACK, очищает выходной буфер, ждёт код клавиши (ScanCode), подтверждает его и ждёт следующей команды. Сканирование не возобновляется до тех пор, пока клавиатура не получит команду CeqKEYBEnable. Устанавливать можно несколько клавиш одновременно. Это многобайтные команды.

CeqKEYBSetK1R         equ     0fbh    ; установить отдельные клавиши только повторение
CeqKEYBSetK1PF        equ     0fch    ; установить отдельные клавиши только нажатие\отжатие
CeqKEYBSetK1P         equ     0fdh    ; установить отдельные клавиши нажатие


CeqKEYBResend   equ     0feh    ; Послать данные повторно. Клавиатура  посылает  последний байт, переданный системе.
                                ; Если предыдущим был  CeqKEYBResend,  то  передаётся байт переданный перед ним.
                                ; Однобайтная команда

CeqKEYBReset    equ     0ffh    ; Сброс. Клавиатура возвращает системе код ACK, и запрещается до получения
                                ; следующей команды или принятия системой KACK. Однобайтная команда

Коды ответов клавиатуры

; KOverFlow и KOverFlowXT - коды  переполнения буфера клавиатуры или ошибки (если не удаётся идентифицировать
;     замыкание  контактов на клавиатуре) при работе в режимах 2,3 и режиме 1. Однобайтовый ответ.
CKEYBOverflow    equ     00h     ; Переполнение в режимах 2,3
CKEYBOverFlowXT  equ     0ffh    ; Переполнение в режиме 1

CKEYBACK         equ     0fah   ; Подтверждение правильности команды (ACK). Передаётся в ответ на любую
                                ; правильную команду за исключением echo и resend. Если клавиатура прерывается
                                ; во время передачи KACK, то KACK  отменяется и начинается приём новой команды.
                                ; Однобайтовый ответ.

CKEYBPower       equ     0aah   ; При включении питания клавиатура передаёт этот код системе. Передача
                                ; любого другого указывает на неисправность клавиатуры. Однобайтовый ответ.

CKEYBecho        equ     0eeh   ; Однобайтовый ответ на команду echo.

CKEYBAnsExt      equ     83abh  ; Ответ на команду CeqKEYBExtKBD Первым передаётся младший байт. Двухбайтный ответ.

CKEYBReSend      equ     0feh   ; После получения неправильных входных данных или данных с ошибкой паритета.
                                ; Однобайтовый ответ.

Макросы

Макрос KBDEndOfInterrupt завершает обработку прерывания клваиатуры. Используется он так:


    KBDEndOfInterrupt

Сканкоды клавиш при работе клавиатуры в режимах 2 и 3

Сканкоды клавиш при работе клавиатуры в режиме 2 (с отключённой перекодировкой).



Цифры на основной клавиатуре
Обозначение Код в режиме 3 КлавишаЛат.
shift
Русск.
shift
ОбозначениеКод в режиме 2
CKBD3_0 45h 0 ) ) CKBD2_0 45h
CKBD3_1 16h 1 ! ! CKBD2_1 16h
CKBD3_2 1eh 2 @ " CKBD2_2 1eh
CKBD3_3 26h 3 # CKBD2_3 26h
CKBD3_4 25h 4 $ ; CKBD2_4 25h
CKBD3_5 2eh 5 % : CKBD2_5 2eh
CKBD3_6 36h 6 ^ , CKBD2_6 36h
CKBD3_7 3dh 7 & . CKBD2_7 3dh
CKBD3_8 3eh 8 * * CKBD2_8 3eh
CKBD3_9 46h 9 ( ( CKBD2_9 46h


Буквы и знаки на основной клавиатуре
Обозначение Код режима 3 Клавиша.Русск. ОбозначениеКод режима 3
CKBD3_tilde 0eh` ~ CKBD2_tilde 0eh
CKBD3_minus 4eh- _ CKBD2_minus 4eh
CKBD3_equal 55h= + CKBD2_equal 55h
CKBD3_OpenBrace 54h[ { Х CKBD2_OpenBrace 54h
CKBD3_CloseBrace5bh] } Ъ CKBD2_CloseBrace5bh
CKBD3_Semicolon 4ch; : Ж CKBD2_Semicolon 4ch
CKBD3_Apostophe 52h' " Э CKBD2_Apostophe 52h
CKBD3_Zapyataya 41h, < Б CKBD2_Zapyataya 41h
CKBD3_dot 49h. > Ю CKBD2_dot 49h
CKBD3_Slash 4ah/ ? ё CKBD2_Slash 4ah
CKBD3_BackSlash 5ch\ | CKBD2_BackSlash 5dh
CKBD3_q 15hq Q й CKBD2_q 15h
CKBD3_w 1dhw W ц CKBD2_w 1dh
CKBD3_e 24he E у CKBD2_e 24h
CKBD3_r 2dhr R к CKBD2_r 2dh
CKBD3_t 2cht T е CKBD2_t 2ch
CKBD3_y 35hy Y н CKBD2_y 35h
CKBD3_u 3chu U г CKBD2_u 3ch
CKBD3_i 43hi I ш CKBD2_i 43h
CKBD3_o 44ho O щ CKBD2_o 44h
CKBD3_p 4dhp P з CKBD2_p 4dh
CKBD3_a 1cha A ф CKBD2_a 1ch
CKBD3_s 1bhs S ы CKBD2_s 1bh
CKBD3_d 23hd D в CKBD2_d 23h
CKBD3_f 2bhf f а CKBD2_f 2bh
CKBD3_g 34hg G п CKBD2_g 34h
CKBD3_h 33hh H р CKBD2_h 33h
CKBD3_j 3bhj J о CKBD2_j 3bh
CKBD3_k 42hk K л CKBD2_k 42h
CKBD3_l 4bhl L д CKBD2_l 4bh
CKBD3_z 1ahz Z я CKBD2_z 1ah
CKBD3_x 22hx X ч CKBD2_x 22h
CKBD3_c 21hc C с CKBD2_c 21h
CKBD3_v 2ahv V м CKBD2_v 2ah
CKBD3_b 32hb B и CKBD2_b 32h
CKBD3_n 31hn N т CKBD2_n 31h
CKBD3_m 3ahm M ь CKBD2_m 3ah
CKBD3_Space 29h CKBD2_Space 29h


Функциональные клавиши
Обозначение Код в режиме 3 КлавишаОбозначение Код в режиме 2
CKBD3_Esc 08h EscapeCKBD2_Esc 76h
CKBD3_F1 07h F1 CKBD2_F1 05h
CKBD3_F2 0fh F2 CKBD2_F2 06h
CKBD3_F3 17h F3 CKBD2_F3 04h
CKBD3_F4 1fh F4 CKBD2_F4 0ch
CKBD3_F5 27h F5 CKBD2_F5 03h
CKBD3_F6 2fh F6 CKBD2_F6 0bh
CKBD3_F7 37h F7 CKBD2_F7 83h
CKBD3_F8 3fh F8 CKBD2_F8 0ah
CKBD3_F9 47h F9 CKBD2_F9 01h
CKBD3_F10 4fh F10 CKBD2_F10 09h
CKBD3_F11 56h F11 CKBD2_F11 78h
CKBD3_F12 5eh F12 CKBD2_F12 07h
CKBD3_PrScr57h Print Screen CKBD2_PrScr 0e012e07ch
CKBD3_Pause62h Pause CKBD2_Pause 0e11477h


Примечание. Согласно [1] клавиша Pause работает только на нажатие. На моей клавиатуре в режиме 3 она программируется также, как и остальные клавиши (т. е. нажатие, нажатие/отжатие, нажатие/отжатие/повторение и т. д.)



Клавиши регистров, редактирования и серой клавиатуры
Обозначение Код в режиме 3 КлавишаОбозначение Код в режиме 2
CKBD3_NumLck 76hNum Lock CKBD2_NumLck 77h
CKBD3_ScrlLck 5fhScroll Lock CKBD2_ScrlLck 7eh
CKBD3_CapsLck 14hCaps Lock CKBD2_CapsLck 58h
CKBD3_LShift 12hЛевый Shift CKBD2_LShift 12h
CKBD3_LAlt 19hЛевый Alt CKBD2_LAlt 11h
CKBD3_LCtrl 11hЛевый Ctrl CKBD2_LCtrl 14h
CKBD3_RShift 59hПравый Shift CKBD2_RShift 59h
CKBD3_RAlt 38hПравый Alt CKBD2_RAlt 0e011h
CKBD3_RCtrl 58hПравый Ctrl CKBD2_RCtrl 0e014h
CKBD3_Enter 5ah Enter CKBD2_Enter 5ah
CKBD3_Tab 0dh Tab CKBD2_Tab 0dh
CKBD3_Backspace 66h Backspace CKBD2_Backspace 66h
CKBD3_Insert 70h Вставка CKBD2_Insert 0e070h
CKBD3_Delete 71h Удалить CKBD2_Delete 0e071h
CKBD3_Left 6bh Стрелка влево CKBD2_Left 0e06bh
CKBD3_Right 74h Стрелка вправо CKBD2_Right 0e074h
CKBD3_Up 75h Стрелка вверх CKBD2_Up 0e075h
CKBD3_Down 72h Стрелка вниз CKBD2_Down 0e072h
CKBD3_PgUp 7dh Страница вверх CKBD2_PgUp 0e07dh
CKBD3_PgDown 7ah Страница вниз CKBD2_PgDown 0e07ah
CKBD3_Home 6ch В начало CKBD2_Home 0e06ch
CKBD3_End 69h В конец CKBD2_End 0e069h
CKBD3_GrLeft 61h Стрелка влево на серой клавиатуре 4 CKBD2_GrLeft 6bh
CKBD3_GrRight 6ah Стрелка вправо на серой клавиатуре 6 CKBD2_GrRight 74h
CKBD3_GrUp 63h Стрелка вверх на серой клавиатуре 8 CKBD2_GrUp 75h
CKBD3_GrDown 60h Стрелка вниз на серой клавиатуре 2 CKBD2_GrDown 72h
CKBD3_GrPgUp 6fh Страница вверх на серой клавиатуре 9 CKBD2_GrPgUp 7dh
CKBD3_GrPgDown 6dh Страница вниз на серой клавиатуре 3 CKBD2_GrPgDown 7ah
CKBD3_GrHome 6eh Вначало на серой клавиатуре 7 CKBD2_GrHome 6ch
CKBD3_GrEnd 65h Вконец на серой клавиатуре 1 CKBD2_GrEnd 69h
CKBD3_GrInsert 67h Вставка на серой клавиатуре 0 CKBD2_GrInsert 70h
CKBD3_GrDelete 64h Удалить на серой клавиатуре . CKBD2_GrDelete 71h
CKBD3_Gr5 73h центральная клавиша 5 CKBD2_Gr5 73h
CKBD3_GrEnter 79h серый "ВК" CKBD2_GrEnter 0e05ah
CKBD3_GrPlus 7ch серый + CKBD2_GrPlus 79h
CKBD3_GrMinus 84h серый - (предположительно, необходимо уточнить) CKBD2_GrMinus 7bh
CKBD3_GrMultiply 7eh серый * CKBD2_GrMultiply7ch
CKBD3_GrDivide 77h серый / CKBD2_GrDivide 0e04ah


Коды клавиш в режиме 3



Обозначение Код в режиме 3 КлавишаОбозначение Код в режиме 2
CKBD3_Lwin 8bh Левая клавиша Windows CKBD2_LWin 0e01fh
CKBD3_Rwin 8ch Правая клавиша Windows CKBD2_RWin 0e027h
CKBD3_WinMenu 8dh Клавиша меню Windows CKBD2_WinMenu 0e02fh
Клавиши WakeUp, Sleep и Power
в режиме 3 на моей
клавиатуре не опознаются
Клавиша WakeUp CKBD2_WakeUp 0e05eh
Клавиша Sleep CKBD2_Sleep 0e03fh
Клавиша Power CKBD2_Power 0e037h


Дополнительные коды, возвращаемые клавиатурой при нажатии и отпускании клавиш.



Обозначение Код в режиме 3 Назначение кода Обозначение Код в режиме 2
CKBD3_Unpress 0f0h Код отпускания клавиши CKBD2_Unpress 0f0h
В режиме 3 не нужны дополнительные коды Код дополнительной клавиши CKBD2_ExtCode 0e0h
Дополнительный код, выдаваемый только при нажатии клавиши Pause. CKBD2_ExtCode1 0e1h



©   Жуков И. Б.

e-mail:

При использовании материалов, пожалуйста,

ставьте индексируемую ссылку на сайт http://ibzh.eko3.ru/





Число посетителей


Яндекс.Метрика

Число посетителей