📄 math2.asm
字号:
;**********************************************************************************************
; 32/16 Bit Unsigned Fixed Point Divide 32/16 -> 32.16
; Input: 32 bit unsigned fixed point dividend in AARGB0, AARGB1,AARGB2,AARGB3
; 16 bit unsigned fixed point divisor in BARGB0, BARGB1
; Use: CALL FXD3216U
; Output: 32 bit unsigned fixed point quotient in AARGB0, AARGB1,AARGB2,AARGB3
; 16 bit unsigned fixed point remainder in REMB0, REMB1
; Result: AARG, REM <-- AARG / BARG
; Max Timing: 2+699+2 = 703 clks
; Max Timing: 2+663+2 = 667 clks
; PM: 2+240+1 = 243 DM: 9
;AARG = BARG × QUOTIENT + REMAINDER,
UDIV3216L macro
; Max Timing: 16+6*22+21+21+6*22+21+21+6*22+21+21+6*22+21+8 = 699 clks
; Min Timing: 16+6*21+20+20+6*21+20+20+6*21+20+20+6*21+20+3 = 663 clks
; PM: 240 DM: 9
CLRF TEMP
RLF AARGB0,W
RLF REMB1,F
MOVF BARGB1,W
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
RLF AARGB0,F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216A: RLF AARGB0,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB0,LSB
GOTO UADD26LA
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26LA
UADD26LA: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26LA: RLF AARGB0,F
DECFSZ LOOPCOUNT,F
GOTO LOOPU3216A
RLF AARGB1,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB0,LSB
GOTO UADD26L8
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26L8
UADD26L8: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26L8: RLF AARGB1,F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216B: RLF AARGB1,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB1,LSB
GOTO UADD26LB
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26LB
UADD26LB: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26LB: RLF AARGB1,F
DECFSZ LOOPCOUNT,F
GOTO LOOPU3216B
RLF AARGB2,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB1,LSB
GOTO UADD26L16
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26L16
UADD26L16: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26L16: RLF AARGB2,F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216C: RLF AARGB2,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB2,LSB
GOTO UADD26LC
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26LC
UADD26LC: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26LC: RLF AARGB2,F
DECFSZ LOOPCOUNT,F
GOTO LOOPU3216C
RLF AARGB3,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB2,LSB
GOTO UADD26L24
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26L24
UADD26L24: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26L24: RLF AARGB3,F
MOVLW 7
MOVWF LOOPCOUNT
LOOPU3216D: RLF AARGB3,W
RLF REMB1,F
RLF REMB0,F
RLF TEMP,F
MOVF BARGB1,W
BTFSS AARGB3,LSB
GOTO UADD26LD
SUBWF REMB1,F
MOVF BARGB0,W
BTFSS STATUS,C
INCFSZ BARGB0,W
SUBWF REMB0,F
CLRW
BTFSS STATUS,C
MOVLW 1
SUBWF TEMP,F
GOTO UOK26LD
UADD26LD: ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
CLRW
BTFSC STATUS,C
MOVLW 1
ADDWF TEMP,F
UOK26LD: RLF AARGB3,F
DECFSZ LOOPCOUNT,F
GOTO LOOPU3216D
BTFSC AARGB3,LSB
GOTO UOK26L
MOVF BARGB1,W
ADDWF REMB1,F
MOVF BARGB0,W
BTFSC STATUS,C
INCFSZ BARGB0,W
ADDWF REMB0,F
UOK26L:
endm
FXD3216U: CLRF REMB0
CLRF REMB1
UDIV3216L
RETLW TRUE
;**********************************************************************************************
; 32x16 Bit Signed Fixed Point Multiply 32x16 -> 32
; Input: 32 bit signed fixed point multiplicand in AARGB0,1,2,3
; 16 bit signed fixed point multiplier in BARGB0
; Use: CALL FXM3216S
; Output: 32 bit signed fixed point product in AARGB0,1,2,3,4,5
; Result: AARG <-- AARG x BARG
; 3个字节X12bit<=4个字节
; Max Timing: 13+393+2 = 408 clks B > 0
; 28+393+2 = 423 clks B < 0
; Min Timing: 13+98 = 111 clks
; PM: 18+79+1 = 98 DM: 9
;TABLE 2: DATA RAM REQUIREMENTS
;AARGB5
;AARGB4
;AARGB3
;AARGB2
;AARGB1
;AARGB0 AARG MSB
SIGN set I ;sign
;BARGB1
;BARGB0 BARG MSB
AARGB5 set (BFIIC+8) ;= REMB1
AARGB4 set (BFIIC+9) ;= REMB0 remainder MSB
TEMPB3 set (BFIIC+D'10')
TEMPB2 set (BFIIC+D'11')
TEMPB1 set (BFIIC+D'12')
TEMPB0 set (BFIIC+D'13') ;temporary storage
;These definitions are identical with those used by the
;IEEE 754 compliant floating point library[5], AN575.
;**********************************************************************************************
; 32x16 Bit Multiplication Macros
; Max Timing: 2+13+6*26+25+2+6*27+26+7 = 393 clks
; Min Timing: 2+7*6+5+2+6*6+5+6 = 98 clks
; PM: 19+60 = 79 DM: 11
SMUL3216L macro
MOVLW 0x8
MOVWF LOOPCOUNT
LOOPSM3216A:
RRF BARGB1,F
BTFSC _C
GOTO ALSM3216NA
DECFSZ LOOPCOUNT,F
GOTO LOOPSM3216A
MOVLW 0x7
MOVWF LOOPCOUNT
LOOPSM3216B:
RRF BARGB0,F
BTFSC _C
GOTO BLSM3216NA
DECFSZ LOOPCOUNT,F
GOTO LOOPSM3216B
CLRF AARGB0
CLRF AARGB1
CLRF AARGB2
CLRF AARGB3
RETLW 0x00
ALOOPSM3216:
RRF BARGB1,F
BTFSS _C
GOTO ALSM3216NA
MOVF TEMPB3,W
ADDWF AARGB3,F
MOVF TEMPB2,W
BTFSC _C
INCFSZ TEMPB2,W
ADDWF AARGB2,F
MOVF TEMPB1,W
BTFSC _C
INCFSZ TEMPB1,W
ADDWF AARGB1,F
MOVF TEMPB0,W
BTFSC _C
INCFSZ TEMPB0,W
ADDWF AARGB0,F
ALSM3216NA:
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
RRF AARGB4,F
DECFSZ LOOPCOUNT,F
GOTO ALOOPSM3216
MOVLW 0x7
MOVWF LOOPCOUNT
BLOOPSM3216:
RRF BARGB0,F
BTFSS _C
GOTO BLSM3216NA
MOVF TEMPB3,W
ADDWF AARGB3,F
MOVF TEMPB2,W
BTFSC _C
INCFSZ TEMPB2,W
ADDWF AARGB2,F
MOVF TEMPB1,W
BTFSC _C
INCFSZ TEMPB1,W
ADDWF AARGB1,F
MOVF TEMPB0,W
BTFSC _C
INCFSZ TEMPB0,W
ADDWF AARGB0,F
BLSM3216NA:
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
RRF AARGB4,F
RRF AARGB5,F
DECFSZ LOOPCOUNT,F
GOTO BLOOPSM3216
RLF TEMPB0,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
RRF AARGB4,F
RRF AARGB5,F
endm
;**********************************************************************************************
FXM3216S:
CLRF AARGB4 ; clear partial product
CLRF AARGB5
CLRF SIGN
MOVF AARGB0,W
IORWF AARGB1,W
IORWF AARGB2,W
IORWF AARGB3,W
BTFSC _Z
RETLW 0x00
MOVF AARGB0,W
XORWF BARGB0,W
MOVWF TEMPB0
BTFSC TEMPB0,MSB
COMF SIGN,F
BTFSS BARGB0,MSB
GOTO M3216SOK
COMF BARGB1,F
COMF BARGB0,F
INCF BARGB1,F
BTFSC _Z
INCF BARGB0,F
COMF AARGB3,F
COMF AARGB2,F
COMF AARGB1,F
COMF AARGB0,F
INCF AARGB3,F
BTFSC _Z
INCF AARGB2,F
BTFSC _Z
INCF AARGB1,F
BTFSC _Z
INCF AARGB0,F
BTFSC BARGB0,MSB
GOTO M3216SX
M3216SOK:
MOVF AARGB0,W
MOVWF TEMPB0
MOVF AARGB1,W
MOVWF TEMPB1
MOVF AARGB2,W
MOVWF TEMPB2
MOVF AARGB3,W
MOVWF TEMPB3
SMUL3216L ;macro
RETLW 0x00
M3216SX:
CLRF AARGB4
CLRF AARGB5
RLF SIGN,W
RRF AARGB0,F
RRF AARGB1,F
RRF AARGB2,F
RRF AARGB3,F
RRF AARGB4,F
RETLW 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -