	.TITLE	MAX		
; JEFFREY KODOSKY	ARL	JUL76
;
; FSUBR
; ENTRY:	1 ARG
; EXIT:		1 ARG		<N>
; ERRORS:	NONE
; CALLS:	ATM2N
;		I2ATM
;		R2ATM
;		CAR
;		CDR
;		EVLIS
;		CMR
;		IR
	.GLOBL	MAX,ZMAX,QEVLIS,QCDR,QCAR,QATM2N,QR2ATM
	.GLOBL	QI2ATM,QIR,QCMR
MAX:	QEVLIS
	CLR	(PC)+
ACFLAG:	.WORD	0	;0=INT,>0=REAL,<0=INF
	MOV	@R5,R3	;GET FIRST ARG
	BEQ	MAX01	;JUMP IF NO ARGS
	QCDR
	MOV	R3,-(R5)
	QCAR
	QATM2N
	BCC	MAX10	;JUMP IF AC IS TO BE INT
	INC	ACFLAG	;ELSE REAL
	BIT	#77777,@SP	;CHECK FOR INF
	BNE	MAX10
	TST	2(SP)
	BEQ	MAX10
	NEG	ACFLAG	;NOTE INF
MAX00:	MOV	#-1,2(SP)	;MAKE CLEAN INF
	TST	@SP
	BMI	MAX10	;+INF TERMINATES SEARCH
	TST	(R5)+
	BR	MAX06
MAX01:	MOV	(R5)+,-(SP)	;POP NIL AND MAKE INT 0
MAX03:	QI2ATM
	.WORD	0
MAX05:	CMP	ACFLAG,(R5)+	;TST ACFLAG
	BEQ	MAX03
MAX06:	QR2ATM
	.WORD	0
MAX09:	TST	(SP)+
MAX10:	MOV	@R5,R3	;GET NEXT NUMBER
	BEQ	MAX05	;JUMP IF NO MORE
	QCDR
	MOV	R3,-(R5)
	QCAR
	QATM2N
	BCS	MAX25	;JUMP IF ITS REAL OR INF
	TST	ACFLAG
	BMI	MAX17	;JUMP IF AC=-INF
	BNE	MAX15	;JUMP IF AC=REAL
	CMP	@SP,2(SP)	;COMPARE 2 INTEGERS
	BLE	MAX09
	MOV	(SP)+,@SP
	BR	MAX10
MAX15:	CMP	2(SP),#^F32767.	;AC=REAL,ARG=INT
	BGE	MAX09	;JUMP IF AC ALREADY LARGER THAN ANY INT
	CMP	2(SP),#^F-32768.
	BGT	MAX20
MAX17:	MOV	(SP)+,2(SP)	;ANY INTEGER > CURRENT AC
	CLR	ACFLAG
	BR	MAX09
MAX20:	MOV	4(SP),-(SP)	;COPY AC AND ARG=INT
	MOV	4(SP),-(SP)
	MOV	4(SP),-(SP)
	QIR
	QCMR		;COMPARE REALS
	BMI	MAX09
	BR	MAX17	;ARG=INT IS NEW MAX
MAX25:	BIT	#77777,@SP
	BNE	MAX26
	TST	2(SP)
	BNE	MAX40	;JUMP IF ARG=INF
MAX26:	TST	ACFLAG	;ARG=REAL
	BMI	MAX30	;JUMP IF ARG=REAL,AC=-INF
	BEQ	MAX35	;JUMP IF ARG=REAL,AC=INT
	.REPT	4
	MOV	6(SP),-(SP)
	.ENDR
	QCMR		;COMPARE TWO REALS
	BMI	MAX31	;JUMP IF ARG<AC
MAX29:	MOV	(SP)+,2(SP)	;ELSE REPLACE AC WITH NEW MAX
	MOV	(SP)+,2(SP)
	BR	MAX10
MAX30:	NEG	ACFLAG
	BR	MAX29
MAX31:	CMP	(SP)+,(SP)+
	BR	MAX10
MAX35:	INC	ACFLAG	;SWITCH ARG=REAL,AC=INT
	MOV	4(SP),R3
	MOV	2(SP),4(SP)
	MOV	(SP)+,@SP
	MOV	R3,-(SP)
	BR	MAX15
MAX40:	MOV	(SP)+,@SP	;IGNORE -INF
	BMI	MAX09
	TST	ACFLAG	;+INF TERMINATES SEARCH
	BEQ	.+4
	MOV	(SP)+,@SP
	BR	MAX00
ZMAX=.-MAX
	.END
