	.TITLE	.MINMX
/
/  10 APR 73 - (PDH) FIX ERROR NUMBER
/
/ THIS SECTION CONTAINS ALL THE MAXIMUM AND MINIMUM FUNCTIONS
/
/ INTERNAL GLOBALS
	.GLOBL	AMAX1,AMIN1,MAX1,MIN1,DMAX1,DMIN1
	.GLOBL	AMAX0,AMIN0,MAX0,MIN0
/
/ EXTERNAL GLOBALS
	.GLOBL	.FETCH,.PSHBA,.ILMDE,.FIX,.FLOTA,.ERROR
	.GLOBL	.MODEA,.SIGNA,.EXPA,.SIGNB,.EXPB,.INT1,.INT2
/
/
/
/ REAL FUNCTION , REAL ARGUMENTS
/
AMAX1	XX
	LAC	(2
	DAC	BOXX
	LAW	-2
AXJOIN	DAC	BIN2
	LAC	(SMA
	DAC	CONV
	JMS	MAXMIN
	JMP*	AMAX1
/
/ INTEGER FUNCTION, REAL ARGUMENTS
/
MAX1	XX
	JMS	AMAX1
	JMS*	.FIX
	DZM*	.MODEA	/ MARK MODE AS INTEGER
	JMP*	MAX1
/
/ REAL FUNCTION, REAL ARGUMENTS
/
AMIN1	XX
	LAC	(2
	DAC	BOXX
	LAW	-2
ANJOIN	DAC	BIN2
	LAC	(SPA
	DAC	CONV
	JMS	MAXMIN
	JMP*	AMIN1
/
/ INTEGER FUNCTION, REAL ARGUMENTS
/
MIN1	XX
	JMS	AMIN1
	JMS*	.FIX
	DZM*	.MODEA	/ MARK MODE AS INTEGER
	JMP*	MIN1
/
/ DOUBLE FUNCTION , DOUBLE ARGUMENTS
DMAX1	XX
	LAC	DMAX1
	DAC	AMAX1
	LAC	(3
	DAC	BOXX
	LAW	-4
	JMP	AXJOIN
/
/ DOUBLE FUNCTION, DOUBLE ARGUMENTS
/
DMIN1	XX
	LAC	DMIN1
	DAC	AMIN1
	LAC	(3
	DAC	BOXX
	LAW	-4
	JMP	ANJOIN
/
/ REAL FUNCTION, INTEGER ARGUMENTS
/
AMAX0	XX
	JMS	MAX0
	JMS*	.FLOTA
	JMP*	AMAX0
/
/ INTEGER FUNCTION, INTEGER ARGUMENTS
/
MAX0	XX
	LAC	(SMA
	DAC	CONV0
	JMS	IMAXMN
	JMP*	MAX0
/
/ REAL FUNCTION, INTEGER ARGUMENTS
/
AMIN0	XX
	JMS	MIN0
	JMS*	.FLOTA
	JMP*	AMIN0
/
/ INTEGER FUNCTION ARGUMENTS
/
MIN0	XX
	LAC	(SPA
	DAC	CONV0
	JMS	IMAXMN
	JMP*	MIN0
/
/
/ THIS SUBROUTINE ACTUALLY DOES THE COMPARISIONS
/
MAXMIN	XX
	JMS*	.FETCH
	SAD	BOXX	/ ARE MODES THE SAME
	SKP
	JMP*	.ILMDE
	JMS*	.PSHBA	/ FORCE B INTO A
	JMS*	.FETCH
	SZL
	JMP	MERROR	/ ERROR - ONLY ONE ARGUMENT
/
LOOPM	SAD	BOXX
	SKP
	JMP*	.ILMDE	/ ERROR - ILLEGAL MODE
	LAC*	.SIGNA
	SAD*	.SIGNB	/ ARE THE SIGNS THE SAME
	SKP
	JMP	CONV	/ NO. CHECK WHICH IS GREATER
/ IF BOTH SIGNS ARE NEGATIVE, CHANGE THE SKIP CONDITION
	SMA
	JMP	TRYEXP	/ SIGNS BOTH POSITIVE
	LAC	(SPA\SMA	/ SIGNS BOTH NEGATIVE CHANGE SKIP
	XOR	CONV
	DAC	CONV
/ SIGNS ARE THE SAME, TEST EXPONENTS
TRYEXP	LAC*	.EXPB
	SAD*	.EXPA
	JMP	TRYMAN
	CMA!CLL
	ADD*	.EXPA
	SZL
	CMA
	JMP	CONV	/ TEST WHICH EXPONENT IS LARGER
/ EXPONENTS ARE THE SAME , TRY MANTISSA
TRYMAN	LAC	.EXPB	/ LOAD ADDRESSES OF ACCUMULATORS ( MOSTB-1 )
	DAC*	(AUTO2
	LAC	.EXPA	/ (MOSTA-1
	DAC*	(AUTO3
/
	LAC	BIN2
	DAC	CCNT	/ RESET COUNT FOR NEXT ARGUMENT
LOOPN	LAC*	AUTO2	/ LOAD B
	CMA		/ -B-1
	TAD*	AUTO3	/ (A-B)-1
	SAD	(777777	/ IF A.EQ.B , AC=-1
	SKP
	JMP	CONV
	ISZ	CCNT
	JMP	LOOPN	/ THEY WERE THE SAME TRY NEXT WORD
/
/ IF A>B THEN AC=>0, IF B>A THEN AC<-1
CONV	XX		/ SMA FOR MAX, SPA FOR MIN
	JMP	AGTB
	LAC	BOXX	/ B.GT.A, PUT B INTO A
	JMS*	.PSHBA
AGTB	JMS*	.FETCH	/ GET NEXT ARGUMENT
	SNL
	JMP	LOOPM
	JMP*	MAXMIN
/
/ THE ARGUMENTS ARE INTEGER
/
IMAXMN	XX
	JMS*	.FETCH
	RCR
	SZA!RAL
	JMP*	.ILMDE	/ARGUMENT NON-INTEGER
	JMS*	.PSHBA	/LOAD FIRST ARGUMENT
	JMS*	.FETCH	/GET SECOND ARGUMENT
	SZL
	JMP	IERROR	/ERROR: ONLY ONE ARGUMENT
/
LOOPM0	RCR
	SZA!RAL
	JMP*	.ILMDE	/ARGUMENT NON-INTEGER
	DAC	BOXX	/SET UP BOXX
	LAC*	(AUTO2	/GET ARGUMENT ADDRESS
	DAC*	(AUTO3	/SET UP INDEX REGISTER FOR COMPARE
	SZL
	JMP	DINARG
	LAC*	AUTO3	/SINGLE INTEGER
	DAC	CCNT
	SMA!CLC
	CLA
	DAC	BIN2
	JMP	MERGE
/
DINARG	LAC*	AUTO3	/DOUBLE INTEGER
	DAC	BIN2
	LAC*	AUTO3
	DAC	CCNT
/
MERGE	LAC	BIN2
	CMA
	TAD*	.INT1
	DAC	BIN2
	CLL!CLC
	TAD	CCNT
	CML!CMA
	TAD*	.INT2
	CLA!RAL
	TAD	BIN2
/
/ IF A=>B THEN AC=>0, IF B>A THEN AC<0
CONV0	XX		/ SMA FOR MAX, SPA FOR MIN
	JMP	AGTB0
	LAC	BOXX
	JMS*	.PSHBA
AGTB0	JMS*	.FETCH
	SNL
	JMP	LOOPM0
	JMP*	IMAXMN
/
/  NOTE:  FOR THESE WARNINGS, THE 1ST & ONLY ARGUMENT IS
/  ALREADY IN THE ACCUMULATOR WHEN IT RETURNS
/
MERROR	LAW	23		/ ERROR - ONLY ONE ARGUMENT
	JMS*	.ERROR
	JMP*	MAXMIN
IERROR	LAW	23		/ERROR - ONLY ONE ARGUMENT
	JMS*	.ERROR
	JMP*	IMAXMN
/
BIN2
BOXX
CCNT
	.END
