;--------------------------------------------------------------------+ ; Function: Math : Multiply 16bits by 8bits | ;--------------------------------------------------------------------| ; Filename: M_MUL16x8.inc | Environment : MPLAB | ; Version : 1 | Microcontroller: PIC16F8x* | ; Date : 21/07/2003 | OSC MHz/MIPS : xx / xxx | ;--------------------------------------------------------------------| ; Author : Dingbat | ; Company : - | ; Files required : none | ;--------------------------------------------------------------------| ; Unsigned 16*8 bit Multiply AA(16) * BB(8), Result (CC) is 24bit ; adapted from code found on www.piclist.com ; ; params ; AA 0:1 (MSB:LSB) = number to multiply (16bit) ; BB = multiplier (8bit) ; CC 0:3 (MSB:LSB) = Product (24bit) ; ; Taking out the loops and inlining the code would save about ; another 20-30 instructions MUL16x8 clrf CC+0 ;clear result clrf CC+1 ; clrf CC+2 ; movlw .8 movwf bitCount ;bit counter set @ number of bits in multiplier mul_L1 ;main loop here rlf CC+2,f ;rotate result left (*2) rlf CC+1,f ; rlf CC+0,f ; bcf CC+2,0 ;clear LSB of result after rotation btfss BB,7 ;test msb of multipier goto dontAdd ;if bit is clear then dont add movfw AA+1 ;Add the 16 bits of AA to product addwf CC+2,f ; skpnc ; incf CC+1,f ; movfw AA ; addwf CC+1,f ; skpnc ; incf CC+0,f ; dontAdd rlf BB,f ;rotate multiplier left decfsz bitCount,f ;chk if finished all bits in multiplier goto mul_L1 return
Comments:
I think it must be
skpnz
incf CC+0,f
after the
skpnc
incf CC+1,f
because the instruction incf does not affect the C flag (only the Z flag), so when you make the incf CC+1,f the carry flag doesn't become 0 when CC+1 isn't 00000000. But un CC+1 become 00000000 then the Z flag will become 1 so now I can detect the carry from CC+1 and increment CC+0.