	.TITLE	EQN		
; JEFFREY KODOSKY	ARL	NOV75
;
; SUBR
; ENTRY:	2 ARGS		<S1>;<S2>
; EXIT:		1 ARG		<BOOL>
; ERRORS:	NONE
; CALLS:	NONE (EQ)
;		ATM2N, ATOM TO NUMBER CONVERSION (EQN)
;		IR, INTEGER TO REAL CONVERSION (EQN)
; EQ PRESERVES R0,R1,R2,R3
	.GLOBL	EQ,ZEQ,EQN,ZEQN,.T.,QATM2N,QIR
EQ:	CMP	(R5)+,(R5)+
	BNE	EQ02
EQ01:	MOV	.T.,-(R5)
	JMP	@-(R4)
EQ02:	CLR	-(R5)
	JMP	@-(R4)
ZEQ=.-EQ
;
EQN:	CMP	(R5)+,(R5)+	;EQ[<S1>;<S2>]?
	BEQ	EQ01
	BIT	#3,@-(R5)	;NUMBERP[<S2>]?
	BNE	EQN10	;JUMP IF SO
	BIT	#3,@-(R5)	;NUMBERP[<S1>]?
	BNE	EQ	;YES: RETURN FALSE EVENTUALLY
	MOV	(R5)+,R0;NO: COMPARE TWO STRINGS (OR TWO ATOM
	MOV	(R5)+,R1;PNAMES, E.G. FOR ATMOBL)
	BIT	#3,2(R0);IF ONE ARG IS A LIST RETURN FALSE
	BEQ	EQ02
	BIT	#3,2(R1)
	BEQ	EQ02
EQN1:	MOV	@R0,R0	;GET NEXT CELL OF STRING1
	BIC	#3,R0	;REMOVE DATA BIT
	BEQ	EQN01	;JUMP IF NO MORE CELLS
	MOV	@R1,R1	;GET NEXT CELL OF STRING2
	BIC	#3,R1	;REMOVE DATA BIT
	BEQ	EQ02	;RETURN FALSE IF STRING2 IS SHORTER
	CMP	2(R0),2(R1)	;COMPARE DATA
	BNE	EQ02	;RETURN FALSE IF DIFFERENT
	BR	EQN1	;IF SAME, LOOP BACK TO CHECK NEXT
EQN01:	MOV	@R1,R1	;GET NEXT CELL OF STRING2
	BIC	#3,R1
	BEQ	EQ01	;RETURN TRUE IF STRINGS END AT THE
	BR	EQ02	;SAME TIME, FALSE IF STRING1 SHORTER
EQN10:	BIT	#3,@-(R5)	;NUMBERP[<S1>]?
	BEQ	EQ	;NO: RETURN FALSE EVENTUALLY
	QATM2N		;YES: COMPARE TWO NUMBERS
	BCS	EQN20	;JUMP IF FIRST IS FLOATING POINT
	QATM2N
	BCS	EQN12	;JUMP IF SECOND IS FLOATING POINT
EQN11:	CMP	(SP)+,(SP)+	;COMPARE TWO INTEGERS
	BEQ	EQ01
	BR	EQ02
EQN12:	MOV	4(SP),R0;GET INTEGER
	MOV	(SP)+,2(SP)	;SET UP TO INTERLEAVE F.P. #'S
	MOV	@SP,-(SP)
	MOV	R0,-(SP);CONVERT INTEGER TO REAL
EQN13:	QIR
EQN14:	MOV	(SP)+,4(SP)	;INSERT EXPONENT
	CMP	(SP)+,(SP)+	;COMPARE MANTISSAS
	BEQ	EQN11	;IF EQUAL JUMP TO COMPARE EXPONENTS
	CMP	(SP)+,(SP)+	;OTHERWISE FLUSH STACK
	BR	EQ02	;AND RETURN FALSE
EQN20:	MOV	2(SP),-(SP)	;SET UP TO INTERLEAVE F.P. #'S
	MOV	2(SP),4(SP)
	QATM2N
	BCS	EQN14	;JUMP IF SECOND IS F.P.
	BR	EQN13	;OTHERWISE CONVERT IT
ZEQN=.-EQN
	.END
