.TITLE CDATE ; ; WAYNE L. DERNONCOURT ; NAVAL ORDNANCE STATION ; INDIAN HEAD, MARYLAND 20640 ; SEPTEMBER 22, 1980 ; ; ; TO CALL FROM FORTRAN: CALL CDATE (JDAZE,IMONTH,IDAY,IYEAR) ; ; TO CALL FROM MACRO-11: ; . ; . ; MOV #CLABEL,R5 ; JSR PC,CDATE ; . ; . ; CLABEL: .WORD 4.,JDAZE,IMONTH,IDAY,IYEAR ; JDAZE: .BLKW 1 ; IMONTH: .BLKW 1 ; IDAY: .BLKW 1 ; IYEAR: .BLKW 1 ; ; THIS PROGRAM CONVERTS MOST JULIAN DATES TO THE PROPER CALENDAR 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) ; ; 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 ; CDATE:: 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,#4 ;CORRECT NUMBER OF ARGUMENTS BNE 20$ ;IF NOT EQUAL, SHAME SHAME ON YOU MOV @2(R5),R4 ;JULIAN DATE PLEASE BLE 20$ ;JULIAN DATE CANNOT BE <= 0 MOV @8.(R5),R2 ;YEAR IF YOU PLEASE BLT 20$ ;CAN'T BE NEGATIVE MOV R2,R3 ;CHECK ON DIVISIBILTY BY 4. ASR R3 ASR R3 ASL R3 ASL R3 CMP R2,R3 ;IF R2=R3, YEAR/4,I.E. LEAP YEAR BNE 10$ CLR R3 10$: CMP R4,#365. ;OR GREATER THAN NUMBER BLE 30$ ;OF DAYS POSSIBLE IN A YEAR TST R3 BNE 20$ CMP R4,#366. BLE 30$ ; ; ERROR ROUTINE 20$: MOV #-1.,R0 ;A MISTAKE HAS BEEN MADE MOV #-1.,R1 BR 60$ ;GO BACK TO MAIN ROUTINE ; ; GET ON WITH PROGRAM 30$: MOV #1.,R0 TST R3 BEQ 35$ MOV #NRYEAR,R3 BR 40$ 35$: MOV #LPYEAR,R3 40$: MOVB (R3)+,R2 CMP R4,R2 BLE 50$ SUB R2,R4 INC R0 BR 40$ 50$: MOV R4,R1 ; 60$: MOV R0,@4(R5) ;OUTPUT FINAL ANSWER MOV R1,@6(R5) ; 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 ; NRYEAR: .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. LPYEAR: .BYTE 31.,29.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. .EVEN ; ; .END