       PAGE    ,132
	TITLE	Sine computation
IF1
INCLUDE 87MAC.LIB
ENDIF
STACK	SEGMENT STACK
	DW	64 DUP(?)
STACK	ENDS
CODE	SEGMENT PUBLIC
	ASSUME	CS:CODE,DS:CODE,ES:CODE
	EXTRN	FLOAT_ASCII:NEAR
NUM_ANGLE	DW	1
DEN_ANGLE	DW	2
STATUS	DW	?
FOUR	DW	4
ten6	dd	1000000
C3	EQU	40H
C2	EQU	04H
C1	EQU	02H
C0	EQU	01H
ERROR_MSG	DB	'Angle is too large',10,13,'$'
SIN	PROC	FAR
	PUSH	DS
	SUB	AX,AX
	PUSH	AX
	MOV	AX,CS
	MOV	DS,AX
	MOV	ES,AX
DO_AGAIN:
	FINIT			;------ST0------;-----ST1-------
	FILD	NUM_ANGLE	;		;
	FIDIV	DEN_ANGLE	;  X= ANGLE	;
	FLDPI			;     PI	;	X
	FIDIV	FOUR		;   PI/4	;	X
	FXCH			;     X 	;     PI/4
	FPREM			;     R 	;     PI/4
	FSTSW	STATUS
	FWAIT
	MOV	AH,BYTE PTR STATUS+1
	TEST	AH,C2
	JNZ	BIG_ANGLE
	TEST	AH,C1		; Determine if pi/4 subtract needed
	JZ	DO_R		; If zero, then no subtract
	FSUBRP	ST1,ST0 	; A=PI/4-R	;	?
	JMP	SHORT DO_FPTAN
DO_R:
	FXCH			;     PI/4	;	R
	FCOMP			;	R	;	?
DO_FPTAN:
	FPTAN			;      OPP	;      ADJ where OPP/ADJ=TAN(A)

;------ Determine if sin or cos required

	TEST	AH,C3 OR C1	; Look at both
	JPE	DO_SINE
	FXCH			;      ADJ	;      OPP
DO_SINE:			;	D	;	N

;------ Calculate N/SQR(N**2 + D**2)

	FMUL	ST0		;     D**2	;	N
	FXCH	ST1		;      N	;     D**2
	FLD	ST0		;      N	;	N	;      D**2
	FMUL	ST0		;     N**2	;	N	;      D**2
	FADD	ST2		; N**2+D**2	;	N	;      D**2
	FSQRT			;SQR(N2+D2)	;	N	;      D**2
	FDIVRP	ST1		;  SIN(X)	;     D**2
	FXCH	ST1		;    D**2	;     SIN(X)	;
	FCOMP			;   SIN(X)
	TEST	AH,C0
	JZ	SIGN_OK
	FCHS
SIGN_OK:
	CALL	FLOAT_ASCII
	INC	NUM_ANGLE
	CMP	NUM_ANGLE,13
	JA	RETURN_INST
	JMP	DO_AGAIN
RETURN_INST:
	RET
BIG_ANGLE:
	MOV	DX,OFFSET ERROR_MSG
	MOV	AH,9
	INT	21H
	RET
	org	200h
bcd_temp	dt	?
	org	210h
	fimul	ten6
	fbstp	bcd_temp
	int	3
SIN	ENDP
CODE	ENDS
	END	SIN
