[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
program screen { save screen in file / restore screen from file };
{ only text mode screens }
{ no error checking! the video mode and
(if restoring the screen from a file)
the content of the file are not checked.
it only moves the video memory to a file
or from a file to the video memory }
{ if the file does not exist: the screen is saved in a new file
with the given name;
if the file does exist: the screen is restored from that file
the file is not deleted. }
uses dos;
Const
NoFAttr : word = $1C; { dir-, volume-, system attributen }
FAttr : word = $23; { readonly-, hidden-, archive attributen }
Var
{ bios area }
mode : byte absolute $40:$49; { current video mode }
columns : byte absolute $40:$4A; { number of columns }
dispOfs : word absolute $40:$4E; { current video page offset }
CrtPort : word absolute $40:$63; { CRT port address }
lastRow : byte absolute $40:$84; { newer bios only: rows on screen-1 }
VidSeg : word;
dispSize : word;
ScreenF : file;
Fname : string[128];
Attr : word;
Exists : boolean;
tel : word;
function GetVidSeg : word;
begin
if CrtPort = $3D4 then
GetVidSeg := $B800 { color }
else
GetVidSeg := $B000; { mono }
end;
Procedure SaveScreen;
begin
BlockWrite( ScreenF, mem[ vidseg : dispOfs ], dispSize, tel );
end;
Procedure RestoreScreen;
begin
BlockRead( ScreenF, mem[ vidseg : dispOfs ], dispSize, tel );
end;
begin
VidSeg := GetVidSeg;
dispSize := columns * (lastRow+1);
if ParamCount > 0 then
begin
Fname := FExpand( ParamStr( 1 ) );
Assign ( ScreenF, Fname );
{ ---------------------------------------------------------------------- }
{ does file exist? }
GetFAttr( ScreenF, Attr );
if DosError = 0 then
Exists := ((Attr and NoFAttr) = 0) { not dir-, volume- or system bit? }
else
Exists := False; { DosError }
{ ---------------------------------------------------------------------- }
if Exists then
Reset( ScreenF, 2 ) { open file }
else
Rewrite( ScreenF, 2 ); { create new file }
{}
if IOResult = 0 then { no error reading or creating file }
begin
if Exists then
RestoreScreen
else
SaveScreen;
Close( ScreenF );
end { if IOResult = 0 }
else { IOResult <> 0 ! }
Writeln( 'Error reading or creating file ', Fname );
{ endif IO error Fname }
end; { if ParamCount > 0 }
end.
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]