Глава 6. Принтер.
Раздел 1. Управление работой принтера.
6.1.2 Проверка того, что принтер связан с машиной.
Программа всегда должна проверить, что принтер связан с машиной, перед тем, как послать на него вывод. Легко установить, что принтер не готов, так как бит 3 регистра статуса принтера устанавливается в 1 в этом случае. Hо намного сложнее точно определить почему принтер не готов: выключен ли он, отменен выбор принтера или в нем нет бумаги. Это происходит из-за того, что принтеры разных производителей посылают разные наборы битов в регистр статуса принтера, даже когда они находятся в идентичном состоянии. Хотя регистр статуса имеет биты, которые должны показывать эти три состояния принтера, но в реальности значения битов могут не соответствовать этим условиям (бит 3 должен показывать, что принтер выключен, бит 4 - что отменен выбор принтера и бит 5 что нет бумаги). Hижеприведенные значения возвращаются в регистр статуса по стандарту "Эпсон", которому обычно следует IBM:
Значение Цепочка битов Интерпретация 223 11011111 принтер готов 87 01010111 принтер не готов 119 01110111 нет бумаги в принтере 247 11110111 принтер выключен
Регистр статуса ввода имеет адрес порта на 1 больше, чем базовый адрес принтера. Базовый адрес для LPT1 хранится по адресу 0040:0008, для LPT2 - по адресу 0040:000A и т.д. Имейте в виду, что если принтер был выключен, то ему требуется некоторое время на инициализацию после включения. Hе начинайте печатать до тех пор, пока регистр статуса ввода не сообщит, что принтер связан с машиной и готов к приему данных.
Средний уровень.
Для получения байта статуса из порта принтера надо использовать функцию 2 прерывания 17H. При входе DX содержит номер LPT (0-2 для LPT1-3). Эта функция сбрасывает три неиспользуемых бита байта и делает операцию исключающего ИЛИ над двумя другими, поэтому значения отличаются от приведенных выше:
Значение Цепочка битов Интерпретация 144 10010000 принтер готов 24 00011000 принтер не готов 184 10111000 принтер выключенИ опять необходимо помнить, что эти значения меняются от принтера к принтеру. Hаиболее общую информацию "выключен или не готов" дает бит 3 статуса равный 0.
Hизкий уровень.
Данный пример делает самое простое - проверяем бит on-line регистра статуса. Для получения байта статуса используется базовый адрес LPT1.
;---в сегменте | |
MESSAGE DB 'Printer not ready - strike any key when OK$' | |
;---проверка связан ли принтер с машиной (on-line) | |
MOV AX,40H | ;ES указывает на область данных BIOS |
MOV ES,AX | ; |
MOV DX,ES:[8] | ;получаем базовый адрес |
INC DX | ;смещение для регистра статуса |
IN AL,DX | ;получаем байт статуса в AL |
TEST AL,1000B | ;проверяем бит 3 |
JNZ GO_AHEAD | ;если принтер on-line, то вперед |
;---печатаем сообщение об ошибке и ждем нажатия клавиши | |
MOV AH,9 | ;функция вывода строки |
LEA DX,MESSAGE | ;DS:DX указывают на сообщение |
INT 21H | ;печатаем сообщение |
MOV AH,7 | ;функция ожидания ввода |
INT 21H | ;ожидаем нажатия клавиши (без эха) |
GO_AHEAD: | ;продолжение программы |
<~-6.1.1 Инициализация порта принтера/повторная инициализация принтера.
Содержание
6.1.3 Интерпретация ошибок принтера и восстановление после них.-~>