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.