17.3. Работа с двумя принтерами одновременно

При наличии в ПЭВМ двух параллельных портов LPT1 и LPT2 одновременно можно использовать два принтера. При этом часто возникает проблема направления данных на тот или иной принтер без переделки соответствующих программ. Эта проблема легко решается программным путем. Достаточно лишь поменять местами адреса

- 391 -

портов, записанные в системных ячейках памяти $0000:$0408 (порт LРТ1, он же PRN) и $0000:$040А (порт LPT2). Резидентная версия программы перестановки адресов приведена на рис. 17.4. После нажатия клавиши PrintScreen (PrtScr) адреса меняются местами, о чем свидетельствует звуковая сигнализация. Количество сигналов соответствует номеру порта, а порядок следования — их текущему перенаправлению.

| { $M 1024,0,0, F-,R-,S-,I-,N-}

USES

| CRT, DOS;

| VAR

| LPT1, LPT2 : Word; { значения адресов }

| CONST

| OrderIsChanged : Boolean = False; { состояние обмена }

| PROCEDURE Beep; { процедура выдачи одиночного сигнала }

| BEGIN

| Sound( 200 ); Delay( 100 ); NoSound; Delay( 20 )

| END;

| {$F+} { подставляемая процедура обработки прерывания}

| PROCEDURE NewInt05; INTERRUPT;

| BEGIN

| OrderIsChanged:=not OrderIsChanged; {порядок изменяется }

| if OrderIsChanged

| then begin {обратный порядок }

| MemW[ 0:$0408 ] := LPT2; { адреса меняются }

| MemW[ 0:$040A ] := LPT1;

| Beep; Beep; Delay( 200 ); Beep {2+1 сигнала звуком }

| end

| else begin { исходный порядок }

| MemW[ 0:$0408 ] := LPT1; { адреса меняются }

| MemW[ 0:$040A ] := LPT2;

| Beep; Delay( 200 ); Beep; Beep {1+2 сигнала звуком }

| end;

| END;

| {$f-}

| BEGIN { запускающая часть примера }

| HighVideo;

| WriteLn( #10#13'LPT1 <--> LPT2'#10 );

| WriteLn('НАЖИМАЙТЕ PrintScreen',

| ' ДЛЯ ПЕРЕНАПРАВЛЕНИЯ'#10);

Рис. 17.4

- 392 -

| LowVideo;

| LPT1:=MemW[ $0000:$0408]; {исходный адрес порта 'LPT1' }

| LPT2:=MemW[$0000:$040А]; {исходный адрес порта 'LPT2' }

| SetIntVec($00, SaveInt00); {нужно для резидентности }

| SetIntVec($1B, SaveInt1B); {нужно для резидентности }

| SetIntVec($05, @NewInt05); {подстановка прерывания 05 }

| Кеер(0) {программа будет резидентной }

| END.

Рис. 17.4 (окончание)

Программу на рис. 17.4 легко переделать при необходимости в обычную нерезидентную процедуру перестановки адресов и использовать ее в других приложениях.

- 393 -