PIC Microcontoller Math Method

24x24 multiplication from Fred Maher w/ Tutorial

...on my holiday I had time to create my own 24 x 24 multiplication routine.

Now it may be of interest for the beginners list and then again it may not be.

The beast is chunky compared to the small and sleek offerings on other sites, well to be truthful, only found one other routine and that was in the PICLIST. It started life aimed squarely at the beginner with as few as possible loops so as to make it more clear what was happening in the registers and how the bits are carried or shifted. So let's say euphemistically it is " linear code".

The routine is also easily expandable by adding more variables and by copying then adding the higher numbers for top, bot and res. in their respective code blocks in the add and shift blocks. steps 2 and 3 and 4 It also comes with built in example numbers which you can play with, and change /check for other results...products.

Also aimed at the beginner, and analogue fossils like myself, who need a visual image of processes, the words multiplier, multiplicand, product are not very visual. After a while I realized that the universal words are.

TOP
BOTTOM
RESULT

So I have used in the routine :- top is multiplicand, bottom is multiplier and product is result. This also is directly applicable to division and addition and subtraction. In fact in my own project program I've got rid of a whole lot of variables in these maths routines and I just need one more word REMAINDER for the division.

I' m incorporating it into my own advanced bike computer project as I needed something to manage 3 x 3 register multiplication. The routine is "intelligent" as it can swap round and use the smaller of the two numbers as the multiplier. I built this into the routine as the time savings are important. big x small = 350us whereas small x big = 120usec.

I explain this in detail in the comments of the fully annotated version mult24a.asm The minimum comment version is mult24.asm

The routines have been compiled and checked with number ranging from 3 x 3 = 9 to FFFFFF * FFFFFF = FFFFFE000001 = 281,474,943,156,225.

I can't guarantee that there is no number combination between these two extremes that will give a wrong answer, but by now I think it is highly improbable.

The.... number * 0 case ....can't happen in my application but if it is needed, it is easily accommodate in the compare routine which precedes the actual multiplication. The last compare of the low order registers can obviously produce 0. Then it is a simple matter to make res6,5,4,3,2,1 also zero. and skip the multiplication main body.

So summing up.

mult24.asm ;few comments mult24a.asm ;heavily commented