♦ бит 7 — не занято (сигнал Busy
); нулевое значение означает, что принтер занят (буфер полон или состояние Off-Line, или ошибка);
♦ бит 6 — подтверждение (сигнал Ack#
); единичное значение означает, что принтер подключен;
♦ бит 5 — конец бумаги (сигнал PaperEnd
);
♦ бит 4 — принтер готов (сигнал Select
); нулевое значение означает, что принтер в состоянии Off-Line;
♦ бит 3 — ошибка принтера (сигнал Error#
); единичное значение соответствует ошибке;
♦ биты 2:1=00 (не используются);
♦ бит 0 — флаг тайм-аута, устанавливается при неудачной попытке вывода символа, если сигнал Busy
не снимается в течение времени, определенного для данного порта в ячейках тайм-аута (в BIOS Data Area); в этом случае согласно протоколу
Перехват прерывания Int 17h
является удобным способом внедрения собственных драйверов принтера. Потребность в них может возникать при подключении к порту принтера с интерфейсом Int 17h
можно организовать вывод через LPT-порт по протоколу ИРПР и даже через СОМ- порт), следует внимательно отнестись к битам возвращаемого байта состояния. При их неправильном формировании попытки вывода на печать могут приводить к ошибочным сообщениям.
12.8.6. Int 1Ah и Int 15h — поддержка таймеров
Int 1Ah
позволяют считывать и модифицировать значения АН
.
1. АН
=0 — чтение системного таймера (двойного слова по адресу 40:006Eh в BIOS Data Area, инкрементируемого по прерываниям от канала 0 счетчика- таймера 8253/8254 примерно раз в 55 мс. Таймер обнуляется при выполнении теста POST после аппаратного сброса). Возвращает значение таймера, в СХ
— старшую часть, в DX
— младшую. AL
=0, если за последние 24 часа не было переполнения таймера. В современных версиях сброс AL
возвращает счетчик переполнений таймера, хранящийся в ячейке 40:0070h (в старых версиях это был флаг).
2. АН
=1 — установка системного таймера (СХ
— старшая часть, в DX
— младшая) и сброс флага (счетчика) переполнения таймера в ячейке 40:0070h. В случае ошибки устанавливается флаг CF
=1.
3. АН
=2 — чтение времени из RTC. Возвращает в упакованном BCD-формате час (в регистре СН
), минуту (CL
), секунду (DH
) и признак коррекции летнего/зимнего времени (DL
=1 — коррекция используется, DL
=0 — нет). Признаком успешной операции является флаг CF
=0. Во избежание ошибок некоторых BIOS при вызове флаг CF
должен быть сброшен.
4. АН
=3 — установка времени в RTC, назначение регистров и признак результата аналогичен функции 2.
5. АН
=4 — чтение даты из RTC. Возвращает в упакованном BCD-формате век (в регистре СН
), две старшие цифры года (CL
), месяц (DH
) и день (DL
). Признаком успешной операции является флаг CF
=0. Во избежание ошибок некоторых BIOS при вызове флаг CF
должен быть сброшен.
6. АН
=5 — установка даты в RTC, назначение регистров и признак результата аналогичен функции 4.
7. АН
=6 — установка времени срабатывания будильника RTC. Возвращает в упакованном BCD-формате час (в регистре СН
), минуту (CL
) и секунду (DH
). Если будильник уже установлен, переустановка не производится и возвращается флаг CF
=1. При срабатывании будильник вызывает прерывание Int 4Ah
.
8. АН
=7 — отмена установки будильника.
Int 15h
позволяют программировать АН
или АХ
.
9. AH
=86h — задержка на заданное время. Управление будет возвращено вызвавшему процессу только через указанный интервал. По окончании задержки будет установлен бит 7 в ячейке BDA 0040:00A0. Таймер может оказаться занятым, тогда вызов сразу возвратит флаг CF
=1 (при успехе CF
=0, а в AL
окажется маска, записанная в 8259А#2).
10. AX
=8300h — запуск таймера, устанавливающего флаг после указанной задержке бит 7 в ячейке, заданной регистрами ES
:BX
. При успешном запуске CF
=0; если таймер занят (он один) — CF
=1 и AL
=0. Управление возвращается процессу сразу, а флаг будет установлен через заданное время. Перед завершением программа, запускавшая таймер, должна его сбросить функцией 8301h (во-первых, чтобы освободить; во-вторых, чтобы снять «адскую машинку», которая неожиданно сама может изменить значение ячейки памяти, вполне возможно уже задействованную другим, ничего не «подозревающим» процессом).
11. AX
=8301h — сброс того же таймера.
12.8.7. PCI BIOS
Функции PCI BIOS используются только для поиска и конфигурирования устройств PCI — процедур, требующих доступа к их конфигурационному пространству (см. п. 8.2). Регулярная работа с этими устройствами выполняется через обращения к регистрам устройств по адресам, полученным при конфигурировании, и обработке известных номеров прерываний от этих устройств. Для Int 1Ah
; номер функции задается при вызове в регистре АХ
. Возможна и программная имитация прерывания дальним вызовом по физическому адресу 000FFE6EH (стандартная точка входа в обработчик Int 1Ah
) с предварительным занесением в стек регистра флагов.
Признаком нормального выполнения является CF
=0 и АН
=0; при CF
=1 АН
содержит
♦ 81h — неподдерживаемая функция;
♦ 83h — неправильный идентификатор производителя;
♦ 86h — устройство не найдено;
♦ 87h — неправильный номер регистра PCI.
Вызовы требуют глубокого стека (до 1024 байт). Для 32-разрядных вызовов защищенного режима