📄 fs_fxp_div.asm
字号:
;=====================================================
; 32/16 Bit Unsigned Fixed Point Divide.
;-----------------------------------------------------
;Equation: <<32/16= 32>>
; EAX|AX/CX = EAX|AX...DX
;Input:
; Paramaters :
; 1.Divided Number : EAX|AX(EAH,EAL,AH,AL)
; 2.Divisor Number : CX(CH,CL)
; Format : 2's(Hex)
; Divided Range(砆埃计) : 0x0 ~ 0xFFFF,FFFF(0 ~ 4,294,967,295)
; Divisor Range(埃计) : 0x0 ~ 0xFFFF(0 ~ 65,535)
;Output:
; Paramaters:
; 1.Quotient(坝) : EAX|AX(EAH,EAL,AH,AL)
; 2.Remainder(緇计) : DX(DH,DL)
; Format : 2's(Hex)
; Quotient Range : 0x0 ~ 0xFFFF,FFFF(0 ~ 4,294,967,295)
; Remainder Range : 0x0 ~ 0xFFFE(0 ~ 65,534)
;Error Message:
;
;Performance:
; Cycle almost = 813+3*Answer bits(32)
; MAX cycle = 909
; Min cycle = 813
; PM= (31+5)*2(bytes) DM= 11(bytes)(Without W register)
; 1.EAX,2.AX,3.CX,4.DX,5.DIVTX,6.buffer(1)
;NOTE1: Numeric of divisor mustn't be zero.
;-----------------------------------------------
;Edit:Gavannis Time:2005/2/18 Version:0.1
;===================================================================================
;=====================================================
; 16/16 Bit Unsigned Fixed Point Divide.
;-----------------------------------------------------
;Equation: <<16/16= 16>>
; EAX/CX = AX...DX
;Input:
; Paramaters :
; 1.Divided Number : EAX(EAH,EAL)
; 2.Divisor Number : CX(CH,CL)
; Format : 2's(Hex)
; Divided Range(砆埃计) : 0x0 ~ 0xFFFF(0 ~ 65,535)
; Divisor Range(埃计) : 0x0 ~ 0xFFFF(0 ~ 65,535)
;Output:
; Paramaters:
; 1.Quotient(坝) : AX(AH,AL)
; 2.Remainder(緇计) : DX(DH,DL)
; Format : 2's(Hex)
; Quotient Range : 0x0 ~ 0xFFFF(0 ~ 65,535)
; Remainder Range : 0x0 ~ 0xFFFE(0 ~ 65,534)
;Error Message:
;
;Performance:
; Cycle almost = 413+2*Answer bits(16)
; MAX cycle = 437
; Min cycle = 413
; PM= (30+5)*2(bytes) DM= 11(bytes)(Without W register)
; 1.EAX,2.AX,3.CX,4.DX,5.DIVTX,6.buffer(1)
;NOTE1: Numeric of divisor mustn't be zero.
;-----------------------------------------------
;Edit:Gavannis Time:2005/2/18 Version:0.1
;===================================================================================
32Div16U:
MOVLW 32
GOTO divcom16U
16Div16U:
MOVLW 16
divcom16U:
MOVWF buffer
CLRF DIVTH
CLRF DIVTL
div_lp16U:
CLRF STATUS
RLF4b AL
rlf2b DIVTL
MOVFF2B DIVTL,DL
CALL DX_CX
BTFSS STATUS,C
GOTO divless16U ;DX<CX
MOVFF2B DL,DIVTL ;DX>=CX
INCF AL,1
divless16U:
DECFSZ buffer,1
GOTO div_lp16U
CLRF STATUS
MOVFF2B DIVTL,DL ;Remainder
return
;=====================================================
; 32/16 Bit Signed Fixed Point Divide.
;-----------------------------------------------------
;Equation: <<32/16= 32>>
; EAX|AX/CX = EAX|AX...DX
;Input:
; Paramaters :
; 1.Divided Number : EAX|AX(EAH,EAL,AH,AL)
; 2.Divisor Number : CX(CH,CL)
; Format : 2's(Hex) or 2's complement(Hex)
; Divided Range(砆埃计) : 0x8000,0000 ~ 0xFFFF,FFFF , 0 ~ 0X7FFF,FFFF(-2,147,483,648 ~ 2,147,483,647)
; Divisor Range(埃计) : 0x8000 ~ 0xFFFF, 0 ~ 0X7FFF(-32,768 ~ 32,767)
;Output:
; Paramaters:
; 1.Quotient(坝) : EAX|AX(EAH,EAL,AH,AL)
; 2.Remainder(緇计) : DX(DH,DL)
; Format : 2's(Hex) or 2's complement(Hex
; Quotient Range : 0x8000,0000 ~ 0xFFFF,FFFF , 0 ~ 0X7FFF,FFFF(-2,147,483,648 ~ 2,147,483,647)
; Remainder Range : 0x8000~0xFFFF,0x0 ~ 0X7FFF(-32,768 ~ 32,767)
;Error Message:
;
;Performance:
; Cycle approx. = 826 + 1*Answer bits(32)
; MAX cycle = 870
; Min cycle = 826
; PM= (50+14+8+5+15+7)*2=198(bytes) DM= 13(bytes)(Without W register)
; 1.EAX,2.AX,3.CX,4.DX,5.DIVTX,6.buffer(1),7.SignT1&T
;NOTE1: Please input 2's complement if input or Output is negative.
;NOTE2: Numeric of divisor mustn't be zero.
;-----------------------------------------------
;Edit:Gavannis Time:2005/2/18 Version:0.1
;===================================================================================
32Div16S:
MOVLW 32
divcom16S:
MOVWF buffer
CLRF DIVTH
CLRF DIVTL
CLRF SignT1
CLRF SignT2
DivSign16S:
RLF EAH,W
MOVLW 00H
ADDWFC SignT1,F
BTFSC SignT1,0
CALL IComfEAX4b
RLF CH,W
MOVLW 00H
ADDWFC SignT2,F
BTFSC SignT2,0
CALL IComfCX2b
MOVFW SignT2
XORWF SignT1,F
div_lp16S:
CLRF STATUS
RLF4b AL
rlf2b DIVTL
MOVFF2B DIVTL,DL
CALL DX_CX
BTFSS STATUS,C
GOTO divless16S ;DX<CX
MOVFF2B DL,DIVTL ;DX>=CX
INCF AL,1
divless16S:
DECFSZ buffer,1
GOTO div_lp16S
CLRF STATUS
MOVFF2B DIVTL,DL ;Remainder
BTFSS SignT1,0
GOTO Postive16S
GOTO Negative16S
Postive16S:
RETURN
Negative16S:
CALL ComfEAX4b
CALL ComfDX2b
RETURN
;=======================================================
; 40/32 Bit Unsigned Fixed Point Divide.
;-------------------------------------------------------
;Equation: <<40/32= 40>>
; EAX|EBH/ECX = EAX|EBX...EDX|DX
;Performance:
; Cycle almost = 1578 + 7*Answer bits(40)
; MAX cycle = 1858
; Min cycle = 1578
; PM= (31+9)*2(bytes) DM= 21(bytes)(Without W register)
; 1.EAX,2.AX,3.EBX,4.BX,5.ECX,6.CX,7.EDX,8.DX,9.DIVETX,10.DIVEX,6.buffer(1)
;NOTE1: Numeric of divisor mustn't be zero.
;-----------------------------------------------
;Edit:Gavannis Time:2005/2/18 Version:0.1
;=====================================================================================
;===========================================
; 64/32 Bit Unsigned Fixed Point Divide.
;-------------------------------------------------------
;Equation: <<64/32= 64>>
; EAX|EBX/ECX = EAX|EBX...EDX|DX
;Performance:
; Cycle almost = 2512 + 7*Answer bits(64)
; MAX cycle = 2960
; Min cycle = 2512
; PM= (30+9)*2(bytes) DM= 21(bytes)(Without W register)
; 1.EAX,2.AX,3.EBX,4.BX,5.ECX,6.CX,7.EDX,8.DX,9.DIVETX,10.DIVEX,6.buffer(1)
;NOTE1: Numeric of divisor mustn't be zero.
;-----------------------------------------------
;Edit:Gavannis Time:2005/2/18 Version:0.1
;=====================================================================================
40Div32U:
MOVLW 40
GOTO divcom32U
64Div32U:
MOVLW 64
divcom32U:
MOVWF buffer
CLRF DIVETH
CLRF DIVETL
CLRF DIVTH
CLRF DIVTL
div_lp32U:
CLRF STATUS
RLF4b BL
RLF4b AL
RLF4b DIVTL
MOVFF4B DIVTL,DL
CALL EDX_ECX
BTFSS STATUS,C
GOTO divless32U
MOVFF4B DL,DIVTL
INCF BL,1
divless32U:
DECFSZ buffer,1
GOTO div_lp32U
MOVFF4B DIVTL,DL ;Remainder
return
;===========================================
; 64/32 Bit Signed Fixed Point Divide.
;-------------------------------------------------------
;Equation: <<64/32= 64>>
; EAX|EBX/ECX = EAX|EBX...EDX|DX
;Performance:
; Cycle approx. = 2528 + 1*Answer bits(64)
; MAX cycle = 2598
; Min cycle = 2528
; PM= (70+25+15+9+27+15)*2 = 322(bytes) DM= 23(bytes)(Without W register)
; 1.EAX,2.AX,3.EBX,4.BX,5.ECX,6.CX,7.EDX,8.DX,9.DIVETX,10.DIVEX,6.buffer(1),7.SignT1&T2
;NOTE1: Numeric of divisor mustn't be zero.
;-----------------------------------------------
;Edit:Gavannis Time:2005/2/18 Version:0.1s
;=====================================================================================
64Div32S:
MOVLW 64
divcom32S:
MOVWF buffer
CLRF DIVETH
CLRF DIVETL
CLRF DIVTH
CLRF DIVTL
CLRF SignT1
CLRF SignT2
DivSign32S:
RLF EAH,W
MOVLW 00H
ADDWFC SignT1,F
BTFSC SignT1,0
CALL IComfEAX8b
RLF ECH,W
MOVLW 00H
ADDWFC SignT2,F
BTFSC SignT2,0
CALL ComfECX4b
MOVFW SignT2
XORWF SignT1,F
div_lp32S:
CLRF STATUS
RLF4b BL
RLF4b AL
RLF4b DIVTL
MOVFF4B DIVTL,DL
CALL EDX_ECX
BTFSS STATUS,C
GOTO divless32S
MOVFF4B DL,DIVTL
INCF BL,1
divless32S:
DECFSZ buffer,1
GOTO div_lp32S
CLRF STATUS
MOVFF4B DIVTL,DL ;Remainder
BTFSS SignT1,0
GOTO Postive32S
GOTO Negative32S
Postive32S:
RETURN
Negative32S:
CALL ComfEAX8b
CALL ComfEDX4b
RETURN
;==============================================
; Subtraction FOR 16'unsigned number
; &(CX>DX)
; DX = DX-CX
; EDX|DX = EDX|DX -ECX|CX
;==============================================
;PM=5
DX_CX:
movfw CL
subwf DL,F
movfw CH
subwfc DH,F
Return
;PM=9
EDX_ECX:
movfw CL
subwf DL,F
movfw CH
subwfc DH,F
movfw ECL
subwfc EDL,F
movfw ECH
subwfc EDH,F
Return
;============================================================
; 2's complement
;============================================================
;PM=27
ComfEAX8b:
comf BL,1
comf BH,1
comf EBL,1
comf EBH,1
comf AL,1
comf AH,1
comf EAL,1
comf EAH,1
incf BL,1 ;9
btfss Status,Z;10
return ;10+2
incf BH,1 ;
btfss Status,Z;
return ;
incf EBL,1 ;
btfss Status,Z;
return ;
incf EBH,1 ;
return
incf AL,1 ;
return
incf AH,1 ;
return
incf EAL,1 ;
return
incf EAH,1 ;
return
;PM=15
ComfEAX4b:
comf AL,1
comf AH,1
comf EAL,1
comf EAH,1
incf AL,1 ;5
btfss Status,Z;6
return ;6+2
incf AH,1 ;8
btfss Status,Z;9
return ;9+2
incf EAL,1 ;11
btfss Status,Z;12
return ;12+2
incf EAH,1 ;14
return
;PM:15
ComfECX4b:
comf CL,1
comf CH,1
comf ECL,1
comf ECH,1
incf CL,1 ;5
btfss Status,Z;6
return ;6+2
incf CH,1 ;8
btfss Status,Z;9
return ;9+2
incf ECL,1 ;11
btfss Status,Z;12
return ;12+2
incf ECH,1 ;14
return ;14+2
ComfEDX4b:
comf DL,1
comf DH,1
comf EDL,1
comf EDH,1
incf DL,1 ;5
btfss Status,Z;6
return ;6+2
incf DH,1 ;8
btfss Status,Z;9
return ;9+2
incf EDL,1 ;11
btfss Status,Z;12
return ;12+2
incf EDH,1 ;14
return ;14+2
;PM=7
ComfCX2b:
comf CL,F
comf CH,F
incf CL,F
btfss Status,Z
return
incf CH,F
RETURN
ComfDX2b:
comf DL,F
comf DH,F
incf DL,F
btfss Status,Z
return
incf DH,F
RETURN
;PM:25
IComfEAX8b:
CLRF STATUS
MOVLW 01H
SUBWF BL,F
BTFSS STATUS,C
DECF BH,F
BTFSS STATUS,C
DECF EBL,F
BTFSS STATUS,C
DECF EBH,F
BTFSS STATUS,C
DECF AL,F
BTFSS STATUS,C
DECF AH,F
BTFSS STATUS,C
DECF EAL,F
BTFSS STATUS,C
DECF EAH,F
COMF EAH,F
COMF EAL,F
COMF AH,F
COMF AL,F
COMF EBH,F
COMF EBL,F
COMF BH,F
COMF BL,F
RETURN
;PM=14
IComfEAX4b:
CLRF STATUS
MOVLW 01H
SUBWF AL,F
BTFSS STATUS,C
DECF AH,F
BTFSS STATUS,C
DECF EAL,F
BTFSS STATUS,C
DECF EAH,F
COMF EAH,F
COMF EAL,F
COMF AH,F
COMF AL,F
RETURN
;PM=8
IComfAX2b:
CLRF STATUS
MOVLW 01H
SUBWF AL,F
BTFSS STATUS,C
DECF AH,F
COMF AH,F
COMF AL,F
RETURN
IComfCX2b:
CLRF STATUS
MOVLW 01H
SUBWF CL,F
BTFSS STATUS,C
DECF CH,F
COMF CH,F
COMF CL,F
RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -