Program GoodFade;
Uses
  Crt;

Const
  I1II111 = 75;
  IIIIII = 60;

Var
  Count, Count2 : Byte;
  Pal1, Pal2 : Array [0..255, 0..2] of Byte;

Procedure I1I1;
begin
  For Count := 0 to 255 DO
  begin
    PORT [$03C7] := Count;
    Pal1 [Count, 0] := PORT [$03C9];
    Pal1 [Count, 1] := PORT [$03C9];
    Pal1 [Count, 2] := PORT [$03C9];
   end;
  Pal2 := Pal1;
end;

Procedure IIIIIII;
begin
  For Count := 0 to 255 DO
  begin
    PORT [$03C8] := Count;
    PORT [$03C9] := Pal1 [Count, 0];
    PORT [$03C9] := Pal1 [Count, 1];
    PORT [$03C9] :=
    Pal1 [Count, 2];
  end;
end;

Procedure FadeOut;
begin
  For Count := 1 to I1II111 DO
  begin
    For Count2 := 0 to 255 DO
    begin
      if Pal2 [Count2, 0] > 0 then
        DEC (Pal2 [Count2, 0]);
      if Pal2 [Count2, 1] > 0 then
        DEC (Pal2 [Count2, 1]);
      if Pal2 [Count2, 2] > 0 then
        DEC (Pal2 [Count2, 2]);
      PORT [$03C8] := Count2;
      PORT [$03C9] := Pal2 [Count2, 0];
      PORT [$03C9] := Pal2 [Count2, 1];
      PORT [$03C9] := Pal2 [Count2, 2];
    end;
    Delay (IIIIII);
  end;
end;

Procedure FadeIn;
begin
  For Count := 1 to I1II111 DO
  begin
    For Count2 := 0 to 255 DO
    begin
      if Pal2 [Count2, 0] < Pal1 [Count2, 0] then
        INC (Pal2 [Count2, 0]);
      if Pal2 [Count2, 1] < Pal1 [Count2, 1] then
        INC (Pal2 [Count2, 1]);
      if Pal2 [Count2, 2] < Pal1 [Count2, 2] then
        INC (Pal2 [Count2, 2]);
      PORT [$03C8] := Count2;
      PORT [$03C9] := Pal2 [Count2, 0];
      PORT [$03C9] := Pal2 [Count2, 1];
      PORT [$03C9] := Pal2 [Count2, 2];
    end;
    Delay (IIIIII);
  end;
end;

begin
  I1I1;
  FadeOut;
  FadeIn;
  IIIIIII;
end.

