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

📄 fs_fxp_div.asm

📁 富晶的MCU仿真器软件
💻 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 + -