	.TITLE	DIFFERENCE		
; JEFFREY KODOSKY	ARL	JUL76
;
; SUBR
; ENTRY:	2 ARGS		<N1>;<N2>
; EXIT:		1 ARG		<N>=N1-N2
; ERRORS:	I4, HARD MATH ERROR (SUPPRESSED WITH Z SWITCH
;			FOR LEGAL OPERATIONS WITH INFINITY.
;			INFINITY-INFINITY IS ALWAYS ILLEGAL)
; CALLS:	ATM2N
;		I2ATM
;		IDR
;		R2ATM
;		IR
;		SBR
;		GET
	.GLOBL	DIFFERENCE,ZDIFFERENCE,QATM2N,QI2ATM,QIDR,QR2ATM
	.GLOBL	QIR,QSBR,APVAL,ZSW,QGET,QI4ERR
DIFFERENCE:QATM2N	;GET N1
	BCS	DIF25
	QATM2N		;GET N2
	BCS	DIF07
	SUB	(SP)+,@SP	;SUBTRACT INTEGERS
	BVS	DIF03
DIF01:	QI2ATM
	.WORD	0
DIF03:	CLR	-(SP)	;SIGN EXTEND RESULT
	TST	2(SP)
	BMI	.+4
	DEC	@SP
	QIDR
DIF05:	QR2ATM
	.WORD	0
DIF07:	BIT	#77777,@SP	;N1=INT, N2=REAL OR INF
	BNE	DIF10
	TST	2(SP)
	BNE	DIF20	;N1=INT,N2=INF
	CMP	(SP)+,(SP)+	;N1=INT,N2=0.0, RETURN N1
	BR	DIF01
DIF10:	MOV	@SP,-(SP)	;N1=INT, N2=REAL
	MOV	4(SP),2(SP)
	MOV	6(SP),-(SP)
	QIR
	MOV	(SP)+,6(SP)
	MOV	(SP)+,6(SP)
DIF14:	QSBR
	BCC	DIF05	;RETURN REAL
DIF15:	ROOM	3	;CHECK IF INF ALLOWED
	MOV	APVAL,-(R5)
	MOV	ZSW,-(R5)
	QGET
	TST	(R5)+
	BNE	DIF05
DIF17:	QI4ERR		;INF ERROR
DIF20:	ADD	#100000,@SP	;RETURN -N2 (INF)
	MOV	(SP)+,@SP	;MAKE CLEAN INF
DIF22:	MOV	#-1,2(SP)
	BR	DIF15
DIF25:	BIT	#77777,@SP
	BNE	DIF31	;JUMP IF N1=REAL
	TST	2(SP)
	BEQ	DIF31	;JUMP IF N1=0.0
	QATM2N		;N1=INF, GET N2
	BCC	DIF28	;JUMP IF N2=INT,N1=INF
	BIT	#77777,@SP
	BNE	DIF27	;JUMP IF N2=REAL,N1=INF
	TST	2(SP)
	BNE	DIF37	;JUMP IF N2=INF,N1=INF
DIF27:	TST	(SP)+
DIF28:	TST	(SP)+
	BR	DIF22
DIF31:	QATM2N
	BCS	DIF33	;JUMP IF N1=REAL,N2=REAL OR INF
	QIR
	BR	DIF14
DIF33:	BIT	#77777,@SP
	BNE	DIF14	;JUMP IF N1,N2 REAL
	TST	2(SP)
	BEQ	DIF14
	MOV	(SP)+,@SP	;N1=REAL,N2=INF
	BR	DIF20
DIF37:	CMP	(SP)+,2(SP)
	BEQ	DIF17
	TST	(SP)+
	BR	DIF22
ZDIFFERENCE=.-DIFFERENCE
	.END
