Страница 5 из 20
6.1.4 Переключение между двумя или несколькими принтерами. Компьютеры, оснащенные несколькими параллельными портами могут иметь одновременно подсоединенными два или более принтеров. Вывод может перенаправляться с одного принтера на другой двумя способа- ми. Один способ состоит в том, чтобы использовать только такие операторы вывода на печать, которые указывают на какой принтер надо осуществлять вывод. Вы можете написать такой код, который позволит Вам изменять спецификацию. Второй способ переключения принтеров состоит в использовании вывода по умолчанию на LPT1, но указания другого принтера, кото- рый будет использоваться в качестве LPT1. Это достигается измене- нием базового адреса, относящегося к LPT1. Этот базовый адрес хранится в области данных BIOS в ячейке 0040:0008. Поменяйте его с базовым адресом для LPT2 или 3 (хранящимися в ячейках 0040:000A и 0040:000C) и в качестве LPT1 будет использоваться другой адап- тер.
Высокий уровень. В Бейсике, если принтер был открыт оператором OPEN "LPT1" AS #1, то чтобы переключиться на другой принтер надо сначала напи- сать оператор CLOSE #1, а затем открыть другой принтер с помощью оператора OPEN "LPT2" AS #1. Впоследствии все операторы PRINT #1 будут направлять свой вывод на второй принтер. Это изменение труднее осуществить в программах, использующих оператор LPRINT, поскольку LPRINT по умолчанию посылает весь вывод на LPT1. В этом случае Вам необходимо поменять базовые адреса принтеров. Следую- щая программа на Бейсике делает именно это, переключая LPT1 и LPT2. Ее повторное использование переключает адреса обратно, возвращая систему к первоначальной конфигурации.
100 DEF SEG = &H40 'указываем на область данных BIOS 110 X = PEEK(8) 'получаем младший байт адреса LPT1 120 Y = PEEK(9) 'получаем старший байт адреса LPT1 130 POKE 8,PEEK(10) 'переносим младший байт адреса LPT2 140 POKE 9,PEEK(11) 'переносим старший байт адреса LPT2 150 POKE 10,X 'посылаем младший байт LPT1 в LPT2 160 POKE 11,Y 'посылаем старший байт LPT1 в LPT2 170 SYSTEM 'выходим из Бейсика
Эта программа будет очень кстати, если готовое программное обеспечение не адресуется к нужному принтеру. Ее можно откомпили- ровать и хранить на диске, скажем под именем OTHERPRN, после чего надо будет только напечатать ее имя (в ответ на запрос DOS), чтобы переключиться с принтера на принтер. Если у Вас нет транс- лятора с Бейсика, то создайте командный файл OTHERPRN.BAT и по-
местите в него строку BASIC OTHERPRN. Когда Вы напечатаете OT- HERPRN, то будет автоматически загружен Бейсик, который загрузит и выполнит программу OTHERPRN.BAS, после чего Вы вернетесь в операционную систему. Необходимо, правда, чтобы на диске имелся интерпретатор Бейсика BASIC.COM. Помните, что Вы должны устоять перед искушением испытать эту программу перед тем, как она будет записана на диск, поскольку если Вы ее запустите, то она сотрет себя.
Низкий уровень. Один способ, которым программа на ассемблере может изменить принтер, на который она посылает данные, состоит в использовании для печати только функции 0 прерывания 17H [6.3.1]. Эта функция требует, чтобы номер принтера был помещен в DX. Заведите перемен- ную для этого номера, с тем чтобы он мог быть изменен в любой момент. Вторая возможность состоит в обмене базовых адресов LPT1 и LPT2 или LPT3. Следующая программа делает именно это. Как и все короткие утилиты, она должна писаться в COM форме, как объяснено в [1.3.6].
;---обмен базовыми адресами LPT1 и LPT2 MOV AX,40H ;сегмент области данных BIOS MOV ES,AX ;ES указывает на данные MOV BX,8 ;смещение для базового адреса LPT1 MOV DX,ES:[BX] ;сохраняем базовый адрес LPT1 MOV AX,ES:[BX]+2 ;сохраняем базовый адрес LPT2 MOV ES:[BX],AX ;меняем базовый адрес LPT2 MOV ES:[BX]+2,DX ;меняем базовый адрес LPT1
|