;
;  include file for Crown_s Soft Screensaver
;
;  You may add you own figures for Screensaver.
;    For example see tor function.
;    If you add new figures, please contact us, we will help you.
;
;input  parametrs:
;  alf=word [esi]   - random quantity     0<=alf<=0xffff
;  bet=word [esi+2] - random quantity     0<=bet<=0xffff
;  Fl  - number of point in frame
;            (may be used as random quantity) 0<=Fl<=mFl
;  p   - number of frame
;            (may be use for animated figures)
;
;output parametrs:
;  st0=x, st1=y, st2=z



  align 8

  const_mpi  dd   0.0000958767251683032697061874258638112  ; 1/00007fffh*pi
  const_m    dd   0.0000305185094759971922971282082583087  ; 1/00007fffh



  tabl_calls dd  cubes
             dd  explosion
             dd  galaxy
             dd  cube
             dd  sin
             dd  tor1
             dd  tors
             dd  spiral
             dd  tor
             dd  planet
             dd  balls
  num_tabl_calls=11

  tor_r     dw   60
  tor_R     dw   175

  balls_x1  dw   0
  balls_x2  dw   189
  balls_x3  dw   -94
  balls_x4  dw   -94
  balls_y1  dw   0
  balls_y2  dw   0
  balls_y3  dw   163
  balls_y4  dw   -163
  balls_z1  dw   200
  balls_z2  dw   -71
  balls_z3  dw   -71
  balls_z4  dw   -71
  balls_R   dw   35

  cube_R    dw   118

  spiral_R  dw   100
  spiral_r  dw   20
  spiral_h  dw   150
  spiral_L  dw   12

  sin_a     dw   165
  sin_c     dw   3
  sin_k     dw   20
  sin_A     dw   85
  sin_R     dw   10

  planet_R  dw   120
  planet_r  dw   25
  planet_h  dw   195
  planet_d  dw   30

  tors_r    dw   10
  tors_R1   dw   100
  tors_R2   dw   150
  tors_R3   dw   200
  tors_a1   dw   6
  tors_a2   dw   3

  tor1_R      dw 7
  tor1_r      dd 1.8
  tor1_turns  dd 25.132741228718345907701147066236  ; 2*4*pi
  tor1_whorls dd 87.9645943005142106769540147318261 ; 7*4*pi
  tor1_a      dw 20

  galaxy_rq dw   45
  galaxy_rz dw   30
  galaxy_R  dw   185
  galaxy_k  dd   9.42477796076937971538793014983851 ; 3*pi
  galaxy_A  dw   230


  cubes_R    dw   70

  explosion_R dw 230

;---------------------------------------------------------------------------
;----------------------- calculation figures -------------------------------
;---------------------------------------------------------------------------


;---------------------------- explosion ------------------------------------
explosion:
  fild  word [esi]    ; st0=alf
  fmul  [const_mpi]   ; st0=a=pi*alf*malf
  fsincos             ; st0=cos(a)  st1=sin(a)
  fild  [Fl]
  fidiv [mFl]
  fadd  [al_r]
  fsin
  fimul [explosion_R] ; st0=R  st1=cos(a)  st2=sin(a)
  fmul  st2,st0       ; st0=R  st1=cos(a)  st2=R*sin(a)
  fmulp st1,st0       ; st0=R*cos(a)  st2=R*sin(a)
  fild word [esi+2]   ; st0=bet  st1=R*cos(a)  st2=R*sin(a)
  fmul  [const_mpi]   ; st0=pi*bet*mbet  st1=R*cos(a)  st2=R*sin(a)
  fsincos       ; st0=cos(b)  st1=sin(b)  st2=R*cos(a)  st3=R*sin(a)
  fxch  st2     ; st0=R*cos(a)  st1=sin(b)  st2=cos(b)  st3=R*sin(a)
  fmul  st2,st0 ; st0=R*cos(a)  st1=sin(b)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
  fmulp st1,st0 ; st0=R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)
ret


;------------------------------ cubes --------------------------------------
cubes:
   push  edx
   xor   edx,edx
   mov   eax,[Fl]
   div   [const6]


   fild  [cubes_R]    ; st0=R
   bt      dx,0
   jc      cubes_l0
                      ; ax=xxxx xxxx  xxxx xxx0b
     fchs             ; st0=-R
   cubes_l0:

   fild  word [esi+2] ; st0=bet         st1=R
   fmul  [const_m]    ; st0=bet*mbet    st1=R
   fmul  st0,st1      ; st0=R*bet*mbet  st1=R

   fild  word [esi]   ; st0=alf  st1=R*bet*mbet  st2=R
   fmul  [const_m]    ; st0=alf*malf  st1=R*bet*mbet  st2=R
   fmul  st0,st2      ; st0=R*alf*malf  st1=R*bet*mbet  st2=R

   bt      dx,2
   jc      cubes_l1   ; dx=xxxx xxxx  xxxx x10xb
   bt      dx,1
   jc      cubes_l2   ; dx=xxxx xxxx  xxxx x01xb
                      ; dx=xxxx xxxx  xxxx x00xb
     fstp  st3
   cubes_l1:
     fstp  st3
   cubes_l2:

   div     [const6]

   fild    [cubes_R]  ; st0=R
   fadd    st0,st0
   bt      dx,0
   jc      cubes_l4
                      ; ax=xxxx xxxx  xxxx xxx0b
     fchs             ; st0=-R
   cubes_l4:
   faddp st1,st0

   bt      dx,2
   jc      cubes_l5   ; ax=xxxx xxxx  xxxx x10xb
   bt      dx,1
   jc      cubes_l6   ; ax=xxxx xxxx  xxxx x01xb
                      ; ax=xxxx xxxx  xxxx x00xb
     fstp  st3
   cubes_l5:
     fstp  st3
   cubes_l6:

   pop     edx
ret


;----------------------------- galaxy --------------------------------------
galaxy:
  bt      [Fl],0
  jc      not_gal
    fild    [Fl]
    fidiv   [mFl]        ; st0=f=Fl/mFl
    fild    word [esi+2] ; st0=bet  st1=f
    fmul    [const_mpi]  ; st0=b=pi*bet*mbet  st1=f
    fsincos              ; st0=cos(b)  st1=sin(b)  st2=f
    fild    word [esi]   ; st0=alf  st1=cos(b)  st2=sin(b)  st3=f
    fmul    [const_m]    ; st0=a=alf*malf  st1=cos(b)  st2=sin(b)  st3=f
    fmul    st2,st0      ; st0=a  st1=cos(b)  st2=a*sin(b)  st3=f
    fmulp   st1,st0      ; st0=a*cos(b)       st1=a*sin(b)  st2=f
    fmul    st0,st2      ; st0=f*a*cos(b)     st1=a*sin(b)  st2=f
    fimul   [galaxy_rz]  ; st0=rz*f*a*cos(b)  st1=a*sin(b)  st2=f
    fstp    st3          ; st0=a*sin(b)           st1=f  st2=Z
    fimul   [galaxy_rq]  ; st0=a*rq*sin(b)        st1=f  st2=Z
    fiadd   [galaxy_R]   ; st0=R+a*rq*sin(b)      st1=f  st2=Z
    fxch    st1          ; st0=f  st1=R+rq*a*sin(b)      st2=Z
    fmul    st1,st0      ; st0=f  st1=f*(R+rq*a*sin(b))  st2=Z
    fmul    [galaxy_k]   ; st0=F=k*f  st1=f*(R+rq*a*sin(b))  st2=Z

    bt  [Fl],1
    jc  gal_lb
      fldpi
      faddp   st1,st0    ; st0=F=F+pi  st1=f*(R+rq*a*sin(b))  st2=Z
    gal_lb:

    fsincos           ; st0=cos(F)  st1=sin(F)  st2=f*(R+rq*a*sin(b))  st3=Z
    fxch  st2         ; st0=f*(R+rq*a*sin(b))  st1=sin(F)  st2=cos(F)  st3=Z
    fmul  st2,st0
    fmulp st1,st0     ; st0=cos(F)*f*(R+rq*a*sin(b))  st1=sin(F)*f*(R+rq*a*sin(b))  st2=Z
  ret
  not_gal:
    fild  word [esi]  ; st0=alf
    fmul  [const_mpi] ; st0=a=pi*alf*malf
    fsincos           ; st0=cos(a)  st1=sin(a)
    fild  [Fl]        ; st0=Fl  st1=cos(a)  st2=sin(a)
    fidiv [mFl]       ; st0=Fl/mFl  st1=cos(a)  st2=sin(a)
    fmul  st0,st0
    fmul  st0,st0
    fmul  st0,st0
    fst   st3
    fimul [galaxy_A]  ; st0=R=A*Fl/mFl  st1=cos(a)  st2=sin(a)
    fmul  st2,st0     ; st0=R  st1=cos(a)  st2=R*sin(a)
    fmulp st1,st0     ; st0=R*cos(a)  st2=R*sin(a)
    fild word [esi+2] ; st0=bet  st1=R*cos(a)  st2=R*sin(a)
    fmul  [const_mpi] ; st0=pi*bet*mbet  st1=R*cos(a)  st2=R*sin(a)
    fsincos           ; st0=cos(b)  st1=sin(b)  st2=R*cos(a)  st3=R*sin(a)
    fxch st2          ; st0=R*cos(a)  st1=sin(b)  st2=cos(b)  st3=R*sin(a)
    fmul st2,st0      ; st0=R*cos(a)  st1=sin(b)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
    fmulp st1,st0     ; st0=R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)

    ; around Z
    fld  st1
    fld  st1     ; st0=x  st1=y  st2=x  st3=y  st4=z
    fld  [al_r]  ; st0=a  st1=x  st2=y  st3=x  st4=y  st5=z
    fchs
    fmul  st0,st6
    fsincos       ; st0=cos(a)  st1=sin(a)  st2=x  st3=y  st4=x  st5=y  st6=z
    fmul  st4,st0
    fmulp st5,st0
    fmul  st2,st0
    fmulp st1,st0 ; st0=x*sin(a) st1=y*sin(a) st2=x*cos(a) st3=y*cos(a)  st4=z
    faddp st3,st0
    fsubp st1,st0

    ffree st3
ret



;------------------------------ balls --------------------------------------
balls:
  mov     eax,[Fl]
  and     eax,03h

  fild  word [esi]  ; st0=alf
  fmul  [const_mpi] ; st0=a=pi*alf*malf
  fsincos           ; st0=cos(a)  st1=sin(a)
  fild  [balls_R]   ; st0=R  st1=cos(a)  st2=sin(a)
  fmul  st2,st0     ; st0=R  st1=cos(a)  st2=R*sin(a)
  fmulp st1,st0     ; st0=R*cos(a)  st2=R*sin(a)
  fild word [esi+2] ; st0=bet  st1=R*cos(a)  st2=R*sin(a)
  fmul  [const_mpi] ; st0=pi*bet*mbet  st1=R*cos(a)  st2=R*sin(a)
  fsincos           ; st0=cos(b)  st1=sin(b)  st2=R*cos(a)  st3=R*sin(a)
  fxch  st2     ; st0=R*cos(a)  st1=sin(b)  st2=cos(b)  st3=R*sin(a)
  fmul  st2,st0 ; st0=R*cos(a)  st1=sin(b)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
  fmulp st1,st0 ; st0=R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)

  fiadd [balls_y1+2*eax] ; st0=y+R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)
  fxch  st1              ; st0=R*cos(a)*cos(b)    st1=y+R*cos(a)*sin(b)  st2=R*sin(a)
  fiadd [balls_z1+2*eax] ; st0=z+R*cos(a)*cos(b)  st1=y+R*cos(a)*sin(b)  st2=R*sin(a)
  fxch  st2              ; st0=R*sin(a)  st1=y+R*cos(a)*sin(b)  st2=z+R*cos(a)*cos(b)
  fiadd [balls_x1+2*eax] ; st0=x+R*sin(a)  st1=y+R*cos(a)*sin(b)  st2=z+R*cos(a)*cos(b)
ret


;------------------------------- sin ---------------------------------------
sin:
  test    [Fl],3Fh

  fild    word [esi]   ; st0=alf

  jnz sin_lb1
    fmul  [const_mpi]  ; st0=a=pi*alf*malf
    fsincos            ; st0=cos(a)  st1=sin(a)
    fild  [sin_R]      ; st0=R  st1=cos(a)  st2=sin(a)
    fmul  st2,st0      ; st0=R  st1=cos(a)  st2=R*sin(a)
    fmulp st1,st0      ; st0=R*cos(a)  st2=R*sin(a)
    fild  word [esi+2] ; st0=bet  st1=R*cos(a)  st2=R*sin(a)
    fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=R*cos(a)  st2=R*sin(a)
    fsincos            ; st0=cos(b)  st1=sin(b)  st2=R*cos(a)  st3=R*sin(a)
    fxch  st2          ; st0=R*cos(a)  st1=sin(b)  st2=cos(b)  st3=R*sin(a)
    fmul  st2,st0      ; st0=R*cos(a)  st1=sin(b)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
    fmulp st1,st0      ; st0=R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)
    fiadd [sin_A]      ; st0=A+R*cos(b)*sin(a)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
  ret

  sin_lb1:
  fmul  [const_m]   ; st0=alf*malf
  fild word [esi+2] ; st0=bet  st1=alf*malf
  fmul  [const_m]   ; st0=bet*mbet  st1=alf*malf

  fld   st0     ; st0=bet*mbet  st1=bet*mbet  st2=alf*malf
  fmul  st0,st0 ; st0=(bet*mbet)^2  st1=bet*mbet  st2=alf*malf
  fld   st2     ; st0=alf*malf st1=(bet*mbet)^2  st2=bet*mbet  st3=alf*malf
  fmul  st0,st0 ; st0=(alf*malf)^2  st1=(bet*mbet)^2  st2=bet*mbet  st3=alf*malf
  faddp st1,st0 ; st0=(alf*malf)^2+(bet*mbet)^2  st1=bet*mbet  st2=alf*malf
  fsqrt         ; st0=r=sqr((alf*malf)^2*(bet*mbet)^2)  st1=bet*mbet  st2=alf*malf
  fild  [sin_k] ; st0=k  st1=r  st2=bet*mbet  st3=alf*malf
  fmul  st0,st1 ; st0=k*r  st1=r  st2=bet*mbet  st3=alf*malf
  fsin          ; st0=sin(k*r)  st1=r  st2=bet*mbet  st3=alf*malf
  fdivrp st1,st0 ; st0=sin(k*r)/r  st1=bet*mbet  st2=alf*malf
  fimul [sin_c] ; st0=c*sin(k*r)/r  st1=bet*mbet  st2=alf*malf

  fild  [sin_a] ; st0=a  st1=c*sin(k*r)/r  st2=bet*mbet  st3=alf*malf
  fmul  st2,st0 ; st0=a  st1=c*sin(k*r)/r  st2=a*bet*mbet  st3=alf*malf
  fmulp st3,st0 ; st0=c*sin(k*r)/r  st1=a*bet*mbet  st2=a*alf*malf
ret


;------------------------------ tors ---------------------------------------
tors:
  push  edx
  xor   edx,edx
  mov   eax,[Fl]
  div   [const3]
  mov   al,dl
  pop   edx

  fild  word [esi]     ; st0=alf
  fmul  [const_mpi]    ; st0=a=pi*alf*malf
  fsincos              ; st0=cos(a)  st1=sin(a)
  fild  [tors_r]       ; st0=r st1=cos(a)  st2=sin(a)
  fmul  st2,st0        ; st0=r st1=cos(a)  st2=r*sin(a)
  fmulp st1,st0        ; st0=r*cos(a)  st1=r*sin(a)
  bt    ax,1
  jc    tors_l1        ; ax=xxxx xxxx xxxx xx1xb
  bt    ax,0
  jc    tors_l2        ; ax=xxxx xxxx xxxx xxx1b
    fiadd   [tors_R3]  ; st0=r*cos(a)+R  st1=r*sin(a)
    fild  word [esi+2] ; st0=bet  st1=r*cos(a)+R  st2=r*sin(a)
    fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=r*cos(a)+R  st2=r*sin(a)
    fsincos            ; st0=cos(b)  st1=sin(b)  st2=r*cos(a)+R  st3=r*sin(a)
    fxch  st2          ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)  st3=r*sin(a)
    fmul  st2,st0      ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)*(r*cos(a)+R)  st3=r*sin(a)
    fmulp st1,st0      ; st0=sin(b)*(r*cos(a)+R)  st1=cos(b)*(r*cos(a)+R)  st2=r*sin(a)
  ret

  tors_l1:
    fiadd [tors_R2]    ; st0=r*cos(a)+R  st1=r*sin(a)
    fild  word [esi+2] ; st0=bet  st1=r*cos(a)+R  st2=r*sin(a)
    fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=r*cos(a)+R  st2=r*sin(a)
    fsincos            ; st0=cos(b)  st1=sin(b)  st2=r*cos(a)+R  st3=r*sin(a)
    fxch  st2          ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)  st3=r*sin(a)
    fmul  st2,st0      ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)*(r*cos(a)+R)  st3=r*sin(a)
    fmulp st1,st0      ; st0=sin(b)*(r*cos(a)+R)  st1=cos(b)*(r*cos(a)+R)  st2=r*sin(a)
  jmp tors_l3

  tors_l2:
    fiadd [tors_R1]    ; st0=r*cos(a)+R  st1=r*sin(a)
    fild  word [esi+2] ; st0=bet  st1=r*cos(a)+R  st2=r*sin(a)
    fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=r*cos(a)+R  st2=r*sin(a)
    fsincos            ; st0=cos(b)  st1=sin(b)  st2=r*cos(a)+R  st3=r*sin(a)
    fxch  st2          ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)  st3=r*sin(a)
    fmul  st2,st0      ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)*(r*cos(a)+R)  st3=r*sin(a)
    fmulp st1,st0      ; st0=sin(b)*(r*cos(a)+R)  st1=cos(b)*(r*cos(a)+R)  st2=r*sin(a)


    ; around Y
    ;  x= x*cos(a)-z*sin(a)
    ;  y= y
    ;  z= x*sin(a)+z*cos(a)
    fld   st2       ; st0=z  st1=x  st2=y  st3=z
    fld   st1       ; st0=x  st1=z  st2=x  st3=y  st4=z
    fld   [al_r]
    fimul [tors_a1] ; st0=a  st1=x  st2=z  st3=x  st4=y  st5=z
    fsincos         ; st0=cos(a)  st1=sin(a)  st2=x  st3=z  st4=x  st5=y  st6=z
    fmul  st4,st0
    fmulp st6,st0   ; st0=sin(a)  st1=x  st2=z  st3=x*cos(a)  st4=y  st5=z*cos(a)
    fmul  st2,st0
    fmulp st1,st0   ; st0=x*sin(a)  st1=z*sin(a)  st2=x*cos(a) st3=y st4=z*cos(a)
    faddp st4,st0
    fsubp st1,st0

  tors_l3:
    ; around X
    ;  x=x
    ;  y= y*cos(b)+z*sin(b)
    ;  z=-y*sin(b)+z*cos(b)
    fld   st2       ; st0=z  st1=x  st2=y  st3=z
    fld   st2       ; st0=y  st1=z  st2=x  st3=y  st4=z
    fld   [al_r]
    fimul [tors_a2] ; st0=b  st1=y  st2=z  st3=x  st4=y  st5=z
    fsincos         ; st0=cos(b)  st1=sin(b)  st2=y  st3=z  st4=x  st5=y  st6=z
    fmul  st5,st0
    fmulp st6,st0   ; st0=sin(b)  st1=y  st2=z  st3=x  st4=y*cos(b)  st5=z*cos(b)
    fmul  st2,st0
    fmulp st1,st0   ; st0=y*sin(b) st1=z*sin(b) st2=x st3=y*cos(b) st4=z*cos(b)
    fsubp st4,st0   ; st0=z*sin(b)  st1=x  st2=y*cos(b)  st3=z*cos(b)-y*sin(b)
    faddp st2,st0
ret


;------------------------------ tor1 ---------------------------------------
tor1:
  fild  [tor1_a]     ; st0=a
  fild  word [esi+2] ; st0=bet  st1=a
  fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=a
  fsincos            ; st0=cos(b)  st1=sin(b)  st2=a
  fild  word [esi]   ; st0=alf  st1=cos(b)  st2=sin(b)  st3=a
  fmul  [const_m]    ; st0=alf*malf  st1=cos(b)  st2=sin(b)  st3=a
  fld   st0          ; st0=alf*malf  st1=alf*malf  st2=cos(b)  st3=sin(b)  st4=a
  fmul [tor1_whorls] ; st0=wa=whorls*alf*malf  st1=alf*malf  st2=cos(b)  st3=sin(b)  st4=a
  fsincos            ; st0=cos(wa)  st1=sin(wa)  st2=alf*malf  st3=cos(b)  st4=sin(b)  st5=a
  fld   [tor1_r]     ; st0=r  st1=cos(wa)  st2=sin(wa)  st3=alf*malf  st4=cos(b)  st5=sin(b)  st6=a
  fmul  st2,st0      ; st0=r  st1=cos(wa)  st2=r*sin(wa)  st3=alf*malf  st4=cos(b)  st5=sin(b)  st6=a
  fmulp st1,st0      ; st0=r*cos(wa)  st1=r*sin(wa)  st2=alf*malf  st3=cos(b)  st4=sin(b)  st5=a
  fiadd [tor1_R]     ; st0=R+r*cos(wa)  st1=r*sin(wa)  st2=alf*malf  st3=cos(b)  st4=sin(b)  st5=a
  faddp st3,st0      ; st0=r*sin(wa)  st1=alf*malf  st2=R+r*cos(wa)+cos(b)  st3=sin(b)  st4=a
  faddp st3,st0      ; st0=alf*malf  st1=R+r*cos(wa)+cos(b)  st2=r*sin(wa)+sin(b)  st3=a
  fmul  [tor1_turns] ; st0=ta=turns*alf*malf  st1=R+r*cos(wa)+cos(b)  st2=r*sin(wa)+sin(b)  st3=a
  fsincos            ; st0=cos(ta)  st1=sin(ta)  st2=R+r*cos(wa)+cos(b)  st3=r*sin(wa)+sin(b)  st4=a
  fmul  st0,st2      ; st0=cos(ta)*(R+r*cos(wa)+cos(b))  st1=sin(ta)  st2=R+r*cos(wa)+cos(b)  st3=r*sin(wa)+sin(b)  st4=a
  fmul  st0,st4      ; st0=a*cos(ta)*(R+r*cos(wa)+cos(b))  st1=sin(ta)  st2=R+r*cos(wa)+cos(b)  st3=r*sin(wa)+sin(b)  st4=a
  fstp  st5          ; st0=sin(ta)  st1=R+r*cos(wa)+cos(b)  st2=r*sin(wa)+sin(b)  st3=a  st4=y
  fmulp st1,st0      ; st0=sin(ta)*(R+r*cos(wa)+cos(b))  st1=r*sin(wa)+sin(b)  st2=a  st3=y
  fmul  st0,st2      ; st0=z=a*sin(ta)*(R+r*cos(wa)+cos(b))  st1=r*sin(wa)+sin(b)  st2=a  st3=y
  fstp  st4          ; st0=r*sin(wa)+sin(b)  st1=a  st2=y  st3=z
  fmulp st1,st0      ; st0=x=a*(r*sin(wa)+sin(b))  st1=y  st2=z
ret



;------------------------------- tor ---------------------------------------
tor:
  fild  word [esi]  ; st0=alf
  fmul  [const_mpi] ; st0=a=pi*alf*malf
  fsincos           ; st0=cos(a)  st1=sin(a)
  fild  [tor_r]     ; st0=r st1=cos(a)  st2=sin(a)
  fmul  st2,st0     ; st0=r st1=cos(a)  st2=r*sin(a)
  fmulp st1,st0     ; st0=r*cos(a)  st1=r*sin(a)
  fiadd [tor_R]     ; st0=r*cos(a)+R  st1=r*sin(a)
  fild  word [esi+2]; st0=bet  st1=r*cos(a)+R  st2=r*sin(a)
  fmul  [const_mpi] ; st0=b=pi*bet*mbet  st1=r*cos(a)+R  st2=r*sin(a)
  fsincos           ; st0=cos(b)  st1=sin(b)  st2=r*cos(a)+R  st3=r*sin(a)
  fxch  st2         ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)  st3=r*sin(a)
  fmul  st2,st0     ; st0=r*cos(a)+R  st1=sin(b)  st2=cos(b)*(r*cos(a)+R)  st3=r*sin(a)
  fmulp st1,st0     ; st0=sin(b)*(r*cos(a)+R)  st1=cos(b)*(r*cos(a)+R)  st2=r*sin(a)
ret


;------------------------------ spiral -------------------------------------
spiral:
  fild  word [esi+2] ; st0=bet
  fmul  [const_m]    ; st0=bet*mbet
  fild  word [esi]   ; st0=alf  st1=bet*mbet
  fmul  [const_mpi]  ; st0=a=pi*alf*malf  st1=bet*mbet
  fsincos            ; st0=cos(a)  st1=sin(a)  st2=bet*mbet
  fimul [spiral_r]   ; st0=r*cos(a)  st1=sin(a)  st2=bet*mbet
  fld   st2          ; st0=bet*mbet  st1=r*cos(a)  st2=sin(a)  st3=bet*mbet
  fimul [spiral_h]   ; st0=bet*mbet*h  st1=r*cos(a)  st2=sin(a)  st3=bet*mbet
  faddp st1,st0      ; st0=z=bet*mbet*h+r*cos(a)  st1=sin(a)  st2=bet*mbet
  fstp  st3          ; st0=sin(a)  st1=bet*mbet  st2=z
  fimul [spiral_r]   ; st0=r*sin(a)  st1=bet*mbet  st2=z
  fiadd [spiral_R]   ; st0=r*sin(a)+R  st1=bet*mbet  st2=z
  fxch  st1          ; st0=bet*mbet  st1=r*sin(a)+R  st2=z
  fimul [spiral_L]   ; st0=b=L*bet*mbet  st1=r*sin(a)+R  st2=z
  fsincos            ; st0=cos(b)  st1=sin(b)  st2=r*sin(a)+R  st3=z
  fxch  st2          ; st0=r*sin(a)+R  st1=sin(b)  st2=cos(b)  st3=z
  fmul  st2,st0      ; st0=r*sin(a)+R  st1=sin(b)  st2=(r*sin(a)+R)*cos(b)  st3=z
  fmulp st1,st0      ; st0=x=(r*sin(a)+R)*sin(b)  st2=y=(r*sin(a)+R)*cos(b)  st3=z
ret


;------------------------------- cube --------------------------------------
cube:
  push  edx
  xor   edx,edx
  mov   eax,[Fl]
  div   [const6]

  fild  [cube_R]     ; st0=R
  bt      dx,0
  jc      cube_l0
                     ; dx=xxxx xxxx  xxxx xxx0b
     fchs            ; st0=-R
   cube_l0:

  fild  word [esi+2] ; st0=bet         st1=R
  fmul  [const_m]    ; st0=bet*mbet    st1=R
  fmul  st0,st1      ; st0=R*bet*mbet  st1=R

  fild  word [esi]   ; st0=alf  st1=R*bet*mbet  st2=R
  fmul  [const_m]    ; st0=alf*malf  st1=R*bet*mbet  st2=R
  fmul  st0,st2      ; st0=R*alf*malf  st1=R*bet*mbet  st2=R

  bt    dx,2
  jc    cube_l1      ; dx=xxxx xxxx  xxxx x10xb
  bt    dx,1
  jc    cube_l2      ; dx=xxxx xxxx  xxxx x01xb
                     ; dx=xxxx xxxx  xxxx x00xb
    fstp  st3
  cube_l1:
    fstp  st3
  cube_l2:
  pop     edx
ret


;------------------------------ planet -------------------------------------
planet:
  bt   [Fl],0
  jc   planet_lb1

  bt   [Fl],1
  jc   planet_lb0
    fild  word [esi]   ; st0=alf
    fmul  [const_mpi]  ; st0=a=pi*alf*malf
    fsincos            ; st0=cos(a)  st1=sin(a)
    fild  [planet_R]   ; st0=R  st1=cos(a)  st2=sin(a)
    fmul  st2,st0      ; st0=R  st1=cos(a)  st2=R*sin(a)
    fmulp st1,st0      ; st0=R*cos(a)  st2=R*sin(a)
    fild  word [esi+2] ; st0=bet  st1=R*cos(a)  st2=R*sin(a)
    fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=R*cos(a)  st2=R*sin(a)
    fsincos            ; st0=cos(b)  st1=sin(b)  st2=R*cos(a)  st3=R*sin(a)
    fxch  st2          ; st0=R*cos(a)  st1=sin(b)  st2=cos(b)  st3=R*sin(a)
    fmul  st2,st0      ; st0=R*cos(a)  st1=sin(b)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
    fmulp st1,st0      ; st0=R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)
  ret
  planet_lb0:
    fild  word [esi]   ; st0=alf
    fmul  [const_mpi]  ; st0=a=pi*alf*malf
    fsincos            ; st0=cos(a)  st1=sin(a)
    fild  [planet_r]   ; st0=R  st1=cos(a)  st2=sin(a)
    fmul  st2,st0      ; st0=R  st1=cos(a)  st2=R*sin(a)
    fmulp st1,st0      ; st0=R*cos(a)  st2=R*sin(a)
    fild  word [esi+2] ; st0=bet  st1=R*cos(a)  st2=R*sin(a)
    fmul  [const_mpi]  ; st0=b=pi*bet*mbet  st1=R*cos(a)  st2=R*sin(a)
    fsincos            ; st0=cos(b)  st1=sin(b)  st2=R*cos(a)  st3=R*sin(a)
    fxch  st2          ; st0=R*cos(a)  st1=sin(b)  st2=cos(b)  st3=R*sin(a)
    fmul  st2,st0      ; st0=R*cos(a)  st1=sin(b)  st2=R*cos(a)*cos(b)  st3=R*sin(a)
    fmulp st1,st0      ; st0=R*cos(a)*sin(b)  st1=R*cos(a)*cos(b)  st2=R*sin(a)
    fiadd [planet_h]   ; st0=R*cos(a)*sin(b)+h  st1=R*cos(a)*cos(b)  st2=R*sin(a)
    fxch  st1          ; st0=R*cos(a)*cos(b)  st1=R*cos(a)*sin(b)+h  st2=R*sin(a)
  ret
  planet_lb1:
    fild   word [esi+2] ; st0=bet
    fmul   [const_m]    ; st0=bet*mbet
    fimul  [planet_d]   ; st0=d*bet*mbet
    fiadd  [planet_h]   ; st0=h+d*bet*mbet
    fild   word [esi]   ; st0=alf  st1=h+d*bet*mbet
    fmul   [const_mpi]  ; st0=a=pi*alf*malf  st1=h+d*bet*mbet
    fsincos             ; st0=cos(a)  st1=sin(a)  st2=h+d*bet*mbet
    fxch   st2          ; st0=h+d*bet*mbet  st1=sin(a)  st2=cos(a)
    fmul   st2,st0      ; st0=h+d*bet*mbet  st1=sin(a)  st2=cos(a)*(h+d*bet*mbet)
    fmulp  st1,st0      ; st0=(h+d*bet*mbet)*sin(a)  st1=cos(a)*(h+d*bet*mbet)
    fldz                ; st0=0  st1=(h+d*bet*mbet)*sin(a)  st2=cos(a)*(h+d*bet*mbet)
ret