Справочник программиста на персональном компьютере фирмы IBM. Принтер - Проверка того, что принтер связан с машиной
ОГЛАВЛЕНИЕ
6.1.2 Проверка того, что принтер связан с машиной.
Программа всегда должна проверить, что принтер связан с маши-
ной, перед тем, как послать на него вывод. Легко установить, что
принтер не готов, так как бит 3 регистра статуса принтера уста-
навливается в 1 в этом случае. Но намного сложнее точно опреде-
лить почему принтер не готов: выключен ли он, отменен выбор прин-
тера или в нем нет бумаги. Это происходит из-за того, что принте-
ры разных производителей посылают разные наборы битов в регистр
статуса принтера, даже когда они находятся в идентичном состоя-
нии. Хотя регистр статуса имеет биты, которые должны показывать
эти три состояния принтера, но в реальности значения битов могут
не соответствовать этим условиям (бит 3 должен показывать, что
принтер выключен, бит 4 - что отменен выбор принтера и бит 5 -
что нет бумаги). Нижеприведенные значения возвращаются в регистр
статуса по стандарту "Эпсон", которому обычно следует IBM:
Значение Цепочка битов Интерпретация
223 11011111 принтер готов
87 01010111 принтер не готов
119 01110111 нет бумаги в принтере
247 11110111 принтер выключен
Регистр статуса ввода имеет адрес порта на 1 больше, чем базо-
вый адрес принтера. Базовый адрес для LPT1 хранится по адресу
0040:0008, для LPT2 - по адресу 0040:000A и т.д. Имейте в виду,
что если принтер был выключен, то ему требуется некоторое время
на инициализацию после включения. Не начинайте печатать до тех
пор, пока регистр статуса ввода не сообщит, что принтер связан с
машиной и готов к приему данных.
Высокий уровень.
Данная процедура проверяет связан ли принтер с машиной и гово-
рит пользователю что делать, если нет. Она использует значения из
вышеприведенной таблицы. Как уже отмечалось, такой подход не
подходит для процедуры общего назначения, которая будет обслужи-
вать множество разных принтеров, но он вполне подходит, когда Вы
пишете драйвер данного печатающего устройства. Отметим, что в
строке 120 вычисляется двухбайтное число, путем умножения старше-
го байта на 256 и добавления к младшему байту. Для получения
адреса регистра статуса ввода к значению полученного базового
адреса добавляется 1.
100 '''Получаем адрес LPT1 и проверяем готов ли принтер
110 DEF SEG = &H40 'указываем на область BIOS
120 PRTRBASE = PEEK(9)+256*PEEK(8)+1 'адрес регистра статуса
130 IF INP(PRTRBASE) = 223 THEN 180 'если принтер готов
140 BEEP 'иначе звонок и проверки
150 IF INP(PRTRBASE) = 87 THEN LOCATE 1,1: PRINT"Strike the
SELECT key": GOTO 150
160 IF INP(PRTRBASE) = 247 THEN LOCATE 1,1: PRINT"Turn the
printer on": GOTO 160
170 IF INP(PRTRBASE) <> 223 THEN 170 'ждем инициализации
180 '''Теперь принтер on-line -- можно начинать печать
190 LPRINT Z$
Средний уровень.
Для получения байта статуса из порта принтера надо использо-
вать функцию 2 прерывания 17H. При входе DX содержит номер LPT
(0-2 для LPT1-3). Эта функция сбрасывает три неиспользуемых бита
байта и делает операцию исключающего ИЛИ над двумя другими, поэ-
тому значения отличаются от приведенных выше:
Значение Цепочка битов Интерпретация
144 10010000 принтер готов
24 00011000 принтер не готов
184 10111000 принтер выключен
И опять необходимо помнить, что эти значения меняются от принтера
к принтеру. Наиболее общую информацию "выключен или не готов"
дает бит 3 статуса равный 0.
Низкий уровень.
Данный пример делает самое простое - проверяем бит 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: ;продолжение программы