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

    {> 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!  :-)
    }
    Program SaveScr;

    Uses
      Crt,
      Dos;

    Const
      vidseg : Word = $B800;
      ismono : Boolean = False;

    Type
      Windowrec = Array [0..4003] Of
      Byte;

    Var
      NewWindow : Windowrec;
      c : Char;

    Procedure checkvidseg;
    begin
      If (mem [$0000 : $0449] = 7) Then
         vidseg := $B000
      Else
         vidseg := $B800;
      ismono := (vidseg = $B000);
    end;

    Procedure savescreen (Var wind : Windowrec;
      TLX, TLY, BRX, BRY : Integer);
    Var x, y, i : Integer;
    begin
      checkvidseg;
      wind [4000] := TLX;
      wind [4001] := TLY;
      wind [4002] := BRX;
      wind [4003] := BRY;
      i := 0;
      For y := TLY To BRY Do
          For x := TLX To BRX Do
              begin
              InLine ($FA);
              wind [i] := mem [vidseg : (160 * (y - 1) + 2 * (x - 1) ) ];
              wind [i + 1] := mem [vidseg : (160 * (y - 1) + 2 * (x - 1) ) + 1];
              InLine ($FB);
              Inc (i, 2);
              end;
    end;

    Procedure setWindow (Var wind : Windowrec;
      TLX, TLY, BRX, BRY : Integer);
    Var i : Integer;
    begin
      savescreen (wind, TLX, TLY, BRX, BRY);
      Window (TLX, TLY, BRX, BRY);
      ClrScr;
    end;

    Procedure removeWindow (wind : Windowrec);
    Var TLX, TLY, BRX, BRY, x, y, i : Integer;
    begin
      checkvidseg;
      Window (1, 1, 80, 25);
      TLX := wind [4000];
      TLY := wind [4001];
      BRX := wind [4002];
      BRY := wind [4003];
      i := 0;
      For y := TLY To BRY Do
          For x := TLX To BRX Do
              begin
              InLine ($FA);
              mem [vidseg : (160 * (y - 1) + 2 * (x - 1) ) ] := wind [i];
              mem [vidseg : (160 * (y - 1) + 2 * (x - 1) ) + 1] := wind [i + 1];
              InLine ($FB);
              Inc (i, 2);
              end;
    end;

    begin
      setWindow (NewWindow, 1, 1, 80, 25);
      GotoXY(1, 12);
      Write ('Press a key to restore original screen...');
      Repeat
      Until KeyPressed;
      c := ReadKey;
      removeWindow (NewWindow);
      GotoXY (1, 24);
    end.

    {
    You can set the size of the Window to whatever you want, and save/restore as
    many Windows as you have memory available.
    }

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