Страница 2 из 20
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 ;конец инициализации
|