| Move(scr_arr,scr_buf^,plen); { копирование ее в буфер }
| WriteBlk(file name+'. red');
| { запись буфера на диск }
| Port[$3CE]:=4; Port[$3CF]:=3; { плоскость яркости }
| Move(scr_arr,scr_buf^,plen); { копирование ее в буфер }
| WriteBlk(file_name+'.int'); { запись буфера на диск }
| FreeMem( scr_buf, plen ); { освобождение памяти }
| Port[$3CE]:=4; Port[$3CF]:=0; { восстановление портов }
| END;
{Процедура чтения файлов изображения и вывода их на экран. Параметр file_name - hmz файла без расширения. }
| PROCEDURE LoadBitPlanes( file_name : String );
| VAR scr_buf:Pointer ; { указатель на буфер данных }
| scr_arr:g_plan absolute $A000:$0; { память адаптера }
| plen,mx,my:LongInt; { размер плоскости }
| { Вложенная процедура чтения плоскости с диска }
| PROCEDURE ReadBlk( name : String );
| VAR image file : File;
| BEGIN Assign( image.file, name );
| Reset( image_file, plen );
| BlockRead( image_file, scr_buf^, 1 );
| Close( image_file )
| END;
| BEGIN
| mx:=GetMaxX+1;
| my:=GetMaxY+1; {размеры плоскости }
| plen := mx*my div 8; {получение длины буфера }
| GetMem( scr_buf, plen ); {память для буфера }
| ReadBlk( file_name+'.blu' ); {чтение с диска в буфер }
| Port[$3C4]:=2; Port[$3C5]:=1; {Буфер копируется }
| Move(scr_buf^,scr_arr,plen); {в плоскость Blue. }
| ReadBlk(file_name+'.grn' ); {чтение с диска в буфер }
Рис. 22.13 (продолжение)
- 525 -
| Port[$3C4]:=2;
| Port[$3C5]:=2;
| { Буфер копируется }
| Move(scr_buf^,scr_arr,plen);
| { в плоскость Green. }
| ReadBlk( file_name+'.red' );
| { чтение с диска в буфер }
| Port[$3C4]:=2;
| Port[$3C5]:=4;
| { Буфер копируется }
| Move(scr_buf^,scr_arr,plen );
| { в плоскость Red. }
| ReadBlk( file_name+'.int' );
| { чтение с диска в буфер }
| Port[$3C4]:=2; Port[$3C5]:=8; { Буфер копируется }
| Move(scr_buf^,scr_arr,plen ); { в плоскость яркости. }
| FreeMem( scr_buf, plen ); { освобождение памяти }
| Port[$3C4]:=2;Port[$3C5]:=15; { восстановление портов }
| END;
| BEGIN
| { Пример вызовов процедур }
| GrInit;
| SetFillStyle(1,15);
| Bar( 0, 0, GetMaxX, GetMaxY );
| SetFillStyle(2, 2);
| Bar(40, 40,GetMaxX-40, GetMaxY-40 );
| SetFillStyle(3,3);
| Bar(120,120, GetMaxX-120, GetMaxY-120);
| SetFillStyle(4,4);
| Bar(240,180, GetMaxX-240, GetMaxY-180);
| ReadLn;
| SaveBitPlanes( 'plane' );
| ClearDevice;
| ReadLn;
| LoadBitPlanes( 'plane' );
| ReadLn;
| CloseGraph
| END.
Рис. 22.13 (окончание)
Эти процедуры работают для всех режимов, кроме CGA (так как в нем другой способ хранения данных). Поэтому для него приведем отдельные процедуры (рис. 22.14).
| USES Graph;
| TYPE
| g_plan=Array [1..16384] of Byte; { массив двух блоков }
| {Процедура сохранения изображения всего экрана на диске }
| { для адаптеров, работающих в режиме CGA. }
| PROCEDURE SaveCGAScr(file_name:String); {полное имя файла }
| VAR
| image_file : File;
| scr_buf : Pointer; { ссылка на буфер }
| scr_addr:g_plan absolute $B800:0; { память адаптера }