; вычисление квадратного
корня 16 бит
; CHSQRT16(T2h:T2l) = Ah:Al
CHSQRT16 ;
clrf T4l ;
clrf T4h ;
movlw .1 ;
movwf Al ;
movlw .0 ;
movwf Ah ;
movlw .8 ;
movwf Bl ;
go21
bcf STATUS,C ;
rlcf T2l ;
rlcf T2h ;
rlcf T4l ;
rlcf T4h ;
bcf STATUS,C ;
rlcf T2l ;
rlcf T2h ;
rlcf T4l ;
rlcf T4h ;
btfss STATUS,N ;
bra pol16
movf Al,w ;
addwf T4l,f ;
movf Ah,w ;
addwfc T4h,f ;
bra dol16
pol16
movf Al,w ;
subwf T4l,f ;
movf Ah,w ;
subwfb T4h,f ;
dol16
bcf STATUS,C ;
rlcf Al ;
rlcf Ah ;
movlw b'11111000' ;
andwf Al ;
movlw b'00000101' ;
iorwf Al ;
btfss T4h, 7 ;
bra per16 ;
movlw .2 ;
subwf Al ;
per16
decfsz Bl,f
bra go21 ;
bcf STATUS,C ;
rrcf Ah ;
rrcf Al ;
bcf STATUS,C ;
rrcf Ah ;
rrcf Al ;
return ; |
; вычисление квадратного
корня 32 бита
; CHSQRT32(T4h:T4l:T2h:T2l) = Ah:Al
CHSQRT32
clrf T6l ;
clrf T6h ;
clrf T8l ;
clrf T8h ;
movlw .1 ;
movwf Al ;
movlw .0 ;
movwf Ah ;
clrf Bl ;
clrf Bh ;
movlw .16 ;
movwf Cl ;
go34
bcf STATUS,C ;
rlcf T2l ;
rlcf T2h ;
rlcf T4l ;
rlcf T4h ;
rlcf T6l ;
rlcf T6h ;
rlcf T8l ;
rlcf T8h ;
bcf STATUS,C ;
rlcf T2l ;
rlcf T2h ;
rlcf T4l ;
rlcf T4h ;
rlcf T6l ;
rlcf T6h ;
rlcf T8l ;
rlcf T8h ;
btfss STATUS,N ;
bra pol
movf Al,w ;
addwf T6l,f ;
movf Ah,w ;
addwfc T6h,f ;
movf Bl,w ;
addwfc T8l,f ;
movf Bh,w ;
addwfc T8h,f ;
bra dol
pol
movf Al,w ;
subwf T6l,f ;
movf Ah,w ;
subwfb T6h,f ;
movf Bl,w ;
subwfb T8l,f ;
movf Bh,w ;
subwfb T8h,f ;
dol bcf STATUS,C ;
rlcf Al ;
rlcf Ah ;
rlcf Bl ;
movlw b'11111000'
;
andwf Al ;
movlw b'00000101'
;
iorwf Al ;
btfss T8h, 7 ;
bra per ;
movlw .2 ;
subwf Al ;
per decfsz Cl,f ;
bra go34 ;
bcf STATUS,C ;
rrcf
Bl ;
rrcf Ah ;
rrcf Al ;
bcf STATUS,C ;
rrcf
Bl ;
rrcf Ah ;
rrcf Al ;
return ;
|
; Sqrt16(ARGA1:ARGA0) = RES0
Sqrt16 clrf TEMP0 ; clear the temp solution
movlw 0x80 ;
setup the first bit
movwf BITLOC0
movwf RES0
Square8 movf RES0, W ;
movf PRODL, W ;
ARGA - PROD test
subwf ARGA0, W
movf PRODH, W
subwfb ARGA1, W
btfsc STATUS, C
bra NextBit ;
movff TEMP0, RES0
;
rrncf BITLOC0, F
;
movf BITLOC0, W ;
back into RES0
iorwf RES0, F
btfsc BITLOC0, 7
;
bra Done ; out
bra Square8 ;
elso go back for another test
NextBit movff RES0, TEMP0 ;
rrncf BITLOC0, F
;
movf BITLOC0, W
iorwf RES0, F
btfsc BITLOC0, 7
;
bra Done ; out
bra Square8
Done movff TEMP0,RES0 ;
return
; Квадратный Корень 32 бита
; Sqrt32(ARGA3:ARGA2:ARGA1:ARGA0) = RES1:RES0
Sqrt32 clrf TEMP0 ; clear the temp solution
clrf TEMP1
clrf BITLOC0 ;
setup the first bit
clrf RES0
movlw 0x80
movwf BITLOC1 ;
BitLoc = 0x8000
movwf RES1 ; RES
= 0x8000
Squar16 movff RES0, ARG1L ;
call Sq16
movf SQRES0, W ;
ARGA - PROD test
subwf ARGA0, W
movf SQRES1, W
subwfb ARGA1, W
movf SQRES2, W
subwfb ARGA2, W
movf SQRES3, W
subwfb ARGA3, W
btfsc STATUS, C
bra NxtBt16 ;
addlw 0x00 ;
clear carry
movff TEMP0, RES0
;
movff TEMP1, RES1
rrcf BITLOC1, F ;
then rotote the bit and put it
rrcf BITLOC0, F
movf BITLOC1, W ;
back into RES1:RES0
iorwf RES1, F
movf BITLOC0, W
iorwf RES0, F
btfsc STATUS, C ;
bra Done32 ; out
bra Squar16 ;
elso go back for another test
NxtBt16 addlw
0x00 ; clear carry
movff RES0, TEMP0
;
movff RES1, TEMP1
rrcf BITLOC1, F ;
rrcf BITLOC0, F
movf BITLOC1, W ;
iorwf RES1, F
movf BITLOC0, W
iorwf RES0, F
btfsc STATUS, C ;
bra Done32 ; out
bra Squar16
Done32 movff TEMP0,RES0 ;
movff TEMP1,RES1
return
;16 X 16 Unsigned Square
; SQRES3:SQRES0 = ARG1H:ARG1L ^2
Sq16 movf ARG1L,
W
mulwf ARG1L ;
movff PRODH,
SQRES1 ;
movff PRODL,
SQRES0 ;
movf ARG1H, W
mulwf ARG1H ;
movff PRODH,
SQRES3 ;
movff PRODL,
SQRES2 ;
movf ARG1L, W
mulwf ARG1H ;
movf PRODL, W ;
addwf SQRES1, F ;
Add cross
movf PRODH, W ;
products
addwfc SQRES2, F
;
clrf WREG ;
addwfc SQRES3, F
;
movf ARG1H, W ;
mulwf ARG1L ;
movf PRODL, W ;
addwf SQRES1, F ;
Add cross
movf PRODH, W ;
products
addwfc SQRES2, F
;
clrf WREG, W ;
addwfc SQRES3, F
;
return |