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

UNIT FadeUnit;        { This unit does some fading (I hope!) }
                      { The SetCol procedure lets you change individual}
                      { palette entries , for an easier way, try }
                      { the TP setrgbpalette procedure...}
                      { Regards Florian Ansorge :-) }
INTERFACE

Procedure InitCol; {gets the current palette and saves it}

Procedure FadeOUT(Duration:Byte);   { lowers/increases the brightness,}
Procedure FadeIN(Duration:Byte);    { duration determines the time it takes}

Procedure SetBrightness(Brightness :Byte);
                                    {sets the brightness to brightness / 63 }
IMPLEMENTATION

USES Crt, Dos;

CONST     PelIdxR  = $3c7; {Port to read}
          PelIdxW  = $3c8; {Port to write}
          PelData  = $3c9; {Dataport}
          Maxreg   = 255;  {Set to 63 for textmode}
          MaxInten = 63;

VAR col : ARRAY[0..MaxReg] of RECORD
                                r, g, b : Byte
                              END;

PROCEDURE GetCol(ColNr :Byte; var r, g, b :Byte);
BEGIN
  Port[PelIdxR] := ColNr;
  r := Port[PelData];
  g := Port[PelData];
  b := Port[PelData];;
END;

PROCEDURE SetCol(ColNr, r, g, b :Byte); {Change just one colour}
BEGIN
  Port[PelIdxW] := ColNr;
  Port[PelData] := r;
  Port[PelData] := g;
  Port[PelData] := b;
END;

PROCEDURE InitCol; {save initial palette}

VAR i :Byte;

BEGIN
  FOR i := 0 to MaxReg DO
    GetCol(i,col[i].r,col[i].g,col[i].b);
END;

PROCEDURE SetBrightness(Brightness :Byte);

VAR i          :Byte;
    fr, fg, fb :Byte;

BEGIN
  FOR i := 0 to MaxReg DO
  BEGIN
    fr := col[i].r * Brightness DIV MaxInten;
    fg := col[i].g * Brightness DIV MaxInten;
    fb := col[i].b * Brightness DIV MaxInten;
    SetCol(i,fr,fg,fb);
  END;
END;

PROCEDURE FadeOUT(Duration :Byte);

VAR i :Byte;

BEGIN
  FOR i := MaxInten downto 0 DO
  BEGIN
    SetBrightness(i);
    Delay(Duration);
  END;
END;

PROCEDURE FadeIN(Duration :Byte);

VAR i :Byte;

BEGIN
  FOR i := 0 to MaxInten DO
  BEGIN
    SetBrightness(i);
    Delay(Duration);
  END;
END;

BEGIN
END.

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