| mStop : Close( f ) { закрытие файла FileName }

| END;

| BEGIN

| PrintFile(10,10, 'ris17-3.pas'); { печать текст-файла }

| END.

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

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

При наличии в ПЭВМ двух параллельных портов 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 -

<p>Глава 18. Модуль Overlay</p>

После компиляции программы может случиться, что ее притязания на размер требуемой оперативной памяти ПЭВМ окажутся чрезмерными: программа получится слишком большой. В этом случае система при запуске программы выдает сообщение Not enough memory («не хватает памяти») или нечто подобное. Есть несколько выходов из этой ситуации. Один из них заключается в использовании автономного компилятора (TPC.EXE). В этом случае размер доступной программе памяти увеличится на объем, занимаемый интегрированной средой при работе (около 230 К). Если же это не помогает, то, вероятнее всего, ситуацию может спасти использование модуля Overlay и соответствующей оверлейной технологии составления программ.

<p>18.1. Оверлейное построение программ</p>

Перейти на страницу:

Поиск

Похожие книги