.TITLE ADD64
.IDENT /V1.0/
.SBTTL 64-BIT ADDITION ROUTINE

; ROUTINE TO ADD 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
;
;  IT WAS FURTHER MODIFIED BY BOB THOMAS,CARGILL,INC.,P.O. BOX 9300
;    MPLS,MN,55440, (612)475-5432. THOSE FURTHER MODIFICATIONS
;    WERE TO CORRECT THE VALUES FOR 1 SEC, 1 MIN AND 1 HOUR. IN
;    ADDITION THE ADD64 ROUTINE WAS REWRITTEN TO PROVIDE FOR CASCADING 
;    CARRY BITS (SUCH AS THOSE THAT OCCUR ON 05-JUN-86 17:09:27).
;    THIS ROUTINE WAS REWRITTEN BY BOB THOMAS 
;    ON 21-AUG-86 TO PROVIDE FOR HANDLING CASCADING
;    CARRY BITS (E.G.  05-JUN-86 17:09:27)
;
;  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) = SUM (OUTPUT)
;	10(R5) = STATUS 1=SUCCESS OR -3=OVERFLOW ( OUTPUT )
;
;  R0 AND R1 POINT TO VALUES TO BE ADDED
;  R2 POINTS TO DESTINATION OF SUM
;
;  STATUS WILL BE SET TO -3 AND THE CARRY BIT
;  WILL BE SET ON RETURN IF OVERFLOW OCCURS
;
;  ALL REGISTERS ARE PRESERVED
;
.PSECT CLUNK,RO,I,LCL,REL
ADD64::
	MOV R0,-(SP)		; PRESERVE REGISTERS
	MOV R1,-(SP)
	MOV R2,-(SP)

	MOV 2(R5),R0		; FIRST VALUE
	MOV 4(R5),R1		; SECOND VALUE
	MOV 6(R5),R2		; DESTINATION OF SUM
	MOV #1,@10(R5)		; SET STATUS TO SUCCESS

	MOV (R1),(R2)		;Move the R1 values to R2
	MOV 2(R1),2(R2)	
	MOV 4(R1),4(R2)
	MOV 6(R1),6(R2)

	ADD (R0),(R2)		;Add the first word from R0

	ADC 2(R2)		;Handle any carry bits
        ADC 4(R2)
        ADC 6(R2)
        BCC 10$
        MOV #-3,@10(R5)		;If carry on the fourth word - error

10$:	ADD 2(R0),2(R2)		;Add the second word from R0

	ADC 4(R2)		;Handle any carry bits
        ADC 6(R2)
        BCC 20$
        MOV #-3,@10(R5)		;If carry on the fourth word - error

20$:	ADD 4(R0),4(R2)		;Add the third word from R0

	ADC 6(R2)		;Handle any carry bits
        BCC 30$
        MOV #-3,@10(R5)		;If carry on the fourth word - error

30$:	ADD 6(R0),6(R2)		;Add the fourth word from R0

        BCC 40$
        MOV #-3,@10(R5)		;If carry on the fourth word - error

40$:	
	MOV (SP)+,R2		;Restore registers
	MOV (SP)+,R1
	MOV (SP)+,R0

	RTS PC			;Return

	.END
