.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