unit pal; {работа с 256-цветной палитрой}
interface

procedure SetPal(var pal:byte;nbegpal,lenpal:integer);
                       {установка 256-цветной палитры}
procedure GetPal(var pal:byte;nbegpal,lenpal:integer);
                          {чтение 256-цветной палитры}
procedure WaitVerticalRetrace;
            {ожидание вертикально обратного хода луча}
procedure BlackPal;       {установка «черной» палитры}
procedure FadeOut(p:array of byte);
                             {плавное гашение палитры}
procedure FadeIn(p:array of byte);
                           {плавная установка палитры}
implementation
uses dos;

{установка 256-цветной палитры}
procedure SetPal(var pal:byte;nbegpal,lenpal:integer);
var r:registers;
begin
   r.ax := $1012;
   r.bx := nbegpal;
   r.cx := lenpal;
   r.dx := ofs(pal);
   r.es := seg(pal);
   intr($10,r);
end;

{чтение 256-цветной палитры}
procedure GetPal(var pal:byte;nbegpal,lenpal:integer);
var r:registers;
begin
   r.ax := $1017;
   r.bx := nbegpal;
   r.cx := lenpal;
   r.dx := ofs(pal);
   r.es := seg(pal);
   intr($10,r);
end;

{ожидание вертикально обратного хода луча}
procedure WaitVerticalRetrace;
begin
   while (port[$3da] and 8) = 0 do;
end;

{установка «черной» палитры}
procedure BlackPal;
var p : array[0..767]of byte;
begin
   fillchar(p,sizeof(p),0);
   SetPal(p[0],0,256);
end;

{плавная установка палитры}
procedure FadeIn(p:array of byte);
var
   p1 : array[0..767]of byte;
   i,j : integer;
begin
   BlackPal;
   for i := 0 to 63 do begin
      for j := 0 to 767 do    {«поднимаем» цвета до }
         p1[j] := round(p[j]/63*i);{ нужной палитры }
      WaitVerticalRetrace;
      SetPal(p1[0],0,256);
   end;
end;

{плавное гашение палитры}
procedure FadeOut(p:array of byte);
var
   p1 : array[0..767]of byte;
   i,j : integer;
begin
   for i := 0 to 767 do
      p1[i] := p[i];
   for i := 63 downto 0 do begin
      for j := 0 to 767 do    {«опускаем» цвета}
          p1[j] := round(p[j]/63*i); { до 0  }
      WaitVerticalRetrace;
      SetPal(p1[0],0,256);
   end;
end;

end.
719