{ DANIEL SCHLENZIG }

Program stars;

Const
  maxstars = 200;

Var
  star  : Array[0..maxstars] of Word;
  speed : Array[0..maxstars] of Byte;
  i     : Word;

Procedure create;
begin
  For i := 0 to maxstars do
  begin
    star[i]  := random(320) + random(200) * 320;
    speed[i] := random(3) + 1;
    if mem[$a000 : star[i]] = 0 then
      mem[$a000 : star[i]] := 100;
  end;
end;

Procedure moveit; Assembler;
Asm
  xor   bp,bp
  mov   ax,0a000h
  mov   es,ax
  lea   bx,star
  lea   si,speed
  mov   cx,320

 @l1:
  mov   di,[bx]
  mov   al,es:[di]
  cmp   al,100
  jne   @j1
  xor   al,al
  stosb
 @j1:
  mov   al,[si]
  xor   ah,ah
  add   [bx],ax
  mov   ax,bx
  xor   dx,dx
  div   cx
  mul   cx
  mov   dx,bx
  sub   dx,ax
  cmp   dx,319
  jle   @j3
  sub   [bx],cx
 @j3:
  mov   di,[bx]
  mov   al,es:[di]
  or    al,al
  jnz   @j2
  mov   al,100
  stosb
 @j2:
  add   bx,2
  inc   si
  inc   bp
  cmp   bp,maxstars
  jle   @l1
 end;

begin
  Asm
    mov   ax,13h
    int   10h
    call  create

   @l1:
    mov   dx,3dah
   @r1:
    in    al,dx
    test  al,8
    je    @r1

    call moveit
    in   al,60h
    cmp  al,1
    jne  @l1;
  end;
end.
