Справочник программиста на персональном компьютере фирмы IBM. Принтер - Переключение между двумя или несколькими принтерами

ОГЛАВЛЕНИЕ

     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