.TITLE A2CLNK
.IDENT /V1.0/
.SBTTL ADD OR SUBTRACT TO CLUNK TIME ROUTINE (A2CLNK)
; THIS ROUTINE WILL ADD OR SUBTRACT A SPECIFIC AMOUNT OF TIME TO A
; GIVEN CLUNK VALUE AND RETURN A NEW CLUNK VALUE IN THAT SAME
; PARAMETER.
;
; LAST EDIT: 6-NOV-1987 13:43:54 
;
; AUTHOR:	PETER STADICK
;		CARGILL INC.
;		P.O. DRAWER AR
;		RESERVE,LA 70084
;
; EDIT HISTORY: CREATED MAY-87 PJS
;		MADE SEPERATE MODULE OCT-87 PJS
;
; CALLING PARAMETER LIST
;	 2(R5) = CLUNK VALUE ( INPUT / OUTPUT )
;	 4(R5) = SIGN ( INPUT PRESERVED )
;	 6(R5) = DAYS TO ADD AS UNSIGNED INTEGER ( INPUT PRESERVED )
;	10(R5) = HOURS TO ADD AS UNSIGNED INTEGER ( INPUT PRESERVED )
;	12(R5) = MINUTES TO ADD AS UNSIGNED INTEGER ( INPUT PRESERVED )
;	14(R5) = SECONDS TO ADD AS UNSIGNED INTEGER ( INPUT PRESERVED )
;	16(R5) = STATUS 1=SUCCESS OR -3=OVERFLOW ( OUTPUT )
;
; THIS ROUTINE ADD OR SUBTRACT A SPECIFIC AMOUNT OF TIME TO A CLUNK 
; VALUE AND RETURN A NEW CLUNK VALUE IN THAT SAME PARAMETER. TO ADD
; THE VALUE OF SIGN MUST BE POSITIVE AND TO SUBTRACT THE VALUE OF SIGN 
; MUST BE NEGITIVE. IF MORE TIME IS ADDED THEN CAN BE HELD IN A 64 BIT
; INTEGER OR SUBTRACTED TO YEILD A RESULT LESS THEN ZERO THE STATUS IS
; SET TO -3.
;
; ONLY R5 AND SP ARE PRESERVED
;
.PSECT CLUNK,RO,I,LCL,REL
A2CLNK::
	MOV R5, -(SP)		; SAVE POINTER FOR LATER USE...
	MOV R5,R3		; USE R3 AS POINTER TO INPUT VARIABLES

	MOV 2(R3),R4		; PICK UP ADDRESS OF CLUNK
	MOV 6(R4),-(SP)		;  AND MOVE TO BUFFER
	MOV 4(R4),-(SP)
	MOV 2(R4),-(SP)
	MOV  (R4),-(SP)
	MOV SP,R4

	MOV #0,-(SP)		; PARAMETER WORKING BUFFER
	MOV #0,-(SP)
	MOV #0,-(SP)
	MOV #0,-(SP)
	MOV SP,R0

	MOV R2,-(SP)		; RESULT WORKING BUFFER
	MOV R2,-(SP)
	MOV R2,-(SP)
	MOV R2,-(SP)
	MOV SP,R2

	MOV #000000,-(SP)	; MULTIPLIER BUFFER
	MOV #000311,-(SP)	; SET TO CLUNKS PER DAY
	MOV #025151,-(SP)
	MOV #140000,-(SP)
	MOV SP,R1

; ADD OR SUBTRACT DAYS
	MOV @6(R3),(R0)		; NUMBER OF DAYS TO ADD OR SUBTRACT
	MOV R5,-(SP)		; IDS VALUE LOCATION
	MOV SP,R5
	MOV R5,-(SP)		; ADDRESS OF IDS
	MOV R2,-(SP)		; RESULT BUFFER
	MOV R1,-(SP)		; CLUNKS PER DAY BUFFER
	MOV R0,-(SP)		; NUMBER OF DAYS FROM PARAMETERS
	MOV SP,R5
	SUB #2,R5		; ADJUST ADDRESS
	JSR PC,MUL64		; MULTIPLY TO FIND CLUNKS TO ADD OR SUBTRACT
	BCS AERRD3		; IF CARRY SET THEN OVERFLOW

	MOV R0,6(R5)		; NEW CLUNK VALUE RESULT
	MOV R2,4(R5)		; CLUNKS TO SUBTRACT OR ADD
	MOV R4,2(R5)		; INITIAL CLUNK VALUE
	TST @4(R3)		; SEE IF WE SHOULD ADD OR SUBTRACT
	BPL 10$			; IF POSITIVE THEN ADD ELSE SUBTRACT
	JSR PC,SUB64		; LETS SUBTRACT
	BCS AERRD3
	BR  15$
10$:
	JSR PC,ADD64		; LETS ADD
	BCS AERRD3

15$:				; (R0) NOW HAVE LATEST RESULT

; ADD OR SUBTRACT HOURS
	MOV #000000,6(R1)	; MULTIPLIER BUFFER
	MOV #000010,4(R1)	; SET TO CLUNKS PER HOUR
	MOV #060704,2(R1)
	MOV #064000,(R1)

	MOV @10(R3),(R2)	; NUMBER OF HOURS TO ADD OR SUBTRACT
	MOV #0,2(R2)		; ZERO UPPER PART OF BUFFER
	MOV #0,4(R2)
	MOV #0,6(R2)
	MOV R4,6(R5)		; RESULT BUFFER
	MOV R1,4(R5)		; CLUNKS PER HOUR BUFFER
	MOV R2,2(R5)		; NUMBER OF HOURS FROM PARAMETERS
	JSR PC,MUL64		; MULTIPLY TO FIND CLUNKS TO ADD OR SUBTRACT
AERRD3:	BCS AERRD2		; IF CARRY SET THEN OVERFLOW

	MOV R2,6(R5)		; NEW CLUNK VALUE RESULT
	MOV R4,4(R5)		; CLUNKS TO SUBTRACT OR ADD
	MOV R0,2(R5)		; INITIAL CLUNK VALUE
	TST @4(R3)		; SEE IF WE SHOULD ADD OR SUBTRACT
	BPL 20$			; IF POSITIVE THEN ADD ELSE SUBTRACT
	JSR PC,SUB64		; LETS SUBTRACT
	BCS AERRD2
	BR  25$
20$:	
	JSR PC,ADD64		; LETS ADD
	BCS AERRD2

25$:				; (R2) NOW HAVE LATEST RESULT



; ADD OR SUBTRACT MINUTES
	MOV #000000,6(R1)	; MULTIPLIER BUFFER
	MOV #000000,4(R1)	; SET TO CLUNKS PER MINUTE
	MOV #021703,2(R1)
	MOV #043000,(R1)

	MOV @12(R3),(R0)	; NUMBER OF MINUTES TO ADD OR SUBTRACT
	MOV #0,2(R0)		; ZERO UPPER PART OF BUFFER
	MOV #0,4(R0)
	MOV #0,6(R0)
	MOV R4,6(R5)		; RESULT BUFFER
	MOV R1,4(R5)		; CLUNKS PER MINUTE BUFFER
	MOV R0,2(R5)		; NUMBER OF MINUTES FROM PARAMETERS
	JSR PC,MUL64		; MULTIPLY TO FIND CLUNKS TO ADD OR SUBTRACT
AERRD2:	BCS AERRD1		; IF CARRY SET THEN OVERFLOW

	MOV R0,6(R5)		; NEW CLUNK VALUE RESULT
	MOV R4,4(R5)		; CLUNKS TO SUBTRACT OR ADD
	MOV R2,2(R5)		; INITIAL CLUNK VALUE
	TST @4(R3)		; SEE IF WE SHOULD ADD OR SUBTRACT
	BPL 30$			; IF POSITIVE THEN ADD ELSE SUBTRACT
	JSR PC,SUB64		; LETS SUBTRACT
	BCS AERRD1
	BR  35$
30$:	
	JSR PC,ADD64		; LETS ADD
	BCS AERRD1

; ADD OR SUBTRACT SECONDS
35$:				; (R0) NOW HAVE LATEST RESULT
	MOV #000000,6(R1)	; MULTIPLIER BUFFER
	MOV #000000,4(R1)	; SET TO CLUNKS PER SECOND
	MOV #000230,2(R1)
	MOV #113200,(R1)

	MOV @14(R3),(R2)	; NUMBER OF SECONDS TO ADD OR SUBTRACT
	MOV #0,2(R2)		; ZERO UPPER PART OF BUFFER
	MOV #0,4(R2)
	MOV #0,6(R2)
	MOV R4,6(R5)		; RESULT BUFFER
	MOV R1,4(R5)		; CLUNKS PER SECOND BUFFER
	MOV R2,2(R5)		; NUMBER OF SECONDS FROM PARAMETERS
	JSR PC,MUL64		; MULTIPLY TO FIND CLUNKS TO ADD OR SUBTRACT
AERRD1:	BCS AERRD		; IF CARRY SET THEN OVERFLOW

	MOV R2,6(R5)		; NEW CLUNK VALUE RESULT
	MOV R4,4(R5)		; CLUNKS TO SUBTRACT OR ADD
	MOV R0,2(R5)		; INITIAL CLUNK VALUE
	TST @4(R3)		; SEE IF WE SHOULD ADD OR SUBTRACT
	BPL 40$			; IF POSITIVE THEN ADD ELSE SUBTRACT
	JSR PC,SUB64		; LETS SUBTRACT
	BCS AERRD
	BR  ADONE
40$:	
	JSR PC,ADD64		; LETS ADD
	BCS AERRD

				; (R2) NOW HAVE LATEST RESULT

ADONE:	
	MOV R4,SP		; ADJUST STACK BACK
	ADD #10,SP	
	MOV (SP)+, R5		;GET ARG POINTER BACK FROM STACK

	MOV 2(R5),R0		;GET ADDRESS OF CALLER'S BUFFER
	MOV  (R2),(R0)
	MOV 2(R2),2(R0)
	MOV 4(R2),4(R0)
	MOV 6(R2),6(R0)

	MOV #1, @16(R5)		; INDICATE SUCCESSFUL STATUS
	RTS PC

AERRD:	
	MOV R4,SP		; ADJUST STACK BACK
	ADD #10,SP	
	MOV (SP)+, R5		;RESTORE ARG POINTER

	MOV #-3, @16(R5)	; INDICATE OVERFLOW STATUS

	RTS PC

	.END
