Справочник программиста на персональном компьютере фирмы IBM. Принтер
Страница 2. Инициализация  порта  принтера/повторная  инициализация принтера



     6.1.1  Инициализация  порта  принтера/повторная  инициализация принтера.


   Программы должны  инициализировать порт каждого принтера (LPT1
-  LPT3)  перед первым использованием принтера.   Порты  принтера
должны также повторно инициализироваться  после устранения причин
ошибки  принтера.  Не путайте инициализацию порта принтера с ини-
циализацией самого принтера.  Инициализация принтера это внутрен-
нее  дело принтера.  Она происходит автоматически при его включе-
нии и в большинстве случаев  принтер  не может быть повторно ини-
циализирован без его выключения и повторного включения.  Но прог-
рамма может повторно инициализировать  принтер, в том смысле, что
могут  быть  восстановлены начальные параметры,  которые  принтер
использует для печати, отменяя  все  специальные шрифты, остановы
табуляции  и т.д.  Считается правилом хорошего  тона  производить
такой сброс принтера, когда программа завершает работу с ним.
   Языки высокого уровня  инициализируют  порт принтера автомати-
чески,  но  программы на языке ассемблера требуют для  этой  цели
короткую процедуру.  С другой  стороны,  восстановление начальных
параметров печати требуется во всех программах. Некоторые принте-
ры, такие как  новые  Эпсоновские  принтеры,  имеют  "главный код
сброса", который приводит к полному сбросу принтера. Но поскольку
не все принтеры имеют такой код, то программа должна предусматри-
вать  в  своей завершающей части восстановление  всех  измененных
параметров.  Например, она может  подать коды выключения курсива,
выключения плотной печати и т.д.  Не забудьте включить вызов этой
процедуры в процедуру выхода по Ctrl-Break.
   Имейте в виду, что на многих  принтерах  символы не печатаются
до  тех  пор, пока не получен код возврата  каретки,  завершающий
строку (или до тех пор  пока  не  введена  целая  строка данных).
Символы  могут  спокойно  ожидать в буфере принтера,  даже  после
того, как породившая их  программа  завершилась. Когда начинается
новая  передача данных на принтер, то эти символы будут напечата-
ны.  Чтобы избежать этой  проблемы,  не забывайте почистить буфер

перед началом печати; а в качестве правил хорошего тона,  чистите
буфер также при завершении  программы.   Это делается посылкой на
принтер кода ASCII 24 (при этом параметры печати не меняются).

   Средний уровень.


   Функция  1 прерывания 17H BIOS инициализирует порт принтера  и
возвращает байт, дающий статус порта.  Поместите в DX номер порта
-  число от 0 до 2 для LPT1 - LPT3, после чего вызовите  прерыва-
ние.  Байт статуса принтера  (идентичный  обсуждаемому в [6.1.2])
возвращается в AH.

;---инициализация LPT1
   MOV  AH,1       ;функция инициализации принтера
   MOV  DX,0       ;LPT1
   INT  17H        ;проводим инициализацию

   Низкий уровень.


   Ренистр  управления  выводом каждого адаптера  принтера  имеет
бит, который вызывает инициализацию  адаптера. Этот регистр имеет
адрес порта на 2 больше, чем базовый адрес адаптера.  Напоминаем,
что базовый адрес для LPT1  хранится в ячейке 0040:0008, для LPT2
-  в 0040:000A и т.д.  Имеют значение только младшие 5 битов  ре-
гистра управления выводом.  Бит  2 - бит инициализации принтера и
обычно  он устанавливается в 1.  Для инициализации адаптера  надо
сбросить этот бит в 0 на тысячу тактов пустого цикла (3000 для AT
или  на  1/20  секунды,  используя  счетчик  времени  суток  BIOS
[2.1.5]).  В этот момент нужно, чтобы был установлен только бит 3
(принтер  выбран).  Поэтому пошлите в порт значение 12,  сделайте
задержку, а затем пошлите в порт обычное  (без прерываний) неини-
циализонное значение, которое равно 8.
   В данном примере инициализируется LPT1:

;---инициализируем LPT1
          MOV  DX,ES:[8]    ;считываем базовый адрес в DX
          INC  DX           ;прибавляем 2 к базовому адресу
          INC  DX           ;
          MOV  AL,12        ;значение для инициализации
          OUT  DX,AL        ;начинаем инициализацию
DELAY:    MOV  AX,1000      ;начало пустого цикла
          DEC  AX           ;уменьшаем счетчик
          JNZ  DELAY        ;повторяем 1000 раз
          MOV  AL,8         ;обычное значение для регистра
          OUT  DX,AL        ;конец инициализации

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