;Copyryght(c) 2005, Isaac Marino Bavaresco ;PIC24/dsPIC assembly: ;Input value = W10 ;Result = W11 isqrt: mov.w #0x0080,W2 mov.w #0,W11 do #7,greater ior.w W2,W11,W13 mul.uu W13,W13,W4 cp.w W10,W4 bra LTU,Greater ior.w W2,W11,W11 greater: lsr.w W2,#1,W2 /* C equivalent: */ unsigned short isqrt( unsigned short value ) { unsigned short result, exp, temp; for( result = 0, exp = 0x0080; exp != 0; exp >>= 1 ) { temp = result | exp; if( temp * temp <= value ) result = temp; } return result; } unsigned long isqrtl( unsigned long value ) { unsigned long result, exp, temp; for( result = 0, exp = 0x00008000; exp != 0; exp >>= 1 ) { temp = result | exp; if( temp * temp <= value ) result = temp; } return result; }