
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.

