12 Bit Square Root
;**********************************************************************
;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