;********************************************************************** ;by Nikolai Golovchenko ;12 bit SQARE ROOT ;Input: ;ACCB0 - high byte ;ACCB1 - low byte ;Result: ;ACCB0 - 6bit ;Used: ;TEMPB0 - temporary for result ;TEMPB1 - temporary for input ;LOOPCNT - counter ;Memory used ;32 instructions ;5 RAM bytes ;11+17*5 + 16 + 6 = 118 cycles all cases ;********************************************************************** Sqrt12 clrf TEMPB0 ;clear all used clrf TEMPB1 ;temporary registers movlw 6 ;and setup counter movwf LOOPCNT ; swapf ACCB0, f ;Left justify swapf ACCB1, w ;12bit value andlw 0x0f ;in two byte iorwf ACCB0, f ;accumulator swapf ACCB1, w ; andlw 0xf0 ; movwf ACCB1 ; Sqrt12a rlf ACCB1, f ;shift next rlf ACCB0, f ;two higher bits rlf TEMPB1, f ;of input rlf ACCB1, f ;to rlf ACCB0, f ;TEMPB1 rlf TEMPB1, f ; movf TEMPB0, w ;take current result (shifted 2 bits left) addlw 0x01 ;and OR with 01 (test bit) - addlw clears C rlf TEMPB0, f ;and reserve place for the next bit subwf TEMPB1, w ;test substraction for borrow btfsc _C bsf TEMPB0, 2 ;set next result bit if no borrow btfsc _C movwf TEMPB1 ;store substraction result if no borrow decfsz LOOPCNT ;repeat untill all 6 bits will be found goto Sqrt12a bcf _C rrf TEMPB0, f ;right rrf TEMPB0, w ;justify the result movwf ACCB0 ;and copy to result register return ;********************************************************************** ;Last updated 16Nov99
See: