📄 fxm66.a16
字号:
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 + -