PIC: Multiplication
Low-end microcontrollers from Microchip do not have a multiplication instruction so any multiplication needs to be done using software or external hardware. This is a collection of 8 by 8 bit multiplication methods that are very efficient.
General (13-123 cycles, 18 instructions) A simple starting point for experimentation and is easily extendible to any word lenght. It is quite fast if a large portion of the numbers are very small.
Small (67 cycles constant, 11 instructions) This one is for saving precious code memory and still have good speed. The principle of this method comes from the Microchip application note 526 but has been optimised for minimum size and maximum speed by Bjørn Bæverfjord.
Medium (36 cycles constant, 36 instructions) Directly from Microchip application note 526.
Fast (22-36 cycles, 51 instructions) The fastest software solution I could find. Lifted from the PIClist.
Hardware (2-12 cycles) How to read a 128kB look up table in EPROM using only 10 I/O pins and still have good performance. A larger PIC with more I/O pins will give higher performance since the data bus can be split and made unidirectional.
- General - 13-123 cycles, 18 instructions
- Remove "clrf tmpH" for 16 by 8 multiplication
mul8x8g clrf prodL
clrf prodH clrf tmpH clrc
mulgl rrf mulplr
skpc goto noadd movfw mulcnd addwf prodL skpnc incf prodH movfw tmpH addwf prodH
noadd rlf mulcnd
rlf tmpH tstf mulplr skpz goto mul
- Small - 67 cycles constant, 11 instructions
- Same principle as application note 526
- Optimized for minimal size by Bjørn Bæverfjord
mul8x8s clrf prodH
movlw .128 movwf prodL movfw mulcnd
mulsl rrf mulplr
skpnc addwf prodH rrf prodH rrf prodL skpc goto mulsl return
- Medium - 36 cycles constant, 36 instructions
- From Microchip application note 526
- PIC16C5X / PIC16CXXX Math Utility Routines
mul8x8m clrf prodH
clrf prodL movfw mulcnd clrc btfsc mulplr,0 addwf prodH rrf prodH rrf prodL btfsc mulplr,1 addwf prodH rrf prodH rrf prodL btfsc mulplr,2 addwf prodH rrf prodH rrf prodL btfsc mulplr,3 addwf prodH rrf prodH rrf prodL btfsc mulplr,4 addwf prodH rrf prodH rrf prodL btfsc mulplr,5 addwf prodH rrf prodH rrf prodL btfsc mulplr,6 addwf prodH rrf prodH rrf prodL btfsc mulplr,7 addwf prodH rrf prodH rrf prodL return
- Fast - 22-36 cycles, 51 instructions
- By Scott Dattalo from the PICList
mul8x8f movfw prodH
clrc clrf prodL btfsc mulplr,0 goto mulf0 btfsc mulplr,1 goto mulf1 btfsc mulplr,2 goto mulf2 btfsc mulplr,3 goto mulf3 btfsc mulplr,4 goto mulf4 btfsc mulplr,5 goto mulf5 btfsc mulplr,6 goto mulf6 btfsc mulplr,7 goto mulf7 clrf prodH ;Bugfix by Dmitry Kiryashov return
mulf0 rrf prodH
rrf prodL btfsc mulplr,1 addwf prodH,w
mulf1 rrf prodH
rrf prodL btfsc mulplr,2 addwf prodH,w
mulf2 rrf prodH,f
rrf prodL btfsc mulplr,3 addwf prodH,w
mulf3 rrf prodH,f
rrf prodL btfsc mulplr,4 addwf prodH,w
mulf4 rrf prodH,f
rrf prodL btfsc mulplr,5 addwf prodH,w
mulf5 rrf prodH,f
rrf prodL btfsc mulplr,6 addwf prodH,w
mulf6 rrf prodH,f
rrf prodL btfsc mulplr,7 addwf prodH,w
mulf7 rrf prodH,f
rrf prodL return
Hardware for efficient table look up on a 16F84A microcontroller. The value of R1 must be selected to give a pulse from the EOR gate that is shorter than the instruction cycle of the PIC and longer than the minimum requirements for the specific latch used.