В процессе начального тестирования POST BIOS проверяет наличие последовательных портов (регистров UART 8250 или совместимых) по стандартным адресам и помещает базовые адреса обнаруженных портов в ячейки
BIOS Data Area
0:0400, 0402, 0404, 0406. Эти ячейки хранят адреса портов с логическими именами
COM1
–
СОМ4
. Нулевое значение адреса является признаком отсутствия порта с данным номером. В ячейки 0:047С, 047D, 047Е, 047F заносятся константы, задающие тайм-аут для портов.
Обнаруженные порты инициализируются на скорость обмена 2400 бит/с, 7 бит данных с контролем на четность (even), 1 стоп-бит. Управляющие сигналы интерфейса
DTR
и
RTS
переводятся в исходное состояние («выключено» — положительное напряжение).
12.8.5. Int 17h — поддержка принтера
Сервисы BIOS
Int 17h
: обеспечивают инициализацию, вывод байта данных и опрос состояния принтера, подключенного к LPT-порту. При вызове функция задается в регистре
АН
, номер LPT-порта — в регистре DX.
♦
АН
= 00h — вывод байта из регистра
AL
по протоколу Centronics (без аппаратных прерываний). Данные помещаются в выходной регистр, и, дождавшись готовности принтера (снятия сигнала
Busy
), формируется строб.
♦
АН
= 01h — инициализация интерфейса и принтера (установка исходных уровней управляющих сигналов, формирование импульса
Init#
, запрет аппаратных прерываний и переключение на вывод двунаправленного интерфейса).
♦
АН
= 02h — опрос состояния принтера (чтение регистра состояния порта).
При возврате регистр
АН
содержит байт состояния, который собирается из бит регистра состояния
SR[7:3]
и программно формируемого флага тайм-аута. Биты 6 и 3 относительно байта, считанного из регистра состояния, инвертированы. Назначение бит байта состояния:
♦ бит 7 — не занято (сигнал
Busy
); нулевое значение означает, что принтер занят (буфер полон или состояние Off-Line, или ошибка);
♦ бит 6 — подтверждение (сигнал
Ack#
); единичное значение означает, что принтер подключен;
♦ бит 5 — конец бумаги (сигнал
PaperEnd
);
♦ бит 4 — принтер готов (сигнал
Select
); нулевое значение означает, что принтер в состоянии Off-Line;
♦ бит 3 — ошибка принтера (сигнал
Error#
); единичное значение соответствует ошибке;
♦ биты 2:1=00 (не используются);
♦ бит 0 — флаг тайм-аута, устанавливается при неудачной попытке вывода символа, если сигнал
Busy
не снимается в течение времени, определенного для данного порта в ячейках тайм-аута (в BIOS Data Area); в этом случае согласно протоколу Centronics строб данных не вырабатывается.
Перехват прерывания
Int 17h
является удобным способом внедрения собственных драйверов принтера. Потребность в них может возникать при подключении к порту принтера с интерфейсом ИРПР или необходимости перекодировки символов. Если разрабатываемый драйвер предназначен не только для перекодировки, но и изменения протокола (через
Int 17h
можно организовать вывод через LPT-порт по протоколу ИРПР и даже через СОМ-порт), следует внимательно отнестись к битам возвращаемого байта состояния. При их неправильном формировании попытки вывода на печать могут приводить к ошибочным сообщениям.