{
{Places a large vector ball ellipse on the screen and makes it bounce
 to pieces= nice visual effect}
uses crt;
const Balls = 1400;
      startcolor=50;
type movement= record
     x,   y : integer;  { position }
    dx,  dy : integer;  { velocity }
   ddx, ddy : integer;  { acceleration }
   color    : integer;
   MaxYValue: integer;
        END;
VAR ch : char;
    I,
    Pull  : integer;
    Dummy : string;
    Ball  : array[1..BAlls] of movement;
procedure PutDot(x,y,color:integer);
  begin
    Mem[$a000{VGA_Segment}:(y*320)+x] := color;
  end;
Procedure VideoMode ( Mode : Byte );
    Begin { VideoMode }
      Asm
        Mov  AH,00
        Mov  AL,Mode
        Int  10h
      End;
    End;  { VideoMode }
Procedure SetColors ( Color, Red, Green, Blue : Byte );
    Begin { SetColor }
      Port[$3C8] := Color;
      Port[$3C9] := Red;
      Port[$3C9] := Green;
      Port[$3C9] := Blue;
    End;  { SetColor }
BEGIN {MAIN}
videoMODE($13);
for I:=1 to 250 do setcolors(I,i mod 50,
                             i mod 50-20,
                             I div ((i div 63)+1));
fillchar(mem[$A000:(191*320)],320*8,Ord(StartColor));{line at bottom}
FOR I:=1 to BAlls do BEGIN {INIT the balls into the array}
WITH ball[i] do BEGIN
  ddx  := 0;
  ddy  := 1;             {constant pull downward}
  dx   := Random(5)-2;   { start it moving left or right }
  if dx=0 then dx:=1;    { not still}
  dy   := 0;             { the object is initially at rest }
  x    := trunc(cos(i)*140)+140+((i div ((i div 4)+1))*6);
  y    := trunc(Sin(I+((i div ((I div 4)+1))))*70)+60+
          ((i div ((I div 4)+1)*12)); {   you specified }
  color:=Random( I div ((I div 254)+1)) + 1;  {Each Balls color}
  MaxYValue:=Y;
END; {with}
END; {for do loop}
Pull:=0; {init the gravity degrading effect}
WHILE not(keypressed) do begin
 FOR I:=1 to Balls do BEGIN
  With ball[I] do BEGIN
  putdot(x, y, 0);    { blank out the pixel drawn on the last iteration }
  dx := dx + ddx;     { updating velocity }
  dy := dy + ddy;
  x  :=  x +  dx;     { updating position }
  y  :=  y +  dy;
  IF x< 1 then begin      {hits left of screen}
     X  := 1;
     dx := dx*-1;
  End;
  IF x > 319 then begin   {hits right of screen}
     x  := 319;
     dx := -dx;
  END;
  IF y > 190 then begin   { BOUNCE! }
     y  := 190-(y-190)+1;
     dy := -dy+pull;
  End;
  putdot(x, y, color);  { draw the pixel at the new position }
  END; {WITH}
 END; {for do loop}
END; {KEYPRESS}
VideoMODE($3);
END. {PROGRAM}
