NB_PART EQU 3500


SpriteParticle db  0, 2, 2, 0
               db  2,48,48, 2
               db  2,48,48, 2
               db  0, 2, 2, 0



; Entr‚es : ES:DI=dest:offset
;           DS=CS
; !!!!!!!!! Ne pas oublier de faire un EMMS avant d'utiliser le FPU !!!!!!
PutAParticle:
  mov bx,12
  .pap_loop:
    movd mm1,[bx+SpriteParticle]

    movd mm0,[es:di-75]
    paddusb mm0,mm1
    movd [es:di-75],mm0

    movd mm0,[es:di]
    paddusb mm0,mm1
    movd [es:di],mm0

    movd mm0,[es:di+75]
    paddusb mm0,mm1
    movd [es:di+75],mm0

    add di,256
    sub bx,4
  jns .pap_loop
ret


; Entr‚es : ES=dest

InitParticles:
  xor di,di
  xor eax,eax
  mov cx,NB_PART
  .ip_loop:
    call CreateNewParticle
    add di,16
  loop .ip_loop
ret

; Entr‚e : ES:DI=quelle particule
CreateNewParticle:
  call Random
  and eax,11111111111b
  add eax,120*256
  mov [es:di],eax        ; le x
  call Random
  and eax,11111111111b
  add eax,245*256
  mov [es:di+4],eax      ; le y
  call Random
  shr eax,25
  sub eax,64
  mov [es:di+8],eax
  call Random
  shr eax,22
  mov [es:di+12],eax
ret
    



;Entr‚es : ES=adresse des particules
;          DS=CS
MoveParticles:
  xor di,di

  mov cx,NB_PART
  .mp_loop:
    sub dword [es:di+12],8
    mov eax,[es:di]
    sub eax,[es:di+8]
    mov [es:di],eax
    cmp eax,65536
    jb .pas_new_x
      call CreateNewParticle
    .pas_new_x:
    mov eax,[es:di+4]
    sub eax,[es:di+12]
    mov [es:di+4],eax
    cmp eax,245*256
    jl .pas_new_y
      call CreateNewParticle
    .pas_new_y

    add di,16          ; passe … la part. suivante
  loop .mp_loop
ret


; Entr‚es : FS=particles data
;           ES=dest
;           DS=CS
AffParticles:
  xor si,si
  mov cx,NB_PART
  .ap_loop:
;    push cx
    mov al,[fs:si+1]
    mov ah,[fs:si+5]
    mov di,ax
    call PutAParticle
;    pop cx
    add si,16
  loop .ap_loop
  emms
ret

