Чтение онлайн

ЖАНРЫ

Аппаратные интерфейсы ПК. Энциклопедия

Гук Михаил Юрьевич

Шрифт:

 • 4fh — перехват клавиатуры;

 • 53xxh — сервисы управления потреблением АРМ (Advanced Power Management);

 • 8300h — запуск таймера, устанавливающего флаг в заданной ячейке;

 • 8301h — сброс того же таймера;

 • 84h — джойстик (см. п. 8.6);

 • 86h — программируемая задержка;

 • 87h — перемещение блока расширенной памяти;

 • 88h — получение размера расширенной памяти;

 • 89h — переключение в режим V86;

 • C0h — получение системной конфигурации, при успешном выполнении (

CF
=0,
AH
=0)
ES:BX 
указывает на таблицу данных конфигурации;

 • 80-82h, 85h, 90h, 91h — функции многозадачных ОС (BIOS устанавливает заглушки);

♦ 

Int 16h
клавиатурный ввод-вывод;

♦ 

Int 17h
— обслуживание LPT-портов;

♦ 

Int 18h
— процедура восстановления при неудаче начальной загрузки (прежде — ROM-Basic);

♦ 

Int 19h
— начальная загрузка (вызов процедуры Bootstrap);

♦ 

Int 1Ah
— системное время, дата, будильник и 16-битные вызовы сервисов PCI;

♦ 

Int 1Bh
— обработчик нажатия клавиш
Ctrl+Break
;

♦ 

Int 1Ch
— User Timer Interrupt, процедура, вызываемая обработчиком
Int 08h
каждые 55 мс; BIOS устанавливает простую заглушку (
IRET
), но программы могут перехватывать это прерывание; на время отработки этой процедуры все аппаратные прерывания запрещены (кроме NMI).

♦ 

Int 33h
— поддержка мыши;

♦ 

Int 4Ah
— обработчик будильника пользователя, установленного функцией BIOS
Int 1Ah
(6); прерывание вызывается асинхронно, так что при возврате из процедуры все регистры и флаги должны быть в том же состоянии, что и при входе; BIOS ставит заглушку (
IRET
);

♦ 

Int 67h
— EMS-функции.

Указатели на таблицы:

♦ 

Int 1Dh
— видеопараметры;

♦ 

Int 1Eh
— параметры дискет;

♦ 

Int 1Fh
— знакогенератор СGA;

♦ 

Int 41h
— параметры HDD 0;

♦ 

Int 46h
— параметры HDD 1;

♦ 

Int 43h
— знакогенератор EGA.

12.8.1. Int 09h, Int 16h — поддержка клавиатуры

Поддержка клавиатуры заключается в обработке прерываний от устройства ввода и предоставлении сервисов ввода прикладным программам.

Прерывания, вызванные приходом кодов нажатия и отпускания клавиш, обрабатывает BIOS

Int 9h
. Каждый принятый скан-код (или цепочка) обрабатывается с учетом состояния клавиатурных флагов. Результат обработки (как правило, ASCII-символ в младшем байте и скан-код в старшем) помещается в клавиатурный буфер, расположенный в ОЗУ. По приему каждого символа указатель головы буфера увеличивается. Буфер организован в виде кольца, после достижения конца области буфера указатель головы установится на начало области. В случае переполнения буфера (указатель головы «догнал» указатель хвоста) очередное слово не записывается, и подается звуковой сигнал. Размер позволяет хранить описание шестнадцати фактов нажатий клавиш. Нажатие клавиш
Ctrl
,
Shift
,
Alt
и некоторых комбинаций в буфере не отмечается, но приводит к модификации бит ячеек флагов клавиатуры. Нажатие «системной» комбинации
Ctrl+Alt+Del
, клавиши
PrintScreen
(
SysRq
) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры.

Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area):

♦ 0:0417, 0:418 —

флаги клавиатуры;

♦ 0:0419 — аккумулятор кода

Alt
– набора;

♦ 0:041А — указатель головы буфера (Buffer Head), 2 байта (модифицируется при помещении символа в буфер);

♦ 0:041C — указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера);

♦ 0:041E-0:042D — область кольцевого буфера (16 слов).

Обработчик аппаратного прерывания до обработки принятого скан-кода вызывает прерывание BIOS

Int 15h
с
AH
=4Fh, а в
AL
находится принятый скан-код. Стандартный обработчик
Int 15h
(4Fh) просто выполняет возврат с
CF
=0, но его можно заменить специальным обработчиком, который будет при необходимости подменять принятые скан-коды на какие-либо иные (оставляя их в
AL
), что должно отмечаться установкой
CF
=1. В старых версиях BIOS такой возможности перехвата не было, ее наличие можно определить вызовом
Int 15h
(C0h).

Для клавиатуры USB или иного устройства ввода, заменяющего клавиатуру в качестве консоли, прерывание

Int 9h
должно вызываться программно при обработке каждого клавиатурного события. Обработчик этого прерывания должен выполнять те же действия: скан-код пропускать через
Int 15h
(4Fh) и помещать в клавиатурный буфер, а также модифицировать флаги клавиатуры.

Интерфейс прикладного уровня для клавиатуры представляет BIOS

Int 16h
. Его основное назначение — извлечение слов из клавиатурного буфера. Функция задается в регистре
АН
при вызове, результат помещается в регистр
АХ
.

♦ 

АН
= 00h — чтение (с ожиданием готовности) и выборка слова из буфера (меняется указатель хвоста). Индикаторы клавиатуры обновляются в соответствии с состоянием флагов. Если буфер пуст, то на AT выполняется прерывание
Int 15h
(подфункция 90), что может использоваться ОС, например, для переключения задач. Чтобы программа не «зависала» на ожидании символа, предварительно стоит проверить готовность функцией 01h. Символы расширенной клавиатуры фильтруются — преобразуются в их аналоги 83-клавишной клавиатуры.

♦ 

АН
= 01h — проверка готовности, чтение без выборки (указатели не изменяются). Признак наличия символа в буфере — установленный флаг
ZF
.

♦ 

АН
= 02h — чтение состояния флагов (в
AL
— байт 0:417h, см. выше).

♦ 

АН
= 03h — установка задержки и частоты автоповтора:
BL
— код задержки (00=250, 01=500, 02=750, 03=1000 мс),
ВН
— код частоты (см. п. 9.2.1).

♦ 

АН
= 05h — запись слова из регистра
СХ
в буфер (меняется указатель головы). Признак успешной записи —
AL
=0, если в буфере нет места, то
AL
=1.

♦ 

АН
= 10h и
AH
= 11h — функции, аналогичные 00h и 01h, но предназначены специально для 101/102-клавишных клавиатур — в них не выполняется фильтрация символов расширенной клавиатуры. Для ряда клавиш, отсутствующих в клавиатуре АТ-84, эти функции дадут результаты, отличающиеся от вызовов 00h и 01h.

♦ 

AH
=12h — чтение расширенного состояния флагов (в
АХ
— слово
KbdShiftFlags101Rec
), в котором младший байт совпадает с тем, что дает функция 02h (слово из 0:417h), а старший байт похож на слово из 0:418h. Назначение бит
АХ
:

Поделиться с друзьями: