#include <exec/types.h>
#include <proto/utility.h>
#include <math.h>
#include <i64.h>
#include <flashmandel.h>

// fixed point math 6.58
#define INTEGER_BITS 6L
#define FLOAT_BITS   58L
#define H_FLOAT_BITS (FLOAT_BITS / 2)

#define KMULT (1L << H_FLOAT_BITS)

#ifdef FIXEDPOINT_MATH

WORD Julian68K_Fixed (ULONG Iterazioni,ULONG Power,LDouble Cre,LDouble Cim,LDouble JKre,LDouble JKim)
{                                                        
register WORD Exp;
FIXED_64 zr,zi,zr2,zi2,jkre,jkim,tmp;
FIXED_64 maxdist;

tmp = i64_uset (4L);
maxdist = i64_lshift (tmp,FLOAT_BITS);

tmp = i64_uset (KMULT);
zr = i64_set ((LONG) (Cre * KMULT));
zi = i64_set ((LONG) (Cim * KMULT));
jkre = i64_set ((LONG) (JKre * KMULT));
jkim = i64_set ((LONG) (JKim * KMULT));

zr = i64_mul (zr,tmp);
zi = i64_mul (zi,tmp);
jkre = i64_mul (jkre,tmp);
jkim = i64_mul (jkim,tmp);

  do {
       for (Exp = Power; Exp != -1; Exp--)
       {
           zi = i64_urshift (zi,H_FLOAT_BITS);

           zr = i64_urshift (zr,H_FLOAT_BITS);

           zi2 = i64_mul (zi,zi);

           zi = i64_mul (zr,zi);

           zr2 = i64_mul (zr,zr);

           zr = i64_sub (zr2,zi2);

           zi = i64_add (zi,zi);
       }

       if (i64_cmp (i64_add (zr2,zi2),maxdist) == I64_GREATER ) return Iterazioni;

       zi = i64_add (zi,jkim);

       zr = i64_add (zr,jkre);

     } while (--Iterazioni != -1);

  return 0;
}
#endif
