[Back to SAVESCRN SWAG index]  [Back to Main SWAG index]  [Original]

Unit Screens;
Interface

Uses Dos, Crt;

{
 Copyright Material by Mark Bloss exists in this file.

 Copyright 1995, all rights reserved.  Submitted to the
 public domain for use with TP or BP 7.0+
 No guarantees.  Use at your own risk, etc etc.

 Uses: This unit will save as many screens as you can fit
 into your heap-space.  I normally setup a constant section
 like this in my program
  const
     DOSscreen = 1;
     MainMenu  = 2;
     HelpScreen= 3;
  or similar, so I may use the names as identifiers rather than
  trying to remember all the numbers.

  Use in the program is simple.  At the beginning of my program
  I can save the screen at DOS (etc) by saving my screen immediately
  like this

  "savescreen(screen, DOSscreen);"

  and as part of my exit proc...
  "restorescreen(screen, DOSscreen);"
  and
  "losescreens(screen);"

  This will not only save the screen, but also the cursor position
  and restore the cursor to its original location when the screen
  was initially saved.

  GetCurWindow and GetCurColors are included and may be used
  independently.

  This unit is NOT a screen-saver, but may be used WITH a screen-
  saver if desired.

  To use this unit, compile and include "SCREENS" in your program's
  "Uses" statement.

}

const
      screenissaved :  boolean  =  false;
      newscreen     :  boolean  =  true;

type
      ScreenBuff= array [0..3999] of byte;
      ScreenPtr = ^ScreenRec ;
      ScreenRec = Record
                   Id          :  Byte;
                   HoldScreen  :  ScreenBuff;
                   xp,yp       :  Byte;
                   Next        :  ScreenPtr;
                  End;

 var
       CGA_buffer           :  ScreenBuff  ABSOLUTE $B800 : 0 ;
       Mono_buffer          :  ScreenBuff  ABSOLUTE $B000 : 0 ;
       identifier           :  byte;
       Screen               :  ScreenPtr;

function Monochrome : boolean;
    { if used on a monochrome monitor will return true }

Procedure LoseScreens ( var root : screenptr );
    { disposes of saved screens from heap }

Procedure SaveScreen (var  root : screenptr ; identifier : byte );
    { save a screen to heapspace, identified with a byte }

Procedure RestoreScreen ( root : screenptr ; identifier : byte );
    { restores a saved screen to the crt }

Procedure GetCurWindow(var x1, y1, x2, y2 : integer);
    { Use to save the window-size }

Procedure GetCurColors(var v1, v2 : integer);
    { Use to save colors/attributes of the screen }

{=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-}
Implementation
{=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-}
Function MonoChrome: boolean;
var
  Regs : Registers;
Begin
 INTR(17,Regs);
 Monochrome := ( (Regs.AX and $0030) = $30 );
End;

Procedure LoseScreens( var root : screenptr );
var  holder : screenptr;

begin
   if root <> nil then
    repeat
     holder := root^.next;
     dispose(root);
     root := holder;
    until root = nil;
end;

Procedure SaveScreen( var root : screenptr ; identifier : byte);
 var workrec  :  screenrec;
     current,
     holder   :  screenptr;
     replaced :  boolean;

Begin
   replaced := false;
   if Monochrome then      { savescreen }
     move ( mono_buffer, workrec.holdscreen, 4000 ) else
     move ( cga_buffer , workrec.holdscreen, 4000 );

   workrec.id := identifier ;         { a byte "label" }
   workrec.xp := wherex;              { current xloc   }
   workrec.yp := wherey;              { current yloc   }

  if root = nil then
  begin
   new(root);
   workrec.next := nil;
   root^ := workrec;
  end else
  begin
   current := root;
   holder  := root;
   repeat
    if current^.id = identifier then { replace screen already in list }
     begin
       move ( workrec.holdscreen, current^.holdscreen, 4000 );
       replaced := true;
     end;
    current := current^.next;
   until (current=nil) or replaced ;

   if not replaced then
    begin
      new(root);
      workrec.next := holder;      { adds record to "start" of list }
      root^  := workrec;
    end;
  end
End;

Procedure RestoreScreen ( root : screenptr ; identifier : byte );
var current : screenptr ;

Begin
  if root = nil then exit;
  current := root;
  while current <> nil do
   begin
     if current^.id = identifier then
     begin
      if monochrome then
        move ( current^.holdscreen, mono_buffer , 4000) else
        move ( current^.holdscreen, cga_buffer , 4000);
        gotoxy( current^.xp, current^.yp );       { put cursor back }
     end;
     current := current^.next;
   end;
  newscreen := true;
End;

Procedure GetCurWindow( var x1, y1, x2, y2 : integer );
Begin
  x1 := lo(WindMin)+1;
  y1 := hi(WindMin)+1;
  x2 := lo(WindMax)+1;
  y2 := hi(WindMax)+1;
End;

Procedure GetCurColors(var v1, v2 : integer );
Begin
 v1 := lo(textattr);
 v2 := hi(textattr);
End;

Begin
Screen := Nil;
End.

[Back to SAVESCRN SWAG index]  [Back to Main SWAG index]  [Original]