{$G+,N+}
program foo;

uses crt, dos, motor;
var
   i,i2 : longint;
   a, b: integer;
   q, v: integer;
   x, y: integer;
   p: integer;
   buf: ppage;

const faszom : array[0..7] of array[0..31] of byte = (
             ( 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0 ),
             ( 1,1,1,1,1,1,0,0, 1,1,1,1,1,1,1,0, 1,1,0,0,0,1,1,0, 0,1,1,1,1,1,0,0 ),
             ( 0,1,1,0,0,1,1,0, 0,1,1,0,0,0,0,0, 1,1,1,0,1,1,1,0, 1,1,0,0,0,1,1,0 ),
             ( 0,1,1,0,0,1,1,0, 0,1,1,1,1,0,0,0, 1,1,1,1,1,1,1,0, 1,1,0,0,0,1,1,0 ),
             ( 0,1,1,0,0,1,1,0, 0,1,1,1,1,0,0,0, 1,1,0,1,0,1,1,0, 1,1,0,0,0,1,1,0 ),
             ( 0,1,1,0,0,1,1,0, 0,1,1,0,0,0,0,0, 1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0 ),
             ( 0,1,1,1,1,1,1,0, 0,1,1,1,1,1,1,0, 1,1,0,0,0,1,1,0, 1,1,1,1,1,1,1,0 ),
             ( 1,1,1,1,1,1,0,0, 1,1,1,1,1,1,1,0, 1,1,0,0,0,1,1,0, 0,1,1,1,1,1,0,0 )
      );

function msin(x : real) : real;
begin
    msin:=sin(x/28);
end;

begin
     randomize;
     init;
     buf:=getbuf;
     i2:=0;

     for i:=0 to 63 do begin
         setpal(i, i, 0, 0);
     end;
     for i:=64 to 255 do begin
         setpal(i, i, i-64, 0);
     end;
     setpal(255,255,255,255);

     clearscreen;

     repeat

     inc(i2);

     for i:=0 to 319 do begin
         putpixel(i, round(100 + (msin(i*3+i2*2)*40) + (msin(i+i2) * 40)), random(256));
         putpixel(i, round(100 + (msin(i*2.5+i2*1.5)*20) + (msin(i+45-i2*1.3) * 50)), random(256));
     end;

     for i:=0 to 319 do begin
         putpixel(i, 199, random(256));
     end;

     for i:=(63999-321) downto 0 do begin
         {a:=i+32000;}
         a:=i;
         p:=buf^[a];
         p:=p+buf^[a+319];
         p:=p+buf^[a+320];
         p:=p+buf^[a+321];
         p:=(p shr 2)-1;
         if (p < 0) then p:=0;
         buf^[a]:=p;
     end;

     for q:=0 to 31 do begin
         for v:=0 to 7 do begin
             x:=q*2 + 128 + round(msin(i2) * 100);
             y:=round(v * msin(i2*1.13-q*1.2) * 3) + 100 + round(msin(i2+q*(msin(i2)*3.14)) * 5);
             if (faszom[v, q] = 1) then putpixel(x, y, 255)
         end;
     end;


     fillchar(buf^[63999-320],320,#0);

{     delay(1000);}
     copy;

     until keypressed;

     done;
end.