	.TITLE	MLR		
; JEFFREY KODOSKY	ARL	MAY76
;
; UTILITY:	FLOATING POINT MULTIPLIER
; ENTRY:	2 ARGS (SP)	<F1>;<F2>
; EXIT:		1 ARG (SP)	<F>=F1*F2
;		C BIT SET AND +-INF RETURNED IF OVERFLOW
; ERRORS:	NONE
; CALLS:	NONE
; R5 PRESERVED
; ASSEMBLY SWITCHES:	FPU,FIS,EAE,EIS
;(THIS ROUTINE IS A MODIFIED VERSION OF $MLR05 OF FPMP)
	.GLOBL	MLR
	MQ=177304
	SR=177311
	LSH=177314
	F0=%0
A=8.
B=12.
RESLT=8.
SIGN=2
	.IFDF	FPU
MLR:	.WORD	170001	
	.WORD	172426	
	.WORD	171026	
	.WORD	174046	
	.WORD	170000
	BVS	INF
	JMP	@-(R4)
	.GLOBL	$$INF
; GOTO ADR FPU OVERFLOW CODE
INF:	JMP	$$INF
	.ENDC
	.IFNDF	FPU
	.IFDF	FIS
MLR:	FMUL	SP
	BVS	UOVFL
	JMP	@-(R4)
	.GLOBL	$$INF0
; ENTRY POINT FOR DVR FIS OVER/UNDER FLOW
$$INF0:
UOVFL:	BMI	ZERO
	ROL	(SP)+
	ROL	R0
	TST	(SP)+
	ROL	(SP)+
	ADC	R0
	MOV	#-1,@SP
	CLR	-(SP)
	ROR	R0
	ROR	@SP
	SEC
	JMP	@-(R4)
ZERO:	CMP	(SP)+,(SP)+
	CLR	@SP
	CLR	2(SP)
	JMP	@-(R4)
	.ENDC
	.IFNDF	FIS
MLR:	MOV	R4,-(SP)
	MOV	R5,-(SP)
	.IFNDF	EAE&EIS
	MOV	A+0-4(SP),R2
	ASL	R2	
	ROL	-(SP)	
	CLR	-(SP)	
	SWAB	R2
	MOVB	R2,@SP	
	BEQ	ZE1$30	
	SEC		
	ROR	R2
	CLRB	R2
	BISB	A+3(SP),R2
	CLR	R3
	BISB	A+2(SP),R3
	SWAB	R3
	ASL	B(SP)	
	ADC	SIGN(SP)		
	ADC	SIGN(SP)	
	TSTB	B+1(SP)
	BEQ	ZE1$30	
	ROR	B(SP)	
	CLR	R0	
	CLR	R1
	MOV	B+2(SP),R4	
	BEQ	B2Z$30
B2N$30:	MOV	#15.,R5
	JSR	PC,MT0$30
	JSR	PC,MLT$30	
B2Z$30:	MOV	B(SP),R4	
	MOV	#7,R5	
	JSR	PC,MLT$30
	JSR	PC,MT1$30	
	ADD	(SP)+,R4	
	.ENDC

	.IFDF	EAE

	MOV	#MQ,R4	
	MOV	#100000,R5	
	MOV	B+2-4(SP),@R4	
	MOV	B+0-4(SP),-(R4)	
	BEQ	ZER$30	
	INC	@#LSH	
	RORB	@#SR
	ROL	-(SP)	
	MOV	(R4)+,-(SP)	
	CLRB	@SP	
	SWAB	@SP
	MOV	#7,@#LSH	
	MOV	@R4,-(SP)	
	BIS	R5,-(R4)	
	MOV	(R4)+,-(SP)	
	MOV	A+2+4(SP),@R4	
	MOV	A+0+4(SP),-(R4)	
	BEQ	ZE2$30	
	INC	@#LSH	
	RORB	@#SR
	ADC	6(SP)	
	MOV	@R4,R3	
	CLRB	R3
	SWAB	R3
	ADD	R3,4(SP)	
	MOV	#7,@#LSH	
	MOV	(R4)+,R2	
	BIS	R5,R2	
	CLR	R0	
	CLR	R1
	MOV	(R4)+,R3	
	BNE	A2N$30
	TST	-(R4)	
	BR	A2Z$30	
A2N$30:	MOV	@SP,@R4	
	CMP	-(R4),-(R4)	
	ADD	R3,@R4	
	TST	R3
	BPL	A2P$30
	ADD	@SP,@R4	
A2P$30:	MOV	(R4)+,R1	
A2Z$30:	MOV	2(SP),(R4)+	
	BNE	B2N$30
	TST	-(R4)	
	BR	B2Z$30	
B2N$30:	MOV	R2,@R4	
	CMP	-(R4),-(R4)	
	ADD	2(SP),@R4	
	TST	2(SP)
	BPL	B2P$30	
	ADD	R2,@R4	
B2P$30:	ADD	(R4)+,R1	
	ADC	R0
B2Z$30:	MOV	R2,(R4)+	
	ADD	R2,R0
	MOV	@SP,@R4	
	ADD	(SP)+,R0
	ADD	-(R4),R1
	ADC	R0
	ADD	-(R4),R0	
	TST	(SP)+	
	MOV	(SP)+,R4	
	.ENDC

	.IFDF	EIS

	MOV	B+2-4(SP),R5	
	MOV	B+0-4(SP),R4	
	BEQ	ZER$30
	.WORD	073427,1	
	ROL	-(SP)	
	MOV	R4,-(SP)	
	CLRB	@SP
	SWAB	@SP	
	.WORD	073427,7	
	MOV	R5,-(SP)	
	BIS	#100000,R4	
	MOV	R4,-(SP)	
	MOV	A+2+4(SP),R3	
	MOV	A+0+4(SP),R2	
	BEQ	ZE2$30	
	.WORD	073227,1	
	ADC	6(SP)	
	MOV	R2,R0	
	CLRB	R0
	SWAB	R0
	ADD	R0,4(SP)	
	.WORD	073227,7	
	BIS	#100000,R2	
	CLR	R0	
	CLR	R1
	TST	R3	
	BEQ	A2Z$30	
	.WORD	070403	
	ADD	R3,R4
	TST	R3
	BPL	A2P$30	
	ADD	@SP,R4	
A2P$30:	MOV	R4,R1	
A2Z$30:	MOV	2(SP),R4	
	BEQ	B2Z$30	
	.WORD	070402	
	ADD	2(SP),R4
	TST	2(SP)
	BPL	B2P$30	
	ADD	R2,R4	
B2P$30:	ADD	R4,R1	
	ADC	R0
B2Z$30:	MOV	R2,R4	
	ADD	R2,R0
	.WORD	070416	
	ADD	(SP)+,R0
	ADD	R5,R1	
	ADC	R0
	ADD	R4,R0	
	TST	(SP)+	
	MOV	(SP)+,R4	
	.ENDC
	ROL	R1	
	ROL	R0
	BCS	NOM$30	
	ROL	R1
	ROL	R0	
	DEC	R4	
NOM$30:	SUB	#200,R4	
	BLE	UND$30	
	CMP	#377,R4
	BLT	OVFL	
	CLRB	R1
	BISB	R0,R1
	SWAB	R1
	CLRB	R0
	BISB	R4,R0
	SWAB	R0
	ROR	@SP
	ROR	R0	
	ROR	R1
	ADC	R1
	ADC	R0
	BCS	OVFL
	BVS	OVFL
	TST	(SP)+
OUT$30:	MOV	R0,RESLT(SP)	
	MOV	R1,RESLT+2(SP)
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	CMP	(SP)+,(SP)+	
	CLC
	JMP	@-(R4)
	.IFDF	EAE!EIS
ZE2$30:	CMP	(SP)+,(SP)+	
	.ENDC
ZE1$30:	CMP	(SP)+,(SP)+	
	BR	ZER$30
OVFL:	MOV	#-1,RESLT+2+2(SP)
	CLR	R0
	ROR	(SP)+
	ROR	R0
	MOV	R0,RESLT(SP)
	MOV	(SP)+,R5
	MOV	(SP)+,R4
	CMP	(SP)+,(SP)+
	SEC
	JMP	@-(R4)
UND$30:	TST	(SP)+	
ZER$30:	CLR	R0	
	CLR	R1
	BR	OUT$30
	.IFNDF	EAE&EIS
MLT$30:	ASR	R4	
	BCC	X0$30	
MT1$30:	ADD	R3,R1
	ADC	R0
	BCS	COV$30
	ADD	R2,R0
X0$30:	ROR	R0	
	ROR	R1
	DEC	R5	
	BGT	MLT$30	
	RTS	PC	
COV$30:	ADD	R2,R0	
	SEC		
	BR	X0$30
MT0$30:	ASR	R4	
	BCC	X00$30
	ADD	R2,R0	
X00$30:	ROR	R0
	ROR	R1
	DEC	R5
	BGT	MT0$30
	RTS	PC
	.ENDC
	.ENDC
	.ENDC
	.END
