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: +
file: /Techref/microchip/math/mul/8x8u.htm, 5KB, , updated: 2019/12/17 13:08, local time: 2024/12/21 07:05,
owner: SE-se_es-R,
3.142.194.204:LOG IN
|
©2024 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://techref.massmind.org/Techref/microchip/math/mul/8x8u.htm"> PIC Microcontoller Math Method Multiply 8 x 8 bits</A> |
Did you find what you needed? |
Welcome to massmind.org! |
Welcome to techref.massmind.org! |
.