При наличии в ПЭВМ двух параллельных портов LPT1 и LPT2 одновременно можно использовать два принтера. При этом часто возникает проблема направления данных на тот или иной принтер без переделки соответствующих программ. Эта проблема легко решается программным путем. Достаточно лишь поменять местами адреса {390} портов, записанные в системных ячейках памяти $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 {391}
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 легко переделать при необходимости в обычную нерезидентную процедуру перестановки адресов и использовать ее в других приложениях. {392}