 
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
| file: /Techref/microchip/math/muldivconst.htm, 4KB, , updated: 2012/1/6 18:48, local time: 2025/10/31 05:43, 
 
216.73.216.87,10-2-37-96:LOG IN | 
| ©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://www.piclist.com/tecHREF/microchip/math/muldivconst.htm"> PIC Microcontoller Basic Math: Multiplication and Division by a Constant</A> | 
| Did you find what you needed? | 
|  PICList 2025 contributors: o List host: MIT, Site host massmind.org, Top posters @none found - Page Editors: James Newton, David Cary, and YOU! * Roman Black of Black Robotics donates from sales of Linistep stepper controller kits. * Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters. * Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated! * Contributors: Richard Seriani, Sr. | 
| Welcome to www.piclist.com! | 
.