{ > Basically all I'm asking For are SaveScreen and RestoreScreen Procedures. > Procedures capable of just partial screen saves and restores would be > even better, but anything will do! :-) } Unit ScrUnit; Interface Const MaxPages = 20; Type PageType = Array [1..50,1..80] Of Word; PageArray = Array [1..MaxPages] Of ^PageType; Var Screen : ^PageType; ScrPages : PageArray; PageInMem : Array [1..MaxPages] Of Boolean; VideoMode : ^Byte; UseDisk : Boolean; Procedure InitPages(Pages : Byte); Procedure DeInitPages; Procedure StoreScreen(Page : Byte); Procedure RestoreScreen(Page : Byte); Implementation {$IFNDEF VER70} Const Seg0040 = $0040; SegB000 = $B000; SegB800 = $B800; {$endIF} Var MPages : Byte; SaveExitProc : Pointer; Function FStr(Num : LongInt) : String; Var Dummy : String; begin Str(Num,Dummy); FStr := Dummy; end; Procedure InitPages; Var Loop : Byte; begin If Pages>MaxPages Then Pages := MaxPages; For Loop:=1 To Pages Do If (MaxAvail>=SizeOf(PageType)) And (Not UseDisk) Then begin PageInMem[Loop] := True; GetMem(ScrPages[Loop],SizeOf(PageType)); end Else begin PageInMem[Loop] := False; ScrPages[Loop] := NIL; end; MPages := Pages; end; Procedure DeInitPages; Var Loop : Byte; begin If MPages>0 Then For Loop:=MPages DownTo 1 Do If PageInMem[Loop] Then begin Release(ScrPages[Loop]); PageInMem[Loop] := False; end; MPages := 0; end; Procedure StoreScreen; Var F : File Of PageType; begin If Page<=MPages Then begin If PageInMem[Page] Then Move(Screen^,ScrPages[Page]^,SizeOf(PageType)) Else begin Assign(F,'SCR'+FStr(Page)+'.$$$'); ReWrite(F); If IOResult=0 Then begin Write(F,Screen^); Close(F); end; end; end; end; Procedure RestoreScreen; Var F : File Of PageType; begin If Page<=MPages Then begin If PageInMem[Page] Then Move(ScrPages[Page]^,Screen^,SizeOf(PageType)) Else begin Assign(F,'SCR'+FStr(Page)+'.$$$'); Reset(F); If IOResult=0 Then begin Read(F,Screen^); Close(F); end; end; end; end; {$F+} Procedure ScreenExitProc; Var Loop : Byte; F : File; begin ExitProc := SaveExitProc; If MPages>0 Then For Loop:=1 To MPages Do begin Assign(F,'SCR'+FStr(Loop)+'.$$$'); Erase(F); If IOResult<>0 Then; end; end; {$F-} begin VideoMode := Ptr(Seg0040,$0049); If VideoMode^=7 Then Screen := Ptr(SegB000,$0000) Else Screen := Ptr(SegB800,$0000); MPages := 0; UseDisk := False; SaveExitProc := ExitProc; ExitProc := @ScreenExitProc; end. (* This simple Unit is able to store up to 20 screens. If there is enough free heap all screens are stored to heap which is Really fast. If there is not enough free heap or UseDisk=True all screens are stored virtually to disk. This method isn't very fast, of course, but it helps you to save heap. Use this Unit as follows: Program ThisIsMyProgram; Uses Screen; begin InitPages(5); { initialize 5 pages } {...} { this is on you } end. *)