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

    {
     > Would anyone here know how to fade out/in only part of the screen? i.e.
     > the left half of it or somethin?
    }

    Program Cheap_Cross_Fading;
    Uses CRT;

    {
      Here's a cheap cross fading routine I did some time ago. I cleaned it up,
      optimized a few parts, and made it look pretty. <g>.

      Use or abuse at will, just, as always, throw me a greet in your scrolltext
      of doc files. Greet me as Dr. Nibble. Or if you dislike handles for some
      anal reason, greet me as David Proper.
    }

    Const
     Bits : array[1..8] of byte = ($80,$40,$20,$10,$08,$04,$02,$01);

     MaxText = 6;
     TextList : Array[1..MaxText] of String[30] = (
                ' Dr. Nibble of',
                '    Daemon',
                '   presents',
                '   a cheap',
                ' crossfading',
                '   routine');

    var
     Counter : integer;
     CH      : char;
     Loop    : integer;
     Di     : byte;

    Procedure GTxT(Xp,Yp, Color : Integer; Line : String; Fseg,Fofs: word;
                   FYS : integer);
    Var
     Loop  : Byte;
     X     : Integer;
     Y     : Integer;

    begin
     For Loop := 1 to Length(line) do
      For Y := 1 to FYS do
       For X := 1 to 8 do
        {$R-}
        If MEM[Fseg:Fofs+(Y-1)+ord(Line[Loop])*FYS] and bits[X] <> 0 then
         if Mem[$A000:(Loop*9)+(X+Xp)+(320*(Y+Yp))] = di then
            Mem[$A000:(Loop*9)+(X+Xp)+(320*(Y+Yp))] := 3 else
            Mem[$A000:(Loop*9)+(X+Xp)+(320*(Y+Yp))] := Color
        {$R+}
    end;

    Procedure SetColor(C,R,G,B : Byte);
     Begin
      Port[$3C8] := C; Port[$3C9] := R; Port[$3C9] := G; Port[$3C9] := B;
     End;

    Procedure VideoMode(Mode : Byte);
     Begin
      Asm
       Mov  AH,00
       Mov  AL,Mode
       Int  10h
      End;
     End;

    BEGIN
     VideoMode($13);
     DI := 2;
     Counter := 1;

    repeat
     FillChar(mem[$A000:0],$ffff,#0);
     SetColor(1,0,0,0); SetColor(2,1,0,0); SetColor(3,1,0,0);
     DI := 2;
     GTxT(90,90,1,TextList[Counter+1],$F000,$FA6E,8);
     dec(di); if di = 0 then di := 2;
     GTxT(90,90,2,TextList[Counter],$F000,$FA6E,8);
     for loop := 1 to 63 do begin
                             SetColor(2,loop,0,0);
                             SetColor(3,loop,0,0);
                             delay(20);
                            end;
     delay(400);
     for loop := 1 to 63 do begin
                             SetColor(1,loop,0,0);
                             SetColor(2,63-loop,0,0);
                             if loop < 32 then SetColor(3,63-loop,0,0)
                                          else SetColor(3,loop,0,0);
                             delay(20);
                            end;
     delay(400);
     for loop := 1 to 63 do begin
                             SetColor(1,63-loop,0,0);
                             SetColor(3,63-loop,0,0);
                             Delay(20);
                            end;
     inc(Counter,2); if counter > MaxText then counter := 1;
    until keypressed;

     ch := readkey;
     VideoMode(3);
    END.

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