Справочник программиста на персональном компьютере фирмы IBM. Принтер
Страница 3. Проверка того, что принтер связан с машиной


     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:                    ;продолжение программы

 
« Предыдущая статья   Следующая статья »