j'ai trouvé cette routine en C sur internet qui sert a calculer rapidement des racines carrées et je l'ai convertie en 68000.
;-----------------------------------------------------------------------------
; fast_sqrt : compute a fast integer inverse square root
; arg : d0
; ret : d0
;-----------------------------------------------------------------------------
; original C code by Jim Ulery :
; static unsigned mborg_isqrt3(unsigned long val)
; {
; unsigned long temp, g=0, b = 0x8000, bshft = 15;
; do {
; if (val >= (temp = (((g<<1)+b)<<bshft--))) {
; g += b;
; val -= temp;
; }
; } while (b >>= 1);
; return g;
; }
;-----------------------------------------------------------------------------
fast_sqrt:
movem.l d1-d4, -(sp)
moveq #0, d1 ; g = 0
move.l #$8000, d2 ; b = $8000
moveq #15, d3 ; bshft = 15
fast_sqrt_0:
move.l d1, d4 ; temp = g
add.l d1, d4 ; temp = g<<1
add.l d2, d4 ; temp = (g<<1)+b
lsl.l d3, d4 ; temp = ((g<<1)+b)<<bshft
subq.l #1, d3 ; bshft--
cmp.l d0, d4 ; val >= temp ?
bhi.s fast_sqrt_1 ; no -> fast_sqrt_1
add.l d2, d1 ; g += b
sub.l d4, d0 ; val -= temp
fast_sqrt_1:
lsr.l #1, d2 ; b >>= 1, b!=0 ?
bne.s fast_sqrt_0 ; yes -> fast_sqrt_0
move.l d1, d0 ; return g
movem.l (sp)+, d1-d4
rts
j'ai pas cherché a l'optimiser plus que ca, si qqun veut le faire, je suis preneur !
edit : j'ai changé le tag 'code' en 'pre', avec un tab-size de 4 ca rendrait mieux !


)
