; Macro to Square a 10 bit unsigned integer (by Antonie Daas) ; Input: Src<9:0> (10 bits), Output: Sqr<19:0> (20 bits) ; 56 instructions, 56 cycles Sqr10 macro Src, Sqr clrf Sqr ;clear low byte of result, required to leave C=0 after shifts clrf Sqr+1 clrf Sqr+2 ;Sqr+1:Sqr= Src<7:0>^2 clrc movf Src,W ;get multiplicant btfsc Src,0 ;if bit 0 of multiplier set, then: addwf Sqr+1,F ;add multiplicant rrf Sqr+1,F ;shift down... rrf Sqr,F ;into low byte, C=0 btfsc Src,1 ;etc. for other 7 bits addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 btfsc Src,2 addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 btfsc Src,3 addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 btfsc Src,4 addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 btfsc Src,5 addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 btfsc Src,6 addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 btfsc Src,7 addwf Sqr+1,F rrf Sqr+1,F rrf Sqr,F ;C=0 ; +Src*(Src+1)*2^9 (W still contains Src) Sqr+2= 00000000 Sqr+1= ponmlkji C= 0 rrf Sqr+1,F ;align Sqr+1 at bit 9, Sqr+1= 0ponmlkj C= i rrf Sqr+2,F ;and save bit i Sqr+2= i0000000 C= 0 btfsc Src+1,0 ;if Src+1<0> is set, then: addwf Sqr+1,F ;add Src*2, may give carry r Sqr+1= qponmlkj C= r rrf Sqr+1,F ;save carry bit r Sqr+1= rqponmlk C= j rrf Sqr+2,F ;save bit b in Sqr+2 Sqr+2= ji000000 C= 0 btfsc Src+1,1 ;if Src+1<1> is set, then: addwf Sqr+1,F ;add Src*4, may give carry s C= s rlf Sqr+2,F ;carry r into Sqr+2 Sqr+2= i000000s C= j rlf Sqr+1,F ;restore Sqr+1 low bit j Sqr+1= qponmlkj C= r rlf Sqr+2,F ; Sqr+2= 000000sr C= i rlf Sqr+1,F ;restore Sqr+1 low bit i, Sqr+1= ponmlkji C= q rlf Sqr+2,F ;shift Sqr+2 in place Sqr+2= 00000srq C= 0 ; +Src+1^2*2^16 movf Src+1,W btfsc Src+1,0 addwf Sqr+2,F ;no carry rlf Src+1,W ;no carry out btfsc Src+1,1 addwf Sqr+2,F endm