LIST P = 16C54, n = 66 ; ;******************************************************************* ; 8x8 Software Multiplier ; ( Fast Version : Straight Line Code ) ;******************************************************************* ; ; The 16 bit result is stored in 2 bytes ; ; Before calling the subroutine " mpy ", the multiplier should ; be loaded in location " mulplr ", and the multiplicand in ; " mulcnd " . The 16 bit result is stored in locations ; H_byte & L_byte. ; ; Performance : ; Program Memory : 35 locations ; # of cycles : 37 ; Scratch RAM : 0 locations ; ; ; Program: MULT8x8F.ASM ; Revision Date: ; 1-13-97 Compatibility with MPASMWIN 1.40 ; ; This routine is optimized for speed efficiency ( straight line code ) ; For code efficiency, refer to "mult8x8S.asm" ( looped code ) ;******************************************************************* ; mulcnd equ 09 ; 8 bit multiplicand mulplr equ 10 ; 8 bit multiplier H_byte equ 12 ; High byte of the 16 bit result L_byte equ 13 ; Low byte of the 16 bit result ; ; include "p16c5x.inc" Same equ 1 ; ;**** Define a macro for adding & right shifting ** ; mult MACRO bit ; Begin macro btfsc mulplr,bit addwf H_byte,Same rrf H_byte,Same rrf L_byte,Same ENDM ; End of macro ; ; ***************************** Begin Multiplier Routine mpy_F clrf H_byte clrf L_byte movf mulcnd,W ; move the multiplicand to W reg. bcf STATUS,C ; Clear the carry bit in the status Reg. mult 0 mult 1 mult 2 mult 3 mult 4 mult 5 mult 6 mult 7 ; retlw 0 ; ;******************************************************************** ; Test Program ;********************************************************************* main movlw 0FF movwf mulplr ; multiplier (in mulplr) = 0FF movlw 0FF movwf mulcnd ; multiplicand(in mulcnd ) = 0FF ; call mpy_F ; The result 0FF*0FF = FE01 is in locations ; ; H_byte & L_byte ; self goto self ; org 01FF goto main ; END
See:
Questions:
/techref/microchip/math/mul/8x8u.htm This is a wonderful little routine. So wonderful I can't figure out how it works. Is there something I am missing, or something about the PIC that I am not familiar with? Here is my question:
How is the overflow from the rrf of H_byte put into the top of L_byte? It seems like it just magically appears. Yes, it works, I've seen it. But how?
Thanks, Allasso
Comments:
Answer to my own question:
I did not understand how rotate instructions work. I see now that whatever is sitting in the carry will be brought into whatever file is being rotated, regardless of where the carry came from. So, if there is a carry generated from a rotate just prior to the next, the next rotate will bring that carry in.
Now I understand what "rotate through carry" means.
Allasso
Stefan Eder Says: