.TITLE SUB64
.IDENT /V1.0/
.SBTTL 64-BIT SUBTRACTION ROUTINE

; ROUTINE TO SUBTRACT 64 BIT NUMBERS
;
;
;			--- AUTHORED BY ---
;
;			BOB ROCK
;			NORTHEAST ELECTRONICS DIV.
;			NORTHERN TELECOM INC.
;			AIRPORT RD.
;			CONCORD, N.H. 03301
;			(603) 224-6511 EXT 347
;
;		BY BOB ROCK	APR-81
;
;	LAST EDIT: 6-NOV-1987 09:22:15 
;
;  NOTE:
;    FORMAT OF LONG WORDS IS LSW,...,MSW
;
;  PETER STADICK OCT-NOV '87 - BROKEN ROUTINES INTO SEPERATE MODULES
;    AND MODIFYIED TO ALLOW THEM TO BE BUILD INTO A SUPERVISOR MODE
;    LIBRARY. ALSO ADDED DEC CALL SITE TO ADD, SUBTRACT, MULTIPLY AND
;    DIVIDE ROUTINES SO THEY CAN BE CALLED FROM FORTRAN, PASCAL, ETC..
;    PETER STADICK, CARGILL INC, P.O. DRAWER AR, RESERVE,LA 70084
;    (504)-536-4111.
;
;  CALLING PARAMETER LIST
;	 2(R5) = FIRST CLUNK VALUE ( INPUT PRESERVED )
;	 4(R5) = SECOND CLUNK VALUE ( INPUT PRESERVED }
;	 6(R5) = RESULT ( OUTPUT )
;	10(R5) = STATUS 1=SUCCESS OR -3=UNDERFLOW ( OUTPUT )
;
;  THIS ROUTINE WILL SUBTRACT THE SECOND CLUNK VALUE FROM THE FIRST
;  VALUE AND RETURN A RESULT. IF THE SECOND CLUNK VALUE IS GREATER
;  THEN THE FIRST AN UNDERFLOW ERROR WILL OCCUR AND NON OF THE RETURN
;  VALUES CAN BE TRUSTED.
;
;  2(R5) - 4(R5) = 6(R5)
;        OR
;  (R0) -(R1) = (R2)
;
;  CARRY BIT SET ON RETURN INDICATES UNDEFLOW
;  STATUS WILL BE SET TO -3 IF UNDERFLOW
;
;  ALL REGISTERS ARE PRESERVED
;
.PSECT CLUNK,RO,I,LCL,REL
SUB64::
	MOV R0, -(SP)		; PRESERVE R0,R1,R2
	MOV R1, -(SP)
	MOV R2, -(SP)

	MOV 2(R5),R0		; FIRST VALUE
	MOV 4(R5),R1		; SECOND VALUE
	MOV 6(R5),R2		; DESTINATION OF RESULT
	CLR -(SP)		; CLEAR CARRY STORAGE

	MOV (R0),(R2)
	SUB (R1),(R2)

10$:	MOV 2(R0),2(R2)
	SBC 2(R2)
	BCC 12$			;SAVE CARRY STATUS...
	BIS #1,(SP)		; RECORD CARRY SET
	BR 14$
12$:	BIC #1,(SP)		; RECORD CARRY CLEAR
14$:	SUB 2(R1),2(R2)
	BCS 20$			; IF CARRY SET, NO NEED TO CHECK PRIOR STATUS
	TST (SP)		;  OTHERWISE EXIT WITH PREVIOUS CONDITION
	BEQ 20$
	SEC			;   SET C BIT IF SET PREVIOUSLY

20$:	MOV 4(R0),4(R2)
	SBC 4(R2)
	BCC 22$
	BIS #1,(SP)
	BR 24$
22$:	BIC #1,(SP)
24$:	SUB 4(R1),4(R2)
	BCS 30$
	TST (SP)
	BEQ 30$
	SEC

30$:	MOV 6(R0),6(R2)
	SBC 6(R2)
	BCC 32$
	BIS #1,(SP)
	BR 34$
32$:	BIC #1,(SP)	
34$:	SUB 6(R1),6(R2)
	BCS 40$
	TST (SP)
	BEQ 40$
	SEC

40$:	MOV #1,@10(R5)
	BCC 41$
	MOV #-3,@10(R5)
41$:	MOV #0,(SP)+		; ADJUST STACK POINTER

	MOV (SP)+,R2		; RESTORE R0,R1,R2
	MOV (SP)+,R1
	MOV (SP)+,R0

	RTS PC

	.END
