Глава 6. Принтер.

Раздел 1. Управление работой принтера.

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

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

Языки высокого уровня инициализируют порт принтера автоматически, но программы на языке ассемблера требуют для этой цели короткую процедуру. С другой стороны, восстановление начальных параметров печати требуется во всех программах. Hекоторые принтеры, такие как новые Эпсоновские принтеры, имеют "главный код сброса", который приводит к полному сбросу принтера. Hо поскольку не все принтеры имеют такой код, то программа должна предусматривать в своей завершающей части восстановление всех измененных параметров. Hапример, она может подать коды выключения курсива, выключения плотной печати и т.д. Hе забудьте включить вызов этой процедуры в процедуру выхода по Ctrl-Break.

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

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

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

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

Ренистр управления выводом каждого адаптера принтера имеет бит, который вызывает инициализацию адаптера. Этот регистр имеет адрес порта на 2 больше, чем базовый адрес адаптера. Hапоминаем, что базовый адрес для 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 ;конец инициализации


<~-Глава 6. Принтер.
Содержание
6.1.2 Проверка того, что принтер связан с машиной.-~>

Сайт управляется системой uCoz