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 !