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


{ ScreenStuff : Turbo Pascal unit for saving and restoring portions of the
             screen.

  This source is released into the public domain by Intuitive Vision Software
  on 08/01/95.  This source may be used, modified and distributed with the
  following exceptions:

        * Modified versions of this source code may be distributed PROVIDING
          that the modified version still contains this header at the
          beginning of the file, and that no text has been deleted from the
          header.  Additional comments may be added to the header.

        * This source code may be used in commercial or shareware programs
          providing that mention is made of its use in the documentation for
          said program.  THIS INCLUDES modified versions of this unit.  The
          proper description of this unit is:

                The ScreenStuff Unit from Intuitive Vision Software          }


UNIT ScrStuff;

INTERFACE

USES Dos, Crt;

CONST VideoSegment : WORD = $B800;

TYPE  WindowREC    = ARRAY[0..4003] of BYTE;

PROCEDURE SaveWindow(VAR Wind:WindowREC; X1,Y1,X2,Y2:INTEGER);
PROCEDURE RestoreWindow(Wind:WindowREC);

IMPLEMENTATION

PROCEDURE CheckVideoSegment;
BEGIN
  IF (MEM[$0000:$0449]=7) Then VideoSegment:=$B000 else VideoSegment:=$B800;
END;


{ NOTE: SaveWindow does not clear the area that it saves.  It simply saves
  this data to an array.  Thus, in order to do what was stated above, you
  would simply define two variables of type WindowREC in your program, and
  save the first screen and the second screen into them.  Then whenever you
  needed to put them on the screen, you could use RestoreWindow to do so.
  NOTE: RestoreWindow does not clear the contents of the WindowREC variable
  passed to it, therefore this is possible.                                  }

{ ADDITIONAL NOTE:  SaveWindow and RestoreWindow do NOT save your window size
  or cursor position.  If you wish to modify it to do so, I would suggest
  increasing the WindowREC variable to ARRAY[0..4009] of BYTE, then place
  the window size and cursor position in the last 6 bytes.

  Current Window Size:

  x1:=LO(Windmin)+1;
  y1:=HI(Windmin)+1;
  x2:=LO(Windmax)+1;
  y2:=HI(Windmax)+1;

  Cursor position (window relative);

  x:=wherex;
  y:=wherey;

  }

PROCEDURE SaveWindow(VAR Wind:WindowREC; X1,Y1,X2,Y2:INTEGER);
VAR i,x,y:INTEGER;
BEGIN
  CheckVideoSegment;                    { Find out the video segment         }

  Wind[4000]:=X1; Wind[4001]:=Y1;       { Put the size of the saved screen in}
  Wind[4002]:=X2; Wind[4003]:=Y2;       { the array for use at restore       }

  i:=0;                                 { Fill array with correct values from}
  FOR y:=Y1 TO Y2 DO                    { memory                             }
    FOR x:=X1 to X2 DO BEGIN
      INLINE($FA);
      Wind[i]:=MEM[VideoSegment:(160*(y-1)+2*(x-1))];
      Wind[i+1]:=MEM[VideoSegment:(160*(y-1)+2*(x-1))+1];
      INLINE($FB);
      INC(i,2);
    end;
end;

PROCEDURE RestoreWindow(Wind:WindowREC);
VAR X1,Y1,X2,Y2,x,y,i:INTEGER;
BEGIN
  CheckVideoSegment;                    { Check the video segment            }

  WINDOW(1,1,80,25);                    { Set window to 1,1,80,25 and set    }
  TEXTCOLOR(7);                         { colors to 7,0 so that you have a   }
  TEXTBACKGROUND(0);                    { black background drawn             }

  X1:=Wind[4000]; Y1:=Wind[4001];       { set our mins/max values from the   }
  X2:=Wind[4002]; Y2:=Wind[4003];       { values in array                    }

  i:=0;                                 { move data from array into video    }
  FOR y:=Y1 TO Y2 DO                    { memory                             }
    FOR x:=X1 TO X2 DO BEGIN
      INLINE($FA);
      MEM[VideoSegment:(160*(y-1)+2*(x-1))]:=Wind[i];
      MEM[VideoSegment:(160*(y-1)+2*(x-1))+1]:=Wind[i+1];
      INLINE($FB);
      INC(i,2);
    END;
END;

END.

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