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

📄 fxm66.a16

📁 这为PIC电表模块源码
💻 A16
📖 第 1 页 / 共 2 页
字号:
                RRF             AARGB2, F

                variable i =i + 1

                endw

                variable i =8

                while   i < 15

                BTFSS   BARGB0,i-8
                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
                RRF             AARGB2, F
                RRF             AARGB3, F

                variable i =i + 1

                endw

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

                endm


UMUL1616        macro

;       Max Timing:     1+6+7*11+8*12 = 180 clks

;       Min Timing:     1+2*8+2*8+4 = 37 clks

;       PM: 1+2*8+2*8+4+7*11+8*12 = 210            DM: 8


                variable i =0

                BCF     _C              ; clear carry for first right shift
                
                while i < 8
                
                BTFSC   BARGB1,i
                GOTO    UM1616NA#v(i)

                variable i =i + 1

                endw

                variable i =8
                
                while i < 16
                
                BTFSC   BARGB0,i-8
                GOTO    UM1616NA#v(i)

                variable i =i + 1

                endw

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

UM1616NA0       RRF    AARGB0, F
                RRF    AARGB1, F
                RRF             AARGB2, F

                variable i =1

                while   i < 8

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

                variable i =i + 1

                endw

                variable i =8

                while   i < 16

                BTFSS   BARGB0,i-8
                GOTO    UM1616NA#v(i)
UM1616A#v(i)    MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F
UM1616NA#v(i)   RRF    AARGB0, F
                RRF    AARGB1, F
                RRF             AARGB2, F
                RRF             AARGB3, F

                variable i =i + 1

                endw

                endm


UMUL1515        macro

;       Max Timing:     7+7*11+7*12+4 = 172 clks

;       Min Timing:     1+16+14+4 = 35 clks

;       PM: 1+2*8+2*7+6+7*11+7*12+4 = 202            DM: 8


                variable i =0

                BCF     _C              ; clear carry for first right shift

                while i < 8
                
                BTFSC   BARGB1,i
                GOTO    UM1515NA#v(i)

                variable i =i + 1

                endw

                variable i =8

                while i < 15
                
                BTFSC   BARGB0,i-8
                GOTO    UM1515NA#v(i)

                variable i =i + 1

                endw

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

UM1515NA0       RRF    AARGB0, F
                RRF    AARGB1, F
                RRF             AARGB2, F

                variable i =1

                while   i < 8

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

                variable i =i + 1

                endw

                variable i =8

                while   i < 15

                BTFSS   BARGB0,i-8
                GOTO    UM1515NA#v(i)
UM1515A#v(i)    MOVF   TEMPB1,W
                ADDWF   AARGB1, F
                MOVF            TEMPB0,W
                BTFSC           _C
                INCFSZ          TEMPB0,W
                ADDWF           AARGB0, F
UM1515NA#v(i)   RRF    AARGB0, F
                RRF    AARGB1, F
                RRF             AARGB2, F
                RRF             AARGB3, F

                variable i =i + 1

                endw

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

                endm
                
;**********************************************************************************************
;**********************************************************************************************
        
;       16x16 Bit Signed Fixed Point Multiply 16x16 -> 32

;       Input:  16 bit signed fixed point multiplicand in AARGB0
;                       16 bit signed fixed point multiplier in BARGB0

;       Use:    CALL    FXM1616S

;       Output: 32 bit signed fixed point product in AARGB0

;       Result: AARG  <--  AARG x BARG

;       Max Timing:     9+249+2 = 260 clks                B > 0
;                       18+249+2 = 269 clks               B < 0

;       Min Timing:     9+96 = 105 clks

;       PM: 18+55+1 = 74              DM: 9

FXM1616S	CLRF	AARGB2          ; clear partial product
		CLRF	AARGB3
		CLRF	SIGN
		MOVF	AARGB0,W
		IORWF	AARGB1,W
		BTFSC	_Z
		RETLW	0x00
		
		MOVF	AARGB0,W
		XORWF	BARGB0,W
		MOVWF	TEMPB0
		BTFSC	TEMPB0,MSB
		COMF	SIGN,F

		BTFSS   BARGB0,MSB
                GOTO    M1616SOK

                COMF            BARGB1, F
                COMF            BARGB0, F
                INCF            BARGB1, F
		BTFSC		_Z
		INCF		BARGB0, F

                COMF            AARGB1, F
                COMF            AARGB0, F
                INCF            AARGB1, F
		BTFSC		_Z
		INCF		AARGB0, F

		BTFSC	BARGB0,MSB
		GOTO	M1616SX

M1616SOK	MOVF   AARGB0,W
                MOVWF   TEMPB0
                MOVF   AARGB1,W
                MOVWF   TEMPB1

                SMUL1616L

                RETLW           0x00


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

		RETLW	0x00

;**********************************************************************************************
;**********************************************************************************************
        
;       16x16 Bit Unsigned Fixed Point Multiply 16x16 -> 32

;       Input:  16 bit unsigned fixed point multiplicand in AARGB0
;                       16 bit unsigned fixed point multiplier in BARGB0

;       Use:    CALL    FXM1616U

;       Output: 32 bit unsigned fixed point product in AARGB0

;       Result: AARG  <--  AARG x BARG

;       Max Timing:     6+248+2 = 256 clks

;       Min Timing:     6+101 = 107 clks

;       PM: 6+51+1 = 58              DM: 9

FXM1616U
                CLRF    AARGB2          ; clear partial product
                CLRF    AARGB3
                MOVF   AARGB0,W
                MOVWF   TEMPB0
                MOVF   AARGB1,W
                MOVWF   TEMPB1

                UMUL1616L

                RETLW           0x00

;**********************************************************************************************
;**********************************************************************************************
        
;       15x15 Bit Unsigned Fixed Point Divide 15x15 -> 30

;       Input:  15 bit unsigned fixed point multiplicand in AARGB0
;                       15 bit unsigned fixed point multiplier in BARGB0

;       Use:    CALL    FXM1515U

;       Output: 30 bit unsigned fixed point product in AARGB0

;       Result: AARG  <--  AARG x BARG

;       Max Timing:     6+236+2 = 244 clks

;       Min Timing:     6+97 = 103 clks

;       PM: 6+56+1 = 63              DM: 9

FXM1515U
                CLRF    AARGB2          ; clear partial product
                CLRF    AARGB3
                MOVF   AARGB0,W
                MOVWF   TEMPB0
                MOVF   AARGB1,W
                MOVWF   TEMPB1

                UMUL1515L

                RETLW           0x00

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

⌨️ 快捷键说明

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