	PAGE	,132
	TITLE	Quadratic Equation roots
IF1
INCLUDE 87MAC.LIB
ENDIF
ZZZ	SEGMENT STACK
	DW	64 DUP(?)
ZZZ	ENDS
CODE	SEGMENT PUBLIC
	ASSUME	CS:CODE,DS:CODE,ES:CODE
	EXTRN	FLOAT_ASCII:NEAR
A	DW	1
B	DW	-5
C	DW	6
STATUS	DW	?
FOUR	DW	4
TWO	DW	2
ERROR_MSG	DB	'Roots are imaginary',10,13,'$'
QUADRATIC	PROC	FAR
	PUSH	DS
	SUB	AX,AX
	PUSH	AX
	MOV	AX,CS
	MOV	DS,AX
	MOV	ES,AX
DO_AGAIN:
	FINIT			;------ST0------;-----ST1-------
	FILD	B		;	B	;
	FMUL	ST0		;     B**2	;
	FILD	A		;	A	;     B**2
	FIMUL	FOUR		;      4*A	;     B**2
	FIMUL	C		;    4*A*C	;     B**2
	FSUBRP	ST1,ST0 	;  D=B**2-4AC	;	?
	FTST			;
	FSTSW	STATUS
	MOV	AH,BYTE PTR STATUS+1
	SAHF
	JB	IMAGINARY
	FSQRT			; SQR(D)	;
	FLD	ST0		; SQR(D)	;   SQR(D)
	FCHS			; -SQR(D)	;   SQR(D)
	FIADD	B		; B-SQR(D)	;   SQR(D)
	FCHS			; -B+SQR(D)	;   SQR(D)
	FXCH	ST1		;   SQR(D)	; -B+SQR(D)
	FIADD	B		;  B+SQR(D)	; -B+SQR(D)
	FCHS			;N1= -B-SQR(D)	;N2= -B+SQR(D)
	FIDIV	A		;  N1/A 	;      N2
	FIDIV	TWO		; ROOT1 =N1/2A	;      N2
	CALL	FLOAT_ASCII	;      N2
	FIDIV	A		;   N2/A	;
	FIDIV	TWO		; ROOT2 = N2/2A ;
	CALL	FLOAT_ASCII	;	?	;
	RET
IMAGINARY:
	MOV	DX,OFFSET ERROR_MSG
	MOV	AH,9
	INT	21H
	RET
QUADRATIC	ENDP
CODE	ENDS
	END	QUADRATIC
