.TITLE JDATE ; ; WAYNE L. DERNONCOURT ; NAVAL ORDNANCE STATION ; INDIAN HEAD, MARYLAND 20640 ; SEPTEMBER 22, 1980 ; ; ; TO CALL FROM FORTRAN: CALL JDATE (IMONTH,IDAY,IYEAR,JDAZE,LEFT) ; ; TO CALL FROM MACRO-11: ; . ; . ; MOV #JLABEL,R5 ; JSR PC,JDATE ; . ; . ; JLABEL: .WORD 4.,IMONTH,IDAY,IYEAR,JDAZE,LEFT ; IMONTH: .BLKW 1 ;GIVEN - MONTH ; IDAY: .BLKW 1 ;GIVEN - DAY OF MONTH ; IYEAR: .BLKW 1 ;GIVEN - YEAR ; JDAZE: .BLKW 1 ;RETURNED - JULIAN DATE ; LEFT: .BLKW 1 ;RETURNED - NUMBER OF DAYS LEFT IN YEAR ; ; THIS PROGRAM CONVERTS MOST CALENDAR DATES TO THE PROPER JULIAN DATES, ; EXCEPTIONS FOR THIS PROGRAM ARE YEARS DIVISIBLE BY 4 BUT ARE NOT LEAP ; YEARS (I.E. 1900) AND DATES STARTING BEFORE THE CURRENT CALENDAR ; CAME IN TO USE (CIRCA 1580). IN ADDITION THE NUMBER OF DAYS REMAINING ; IN THE YEAR IS ALSO RETURNED ; ; R0 - MONTH ; R1 - DAY ; R2 - YEAR, THIS REGISTER IS ALSO USED TO POINT TO THE LOCATION WHERE THE ; IS TO BE STORED UPON COMPLETION OF THE ROUTINE ; R3 - FLAG: CLEARED IF YEAR IS DIVISIBLE BY 4, I.E. A LEAP YEAR (USUALLY) ; R4 - JULIAN DATE, THIS REGISTER IS ALSO USED TO POINT TO THE INPUT VALUES ; ; .NLIST BEX ; JDATE:: NOP MOV R0,-(SP) ;SAVE MOV R1,-(SP) ;REGISTERS 0 THRU 4 MOV R2,-(SP) ;AND MOV R3,-(SP) ;RESTORE THEM MOV R4,-(SP) ;BEFORE YOU RETURN ; MOV (R5),R3 ;MOVE NUMBER OF ARGS INTO REG.3 CMP R3,#5 ;CORRECT NUMBER OF ARGUMENTS BNE 20$ ;BR. NOT EQUAL TO FOR GOOF-UP MOV @2(R5),R0 ;MONTH PLEASE BLE 20$ ;MONTH CANNOT BE <= TO ZERO MOV @4(R5),R1 ;DAY PLEASE BLE 20$ ;DAY CANNOT BE <= TO ZERO MOV @6(R5),R2 ;YEAR IF YOU PLEASE BLT 20$ ;HAS TO BE A POSITIVE NUMBER CLR R4 CMP R0,#12. ;OR GREATER THAN 12. BGT 20$ MOV #1.,R3 ;LEAP DAY POSSIBILITY MOV R2,YEAR ;CHECK ON DIVISIBILTY BY 4. ASR R2 ASR R2 ASL R2 ASL R2 CMP R2,YEAR ;IF R2=R3, YEAR/4,I.E. LEAP YEAR BEQ 10$ CLR R3 10$: CMPB R1,NDAY(R0) BLE 30$ ;OR GREATER THAN NUMBER OF DAYS IN A ;MONTH CMP R0,#2. BNE 20$ ;CHECK TO SEE IF MONTH IS FEBRUARY TST R3 ;CHECK TO SEE IF A LEAP YEAR BEQ 20$ CMP R1,#29. ;COMPARE FOR LEAP DAY BEQ 30$ ; ; ERROR ROUTINE 20$: MOV #-1.,R2 ;A MISTAKE HAS BEEN MADE MOV #-1.,R4 BR 60$ ;GO BACK TO MAIN ROUTINE ; ; GET ON WITH PROGRAM 30$: MOV #365.,R2 ADD R3,R2 TST R3 BEQ 40$ CMP #3.,R0 BGT 40$ INC R4 40$: DEC R0 BEQ 50$ MOVB NDAY(R0),R3 ADD R3,R4 BR 40$ ; 50$: ADD R1,R4 SUB R4,R2 60$: MOV R4,@8.(R5) ;OUTPUT FINAL ANSWER MOV R2,@10.(R5) ;NUMBER OF DAYS LEFT ; MOV (SP)+,R4 ;CLEAN UP BEFORE LEAVING MOV (SP)+,R3 MOV (SP)+,R2 ;RESTORE AFFECTED MOV (SP)+,R1 ;REGISTERS MOV (SP)+,R0 ;BEFORE EXITING ; RTS PC ;RETURN TO MAIN PROGRAM ; ; DATA AREA ; NDAY: .BYTE 0.,31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. .EVEN YEAR: .BLKW 1 ; ; .END