		.386p
		ASSUME	CS:CODE

		PUBLIC	FxLength

CODE		SEGMENT
		EXTRN	FxAngle:NEAR,FxSinHq:NEAR

		ALIGN	4
FxLength	PROC
#Y		EQU	ESP+8
#X		EQU	ESP+4
#RETADR		EQU	ESP

		MOV	EAX,[#X]
		MOV	ECX,[#Y]
		AND	EAX,EAX
		JGE	#Xplus
		NEG	EAX
#Xplus:		AND	ECX,ECX
		JGE	#Yplus
		NEG	ECX
#Yplus:

		CMP	ECX,EAX		;sinの値が大きくなってほしい
		JGE	#SetXY		;から,X>Yの時は転置.転置して
		XCHG	EAX,ECX		;も長さは不変だから情報保存不要

#SetXY:		MOV	[#X],EAX
		MOV	[#Y],ECX

		PUSH	ECX
		PUSH	EAX
		CALL	FxAngle
		ADD	ESP,8

		PUSH	EAX
		CALL	FxSinHq
		ADD	ESP,4
		MOV	ECX,EAX		;ECX:sin<<16
		AND	ECX,ECX
		JE	#sin0

		MOV	EAX,[#Y]
		CDQ
		SHLD	EDX,EAX,16
		SHL	EAX,16
		DIV	ECX

		RET

#sin0:		MOV	EAX,[#X]
		RET
FxLength	ENDP
CODE		ENDS
		END
