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

    {***********************************************************************}
    PROGRAM ScreenPortDemo;         { Sept 6/93, Greg Estabrooks.           }
    USES CRT;                       { LastMode,Clrscr.                      }
    CONST
         Speed = 50;                { Define speed for moving screen portion}
         {******** Change this to make the screen move faster/slower *******}
    TYPE
            ScreenPort = RECORD
                            ScreenSt :ARRAY[1..4000] OF BYTE;
                            NumCols,
                            NumRows  :BYTE;
                         END;

            ScreenPtr = ^ScreenSet;
            ScreenSet = ARRAY[1..50,1..80,0..1] OF BYTE;
                            {  1..50 = Row,  0..79 = Col, 0 = Character,
                                                          1 = Color Byte    }
    VAR
            TextScreen     :SCREENPTR;
            BaseOfScreen   :WORD;
            BPort,
            SPort          :ScreenPort;
            Row,Colm       :WORD;

    PROCEDURE SaveScrPort( Col1, Row1, Col2, Row2 :BYTE; VAR ScrP :SCREENPORT );
    VAR
            LLength :BYTE;
            Counter1,Counter2  :WORD;
    BEGIN
      Counter2 := 1;
      LLength := (2 * (Col2 - Col1))+2;
      For Counter1 := Row1 To Row2 DO
        BEGIN
          Move(TextScreen^[Counter1,Col1,0],ScrP.ScreenST[Counter2],LLength);
          Inc(Counter2,LLength);
        END;
      ScrP.NumCols := LLength;
      ScrP.NumRows := Row2 - Row1;
    END;

    PROCEDURE RestoreScrPort( Col,Row :BYTE; VAR ScrP :SCREENPORT );
    VAR
       Counter1,Counter2  :WORD;
    BEGIN
      Counter2 := 1;
      For Counter1 := Row To (Row + ScrP.NumRows) Do
        BEGIN
          Move(ScrP.ScreenST[Counter2],TextScreen^[Counter1,Col,0],ScrP.NumCols);
          Inc(Counter2,ScrP.NumCols);
        END;
    END;

    BEGIN
      IF LastMode = 7 THEN          { Check current video mode.             }
        BaseOfScreen := $B000       { If Monochrome load mono segment.      }
      ELSE
        BaseOfScreen := $B800;      { if not load color segment.            }
      TextScreen := Ptr(BaseOfScreen,0); { Now point TextScreen proper area.}

      SaveScrPort(10,5,20,15,BPort);{ Save a cleared part of the screen.    }
      GotoXY(1,1);                  { Move to top corner of screen.         }

      FOR Row := 1 to 20 DO         { Generate screen for demonstration.    }
        FOR Colm := 1 to 80 DO
           Write('A');

      SaveScrPort(10,5,20,15,SPort);{ Save a portion of the screen.         }
      ClrScr;                       { Clear the screen.                     }
      SaveScrPort(10,5,20,15,BPort);{ Redisplay saved portion.              }

      FOR Colm := 10 to 50 DO       { Animate portion right.                }
       BEGIN
         RestoreScrPort(Colm,5,SPort);
         Delay(Speed);
         RestoreScrPort(Colm,5,BPort);
       END;

      FOR Row := 5 to 14 DO         { Animate Portion Down.                 }
       BEGIN
         RestoreScrPort(50,Row,SPort);
         Delay(Speed);
         RestoreScrPort(50,Row,BPort);
       END;

      FOR Colm := 50 DOWNTO 10 DO   { Animate Portion Left.                 }
       BEGIN
         RestoreScrPort(Colm,14,SPort);
         Delay(Speed);
         RestoreScrPort(Colm,14,BPort);
       END;

      FOR Row := 14 DOWNTO 5 DO     { Animate Portion Up.                   }
       BEGIN
         RestoreScrPort(10,Row,SPort);
         Delay(Speed);
         RestoreScrPort(10,Row,BPort);
       END;
       RestoreScrPort(10,5,SPort);
      Readln;
    END.
    {***********************************************************************}

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