⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxm66.a16

📁 这为PIC电表模块源码
💻 A16
📖 第 1 页 / 共 2 页
字号:
;	RCS Header $Id: fxm66.a16 2.3 1996/10/16 14:23:23 F.J.Testa Exp $

;	$Revision: 2.3 $

;       16x16 PIC16 FIXED POINT MULTIPLY ROUTINES
;
;       Input:  fixed point arguments in AARG and BARG
;
;       Output: product AARGxBARG in AARG
;
;       All timings are worst case cycle counts
;
;       It is useful to note that the additional unsigned routines requiring a non-power of two
;       argument can be called in a signed multiply application where it is known that the
;       respective argument is nonnegative, thereby offering some improvement in
;       performance.
;
;         Routine            Clocks     Function
;
;       FXM1616S     269        16x16 -> 32 bit signed fixed point multiply
;
;       FXM1616U     256        16x16 -> 32 bit unsigned fixed point multiply
;
;       FXM1515U     244        15x15 -> 30 bit unsigned fixed point multiply
;
;       The above timings are based on the looped macros. If space permits,
;       approximately 64-73 clocks can be saved by using the unrolled macros.
;

;**********************************************************************************************
;**********************************************************************************************

;       16x16 Bit Multiplication Macros

SMUL1616L        macro

;       Max Timing:     2+11+6*16+15+2+6*17+16+5 = 249 clks

;       Min Timing:     2+7*6+5+2+6*6+5+4 = 96 clks

;       PM: 55            DM: 9


                MOVLW   0x8
                MOVWF   LOOPCOUNT

LOOPSM1616A
                RRF     BARGB1, F
                BTFSC   _C
                GOTO    ALSM1616NA
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPSM1616A

                MOVLW   0x7
                MOVWF   LOOPCOUNT

LOOPSM1616B
                RRF     BARGB0, F
                BTFSC   _C
                GOTO    BLSM1616NA
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPSM1616B

                CLRF    AARGB0
                CLRF    AARGB1
                RETLW   0x00

ALOOPSM1616
                RRF     BARGB1, F
                BTFSS   _C
                GOTO    ALSM1616NA
                MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F

ALSM1616NA      RLF    SIGN,W
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                DECFSZ  LOOPCOUNT, F
                GOTO    ALOOPSM1616

                MOVLW   0x7
                MOVWF   LOOPCOUNT

BLOOPSM1616
                RRF     BARGB0, F
                BTFSS   _C
                GOTO    BLSM1616NA
                MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F

BLSM1616NA      RLF    SIGN,W
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                RRF             AARGB3, F
                DECFSZ  LOOPCOUNT, F
                GOTO    BLOOPSM1616

                RLF    SIGN,W
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                RRF    AARGB3, F

                endm

UMUL1616L        macro

;       Max Timing:     2+13+6*15+14+2+7*16+15 = 248 clks

;       Min Timing:     2+7*6+5+1+7*6+5+4 = 101 clks

;       PM: 51            DM: 9

                MOVLW   0x08
                MOVWF   LOOPCOUNT

LOOPUM1616A
                RRF     BARGB1, F
                BTFSC   _C
                GOTO    ALUM1616NAP
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPUM1616A

                MOVWF   LOOPCOUNT

LOOPUM1616B
                RRF     BARGB0, F
                BTFSC   _C
                GOTO    BLUM1616NAP
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPUM1616B

                CLRF    AARGB0
                CLRF    AARGB1
                RETLW   0x00

BLUM1616NAP
                BCF     _C
                GOTO    BLUM1616NA

ALUM1616NAP
                BCF     _C
                GOTO    ALUM1616NA

ALOOPUM1616
                RRF     BARGB1, F
                BTFSS   _C
                GOTO    ALUM1616NA
                MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F

ALUM1616NA
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                DECFSZ  LOOPCOUNT, F
                GOTO    ALOOPUM1616

                MOVLW   0x08
                MOVWF   LOOPCOUNT

BLOOPUM1616
                RRF             BARGB0, F
                BTFSS   _C
                GOTO    BLUM1616NA
                MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F

BLUM1616NA
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                RRF             AARGB3, F
                DECFSZ  LOOPCOUNT, F
                GOTO    BLOOPUM1616

                endm



UMUL1515L        macro

;       Max Timing:     2+13+6*15+14+2+6*16+15+4 = 236 clks

;       Min Timing:     2+7*6+5+2+6*6+5+4 = 97 clks

;       PM: 56            DM: 9

                MOVLW   0x8
                MOVWF   LOOPCOUNT

LOOPUM1515A
                RRF     BARGB1, F
                BTFSC   _C
                GOTO    ALUM1515NAP
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPUM1515A

                MOVLW   0x7
                MOVWF   LOOPCOUNT

LOOPUM1515B
                RRF     BARGB0, F
                BTFSC   _C
                GOTO    BLUM1515NAP
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPUM1515B

                CLRF    AARGB0
                CLRF    AARGB1
                RETLW   0x00

BLUM1515NAP
                BCF     _C
                GOTO    BLUM1515NA

ALUM1515NAP
                BCF     _C
                GOTO    ALUM1515NA

ALOOPUM1515
                RRF     BARGB1, F
                BTFSS   _C
                GOTO    ALUM1515NA
                MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F

ALUM1515NA
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                DECFSZ  LOOPCOUNT, F
                GOTO    ALOOPUM1515

                MOVLW   0x07
                MOVWF   LOOPCOUNT

BLOOPUM1515
                RRF             BARGB0, F
                BTFSS   _C
                GOTO    BLUM1515NA
                MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F

BLUM1515NA
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF    AARGB2, F
                RRF     AARGB3, F
                DECFSZ  LOOPCOUNT, F
                GOTO    BLOOPUM1515

                
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF             AARGB2, F
                RRF             AARGB3, F

                endm
                


SMUL1616        macro

;       Max Timing:     5+6+7*11+7*12+4 = 176 clks

;       Min Timing:     5+24+21+5 = 55 clks

;       PM: 5+3*8+3*7+6+7*11+7*12+4 = 221            DM: 8

                variable i = 0

                BTFSC   SIGN,MSB
                COMF    AARGB2, F
                MOVF    AARGB2,W
                MOVWF   AARGB3
                RLF             SIGN,W
                
                while i < 8
                
                BTFSC   BARGB1,i
                GOTO    SM1616NA#v(i)
                BCF             AARGB2,7-i

                variable i =i + 1

                endw

                variable i =8
                
                while i < 15
                
                BTFSC   BARGB0,i-8
                GOTO    SM1616NA#v(i)
                BCF             AARGB3,15-i

                variable i =i + 1

                endw

                CLRF    AARGB0          ; if we get here, BARG = 0
                CLRF    AARGB1
                RETURN

SM1616NA0
                RRF    AARGB0, F
                RRF    AARGB1, F
                RRF	AARGB2, F

                variable i =1

                while   i < 8

                BTFSS   BARGB1,i
                GOTO    SM1616NA#v(i)
SM1616A#v(i)    MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F
SM1616NA#v(i)
                RRF    AARGB0, F
                RRF    AARGB1, F

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -