{
A while back someone asked for a "cascade" type screen thingy, and a also a
screen wipe that would look sort of like a TV screen powering down... Here
they are... & I would like them to get into the next SWAG... 8)
}
Program Cascade1;

{causes entire screen to "fall", character by character, to the bottom of the }
{     screen...                                                               }
{                                                                             }
{              Released for SWAG use!  Use freely!                            }
{                                                                             }
{   But if you do use it, please let me know...                               }
{                                                                             }
{         Allen Walker  - Crazy Train ][  (604)383-2201                       }
{                                                                             }

Uses CRT;

Var MGAScreenMem:Array[0..1999] of Word Absolute $B000:0000;
    CGAScreenMem:Array[0..1999] of Word Absolute $B800:0000;

Function Mono_Colour:Boolean;
{Mono = False, Color = True}
Var I,J,X,Y:Integer;
    A,B,C,D:Word;
begin
  X:=WhereX-1; Y:=WhereY-1;
  C:=MGAScreenMem[Y*80+X]; D:=CGAScreenMem[Y*80+X];
  Write('A'+Chr(8));
  A:=MGAScreenMem[Y*80+X]; B:=CGAScreenMem[Y*80+X];
  MGAScreenMem[Y*80+X]:=C; CGAScreenMem[Y*80+X]:=D;
  If (A mod 256) =$41 then begin Mono_Colour:=False; Exit; end;
  If (B mod 256) =$41 then begin Mono_Colour:=True; Exit; end;
end;

Procedure Cascade;
Var L,I,X : Word;
    MC    : Boolean;
begin
  MC:=Mono_Colour;
  For L:=1 to 25 do
  begin
    For I:=1999 downto 80 do
    begin
      If MC then
      begin
        If (CGAScreenMem[I] and $70FF =32) and
                     (CGAScreenMem[I-80] and $70FF <>32) then
        begin
          X:=CGAScreenMem[I]; CGAScreenMem[I]:=CGAScreenMem[I-80];
          CGAScreenMem[I-80]:=X;
        end;
      end
        else
      begin
        If (MGAScreenMem[I] and $70FF =32) and
                     (MGAScreenMem[I-80] and $70FF <>32) then
        begin
          X:=MGAScreenMem[I]; MGAScreenMem[I]:=MGAScreenMem[I-80];
          MGAScreenMem[I-80]:=X;
        end;
      end;
    end;
      Delay(100);
  end;
end;

begin
  Cascade;
end.





Program CRTWipe;
{Causes screen to wipe from bottom & top towards the middle, then from the    }
{   sides to the center...                                                    }
{                                                                             }
{              Released for SWAG use!  Use freely!                            }
{                                                                             }
{   But if you do use it, please let me know...                               }
{                                                                             }
{         Allen Walker  - Crazy Train ][  (604)383-2201                       }
{                                                                             }
Uses CRT;

Var MGAScreenMem:Array[0..1999] of Word Absolute $B000:0000;
    CGAScreenMem:Array[0..1999] of Word Absolute $B800:0000;
    MC : Boolean;

Function Mono_Colour:Boolean;
{Mono = False, Color = True}
Var I,J,X,Y:Integer;
    A,B,C,D:Word;
begin
  X:=WhereX-1; Y:=WhereY-1;
  C:=MGAScreenMem[Y*80+X]; D:=CGAScreenMem[Y*80+X];
  Write('A'+Chr(8));
  A:=MGAScreenMem[Y*80+X]; B:=CGAScreenMem[Y*80+X];
  MGAScreenMem[Y*80+X]:=C; CGAScreenMem[Y*80+X]:=D;
  If (A mod 256) =$41 then begin Mono_Colour:=False; Exit; end;
  If (B mod 256) =$41 then begin Mono_Colour:=True; Exit; end;
end;

Procedure SetChar(N,Z:Word);
begin
  If MC then CGAScreenMem[N]:=Z else MGAScreenMem[N]:=Z;
end;

Function ReadChar(N:Word):Word;
begin
  If MC then ReadChar:=CGAScreenMem[N] else ReadChar:=MGAScreenMem[N];
end;

Procedure WipeIt;
Var L,X,Y,Z : Word;
begin
  MC:=Mono_Colour;
  For L:=1 to 12 do
  For Y:=12 downto 0 do
  begin
    For X:=0 to 79 do
    begin
      Z:=ReadChar(X+(80*Y)); SetChar(X+(80*Y)+80,Z); SetChar(X+(80*Y),1792);
    end;
    For X:=0 to 79 do
    begin
      Z:=ReadChar(X+(80*(25-Y))); SetChar(X+(80*(25-Y))-80,Z);
      SetChar(X+(80*(25-Y)),1792);
    end;
  end;
  Delay(100);
  For X:=0 to 39 do
  begin
    SetChar(X+960,1792); SetChar(1039-X,1792); Delay(10);
  end;
end;

begin
  WipeIt;
end.
