The PICList code generator: Multiplication and Division by any Constant through a simple html form
Binary Multiplication by a Constant
8 bits by any constant by Myke Predko
See Division Methods for divide by 10, etc...
Since rotating any binary value one place left or right will multiply or
divide by 2:
;Multiply 8 bit ACC by 2 (double)
rlf ACC, f
;Multiply 16 bit ACC by 2 (double)
clrc
rlf ACC0, f
rlf ACC1, f
;Divide 8 bit ACC by 2 (half)
rrf ACC, f
;Divide 16 bit ACC by 2 (half)
clrc
rrf ACC0, f
rrf ACC1, f
; 28/32-bit unsigned Multiply by 16
; by Martin Sturm 2010
;
; Left shift by 4 with zero fill on right
; NOTE: discards uppermost bits shifted out
; 2 instructions shorter than unrolled RLF
; 1 instruction longer than code generator but can tolerate
; non-zero bits in the upper nibble of high byte
; Can be easily modified for 24, 16 bit versions
;
; 17 instructions, 17 cycles
MULT_U12_BY16 MACRO x4,x3,x2,x1
; x4 x3 x2 x1 W
; a b c d e f g h
MOVLW 0x0F ; 0x0F
ANDWF x4,F ; 0 b
SWAPF x4,F ; b 0
SWAPF x3,F ; d c
ANDWF x3,W ; 0 c
IORWF x4,F ; b c
XORWF x3,F ; d 0
;stop here for 16bit
MOVLW 0x0F ; 0x0F
SWAPF x2,F ; f e
ANDWF x2,W ; 0 e
IORWF x3,F ; d e
XORWF x2,F ; f 0
;stop here for 24bit
MOVLW 0x0F ; 0x0F
SWAPF x1,F ; h g
ANDWF x1,W ; 0 g
IORWF x2,F ; f g
XORWF x2,F ; h 0
;repeat the 5 inst. pattern above for larger datatypes
ENDM ; b c d e f g h 0
; 32-bit unsigned Divide by 16
; by Martin Sturm 2010
;
; Right shift 4byte value by 4 with zero fill on left.
; 2 instructions shorter than unrolled RLF implementation
; 1 instruction faster than code generator !
; Can be easily modified for 24, 16 bit versions
;
; 17 instructions, 17 cycles
DIV_U32_BY16 MACRO x4,x3,x2,x1
; x4 x3 x2 x1 W
; a b c d e f g h
MOVLW 0xF0 ; 0xF0
ANDWF x1,F ; g 0
SWAPF x1,F ; 0 g
SWAPF x2,F ; f e
ANDWF x2,W ; f 0
IORWF x1,F ; f g
XORWF x2,F ; 0 e
;stop here for 16bit
MOVLW 0xF0 ; 0xF0
SWAPF x3,F ; d c
ANDWF x3,W ; d 0
IORWF x2,F ; d e
XORWF x3,F ; 0 c
;stop here for 24bit
MOVLW 0xF0 ; 0xF0
SWAPF x4,F ; b a
ANDWF x4,W ; b 0
IORWF x3,F ; b c
XORWF x4,F ; 0 a
;repeat the 5 inst. pattern above for larger datatypes
ENDM ; 0 a b c d e f g
;****************************************************************************** ;Multiply 32 bit number by 10 ; for PIC18F by VegiePete gmail ;Inline code, in place result ;FSR0 points to 32 bit number (low byte in low memory) ;Returns overflow byte in WREG, Z set if no overflow Times10: movf POSTINC0,w ;grab 1st digit, point to 2nd mullw 10 movf POSTDEC0,w ;rescue 2nd digit, point to first movff PRODL,POSTINC0 ;save result low, point to 2nd movff PRODH,INDF0 ;save result high mullw 10 movf PRODL,w ;grab result low byte addwf POSTINC0,f ;add to highest previous byte, point tp 3rd movlw 0 addwfc PRODH,f ;propagate the carry movf INDF0,w ;rescue 3rd digit movff PRODH,INDF0 ;save result high mullw 10 movf PRODL,w ;grab result low byte addwfc POSTINC0,f ;add to highest previous byte, plus any carry movlw 0 addwfc PRODH,f ;propagate the carry movf INDF0,w ;rescue 4th digit movff PRODH,INDF0 ;save result high mullw 10 ;don't care about overflow byte movf PRODL,w ;grab result low byte addwfc INDF0,w ;add to highest previous byte, plus any carry movlw 0 addwfc PRODH,w ;propagate the carry, load overflow return