Страница 3 из 20
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: ;продолжение программы
|