TITLE 'RE-ENTRANT   GREGORIAN(YYYMMDDS)->JULIAN(0YYYDDDS)DATE'
*---------------------------------------------------------------------*
*        CALL  GREGJUL,(GDATE,JDATE)  1020710C->0102191C
*        LTR   15,15               Q,GOOD DATE CONVERSION?
*        BNZ   ERRDATE              N,HANDLE ERROR DATE.
*---------------------------------------------------------------------*
         SPACE 2
GREGJUL  CSECT ,                                              1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    4,5,0(1)            LOAD CALLER INPUT/OUTPUT PARMS.
         UNPK  GREGDT,0(4,4)       SAVE/UNPACK INPUT GREG DATE.
         PACK  DWORK,GREGYY
         CVB   4,DWORK             R4 NOW 0000YYY.
         LA    2,=Y(0,31,59,90,120,151,181,212,243,273,304,334,365)
         LTR   3,4                 Q,YEAR ZERO(1900)?
         BZ    GREG200              Y,365 DAYS CORRECT.
         N     3,=A(3)             Q,LEAP YEAR(366 DAY)?
         BNZ   GREG200              N,MUST BE 365 DAY YEAR.
         LA    2,=Y(0,31,60,91,121,152,182,213,244,274,305,335,366)
GREG200  DS    0H
         MH    4,=Y(1000)          R4/FROM 0000YYY TO 0YYY000.
         PACK  DWORK,GREGMM
         CVB   3,DWORK             R3 NOW 00000MM.
         LTR   3,3                 Q,POSITIVE(VALID) GREG-MONTH?
         BNP   GREG300              N,EXIT,INVALID GREG MONTH.
         CH    3,=Y(12)            Q,GREG-MONTH > 12?
         BH    GREG300              Y,EXIT,INVALID GREG MONTH.
         BCTR  3,0                 R3 NOW 0-11.
         AR    3,3                 R3 NOW 0-22.
         AR    3,2                 R3 NOW CORRECT MONTH ENTRY.
         PACK  DWORK,GREGDD
         CVB   2,DWORK             R2 NOW 00000DD.
         LTR   2,2                 Q,POSITIVE(VALID) GREG-DAY?
         BNP   GREG300              N,EXIT,INVALID GREG-DAY.
         AH    2,0(,3)             GREGDD PLUS PREV MONTHS DAYS.
         CH    2,2(,3)             Q,GREGDD > END OF MONTH?
         BH    GREG300              Y,EXIT, INVALID GREG-DAY.
         AR    2,4                 R2=0YYYDDD=0YYY000+0000DDD.
         CVD   2,DWORK             DWORK NOW 000000000YYYDDDS.
         MVC   0(4,5),JDATE        MOVE JDATE TO CALLER OUTPUT.
         XR    15,15               RETURN CODE: GOOD CONVERSION.
GREG300  DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
         LTORG
*
SAVREGS  DSECT
         DS    0D,18A              CALLER SAVEREGS.
DWORK    DS    0D,4X
JDATE    DS    PL4                 0YYYDDDS (OUTPUT JULIAN DATE)
GREGDT   DS    0CL7                YYYMMDD (INPUT GREGORIAN DATE)
GREGYY   DS    CL3                 YYY
GREGMM   DS    CL2                    MM
GREGDD   DS    CL2                      DD
*
         END




         TITLE 'RE-ENTRANT    JULIAN(0YYYDDDS)->GREGORIAN(YYYMMDDS)DATE'
*---------------------------------------------------------------------*
*        CALL  JULGREG,(JDATE,GDATE)  0100366C->1001231C
*        LTR   15,15               Q,GOOD DATE CONVERSION?
*        BNZ   ERRDATE              N,HANDLE ERROR DATE.
*---------------------------------------------------------------------*
         SPACE 2
JULGREG  CSECT ,                   RE-ENTRANT                 1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    4,5,0(1)            LOAD CALLER INPUT/OUTPUT PARMS.
         UNPK  JULDTE,0(4,4)       UNPACK INPUT JULIAN DATE.
         PACK  DWORK,JULYYY
         CVB   3,DWORK             R3 NOW 0000YYY.
         LA    2,=Y(0,31,59,90,120,151,181,212,243,273,304,334,365)
         LTR   1,3                 Q,YEAR ZERO(1900)?
         BZ    JUL200               Y,1900 NOT A LEAP YEAR.
         N     1,=A(3)             Q,LEAP YEAR(366 DAYS)?
         BNZ   JUL200               N,365 DAY YEAR CORRECT.
         LA    2,=Y(0,31,60,91,121,152,182,213,244,274,305,335,366)
JUL200   DS    0H
         PACK  DWORK,JULDDD
         CVB   4,DWORK             R4 NOW 0000DDD.
         CH    4,24(,2)            Q,JULIAN DAY > EOY(365/366)?
         BH    JUL400               Y,EXIT, ERROR JULIAN DAY.
         LTR   1,4                 LOAD/TEST JULIAN DAY.
         BNP   JUL400              EXIT, ERROR JULIAN DAY.
         SRL   1,5                 DIV BY 32; R1 NOW 0-11.
         LR    0,1                 R0 NOW 0-11.
         AR    0,0                 R0 NOW 0-22.
         AR    2,0                 R2=CORRECT TABLE ENTRY, MAYBE.
         LA    1,1(,1)             R1=CORRECT MONTH, MAYBE.
         CH    4,2(,2)             Q,JULIAN DAY > NEXT ENTRY.
         BNH   JUL300               N,R1/R2 CORRECT MONTH/ENTRY.
         LA    1,1(,1)             R1 NOW CORRECT MONTH(1-12).
         LA    2,2(,2)             R2 NOW CORRECT ENTRY.
JUL300   DS    0H
         SH    4,0(,2)             R4 NOW CORRECT GREG DAY.
         MH    1,=Y(100)           R1/FROM 00000MM TO 000MM00.
         AR    1,4                 R1=000MMDD = 000MM00 + 00000DD.
         MH    3,=Y(10000)         R3 FROM 0000YYY TO YYY0000.
         AR    3,1                 R3=YYYMMDD = YYY0000 + 000MMDD.
         CVD   3,DWORK             DWORK NOW 00000000YYYMMDDC.
         MVC   0(4,5),GDATE        MOVE GDATE TO CALLER OUTPUT.
         XR    15,15               RETURN CODE: GOOD CONVERSION.
JUL400   DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
         LTORG
*
SAVREGS  DSECT
         DS    0D,18A              USER SAVEREGS.
DWORK    DS    0D,4X
GDATE    DS    PL4                 YYYMMDDS
JULDTE   DS    0CL6                YYYDDD
JULYYY   DS    CL3                 YYY
JULDDD   DS    CL3                    DDD
*
         END




         TITLE 'RE-ENTRANT  PERPETUAL(DDDDDS)DATE->GREGORIAN(YYYMMDDS)'
*---------------------------------------------------------------------*
*        CALL PERPGREG,(PDATE,GDATE)  36525C=>1001231C
*        LTR  15,15                Q,GOOD DATE CONVERSION?
*        BNZ  ERRDATE               N,HANDLE ERROR INPUT DATE.
*---------------------------------------------------------------------*
         SPACE 2
PERPGREG CSECT ,                   RE-ENTRANT                 1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    4,5,0(1)            LOAD CALLER INPUT/OUTPUT PARMS.
         ZAP   DWORK,0(3,4)        MOVE/TEST INPUT PERP-DATE.
         BNP   PERP500             EXIT, INVALID INPUT PERP-DATE.
         CVB   4,DWORK             R4 NOW BINARY PERPETUAL DATE.
         LR    3,4                 R3=R4
         XR    2,2                 NEEDED FOR NEXT INSTR.
         D     2,=A(365)           R3 PROBABLY GOOD WORK YEAR.
         LR    1,3                 R1=R3
         SRL   1,2                 R1 NUMBER OF LEAP YEAR DAYS.
         CR    1,2                 Q,LEAP YEAR DAYS < REMAINDER?
         BL    PERP200              Y,R3 GOOD WORK YEAR.
         BCTR  3,0                  N,R3 NOW GOOD WORK YEAR.
PERP200  DS    0H
         LR    2,3                 NEEDED FOR LEAP YEAR DAYS CALC.
         LR    1,3                 NEEDED BY NEXT INSTR(MH).
         M     0,=A(365)           R1 NOW DAYS W/O LEAP YEAR DAYS.
         SRL   2,2                 R2 NOW CORRECT LEAP YEAR DAYS.
         AR    2,1                 R2 NOW DAYS IN PREV-YEARS.
         SR    4,2                 R4 NOW CURRENT YEAR DAYS.
         LA    3,1(,3)             R3 NOW CURRENT OUTPUT GREG-YEAR.
         LA    0,=Y(0,31,59,90,120,151,181,212,243,273,304,334,365)
         LR    2,3                 NEEDED FOR YEAR YEAR TEST.
         N     2,=A(3)             Q,A LEAP YEAR?
         BNZ   PERP300              N,ASSUMPTION CORRECT.
         LA    0,=Y(0,31,60,91,121,152,182,213,244,274,305,335,366)
PERP300  DS    0H
         LR    2,4                 MOVE DAYS IN CURRENT YEAR.
         SRL   2,5                 DIVIDE BY 32; R2 NOW 0-11.
         LR    1,2                 R1 NOW 0-11.
         AR    1,1                 R1 NOW 0-22.
         AR    1,0                 R1 MAYBE CORRECT MONTH ENTRY.
         LA    2,1(,2)             R2 MAYBE CORRECT MONTH(1-12).
         CH    4,2(,1)             Q,CORRECT MONTH ENTRY?
         BNH   PERP400              Y,SKIP ADJUSTMENT.
         LA    1,2(,1)             R1 NOW CORRECT MONTH(1-12).
         LA    2,1(,2)             R2 NOW CORRECT GREG-MONTH.
PERP400  DS    0H
         SH    4,0(,1)             R4 NOW OUTPUT GREG DAY(00000DD).
         MH    3,=Y(10000)         R3/FROM 0000YYY TO YYY0000.
         MH    2,=Y(100)           R2/FROM 00000MM TO 000MM00.
         AR    2,3                 R2 NOW YYYMM00.
         AR    2,4                 R2 NOW YYYMMDD.
         CVD   2,DWORK             DWORK NOW 00000000YYYMMDDS.
         MVC   0(4,5),GDATE        MOVE GDATE TO CALLER OUTPUT.
         XR    15,15               RETURN CODE: GOOD CONVERSION.
PERP500  DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
         LTORG
*
SAVREGS  DSECT
         DS    0D,18A              USER SAVEREGS.
DWORK    DS    0D,4X
GDATE    DS    PL4                 YYYMMDDS
*
         END




         TITLE 'RE-ENTRANT  GREGORIAN(YYYMMDDS)->PERPETUAL(DDDDDS)DATE'
*---------------------------------------------------------------------*
*        CALL GREGPERP,(GDATE,PDATE)  1001231C->36525C
*        LTR  15,15                Q,GOOD DATE CONVERSION?
*        BNZ  ERRDATE               N,HANDLE ERROR DATE.
*---------------------------------------------------------------------*
         SPACE 2
GREGPERP CSECT ,                   RE-ENTRANT                 1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    4,5,0(1)            LOAD CALLER INPUT/OUTPUT PARMS.
         UNPK  GREGDT,0(4,4)       SAVE/UNPACK INPUT GREG-DATE.
         PACK  DWORK,GREGYY        PACK INPUT GREG YEAR.
         CVB   4,DWORK             R4 NOW 00000YYY.
         LTR   3,4                 Q,YEAR ZERO(1900)?
         BZ    GREG300              Y,EXIT; INVALID GREG-YEAR.
         LA    2,=Y(0,31,59,90,120,151,181,212,243,273,304,334,365)
         N     3,=A(3)             Q,A LEAP YEAR(366 DAYS)?
         BNZ   GREG200              N,MUST BE 365 DAY YEAR.
         LA    2,=Y(0,31,60,91,121,152,182,213,244,274,305,335,366)
GREG200  DS    0H
         PACK  DWORK,GREGMM        PACK INPUT GREGDATE MONTH.
         CVB   3,DWORK             R3 NOW BINARY GREG MONTH.
         LTR   3,3                 Q,POSITIVE GREG MONTH?
         BNP   GREG300              N,EXIT; INVALID INPUT GREGDATE.
         CH    3,=Y(12)            Q,INPUT GREGDATE MONTH > 12 ?
         BH    GREG300              Y,EXIT; INVALID GREGDATE MONTH.
         BCTR  3,0                 R3 NOW 0-11.
         AR    3,3                 R3 NOW 0-22.
         AR    3,2                 R3 NOW CORRECT MONTH-TBL ENTRY.
         PACK  DWORK,GREGDD        PACK INPUT GREGDATE DAY.
         CVB   2,DWORK
         LTR   2,2                 Q,POSITIVE INPUT GREG DAY?
         BNP   GREG300              N,EXIT; INVALID INPUT GREG DAY.
         AH    2,0(,3)             PREV MONTH DAYS TO GREG DAY.
         CH    2,2(,3)             Q,GREG DAY > END OF MONTH ?
         BH    GREG300              Y,EXIT; INVALID GREG DAY.
         BCTR  4,0                 DECREMENT BY 1 INPUT GREG YEAR.
         LR    3,4                 R3=R4.
         SRL   3,2                 R3 NOW LEAP YEAR DAYS.
         MH    4,=Y(365)           R4 DAYS IN PREV YRS LESS LEAP.
         AR    4,3                 R4 NOW DAYS IN PREV YEARS.
         AR    4,2                 R4 NOW BINARY PERPETUAL DATE.
         CVD   4,DWORK             DWORK NOW 0000000000DDDDDS.
         MVC   0(3,5),PDATE        MOVE PDATE TO CALLER OUTPUT.
         XR    15,15               RETURN CODE: GOOD CONVERSION.
GREG300  DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
SAVREGS  DSECT
         DS    0D,18A              USER SAVEREGS.
DWORK    DS    0D,5X
PDATE    DS    PL3                 DDDDDS
GREGDT   DS    0CL7                YYYMMDD
GREGYY   DS    CL3                 YYY
GREGMM   DS    CL2                    MM
GREGDD   DS    CL2                      DD

         END




         TITLE 'RE-ENTRANT   PERPETUAL(DDDDDS) TO JULIAN(0YYYDDDS)DATE'
*---------------------------------------------------------------------*
*        CALL  PERPJUL,(PDATE,JDATE)  36525C->0100366C
*        LTR   15,15               Q,GOOD DATE CONVERSION?
*        BNZ   ERRDATE              N,HANDLE ERROR DATE.
*---------------------------------------------------------------------*
         SPACE 2
PERPJUL  CSECT ,                   RE-ENTRANT                 1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    4,5,0(1)            LOAD CALLER INPUT/OUTPUT ADDRS.
         ZAP   DWORK,0(3,4)        MOVE/TEST INPUT PERPETUAL DATE.
         BNP   PERP300             EXIT, BAD INPUT PERPETUAL DATE.
         CVB   4,DWORK             R4 NOW BINARY PERPETUAL DATE.
         LR    3,4                 R3=R4.
         XR    2,2                 NEEDED FOR NEXT INSTR.
         D     2,=A(365)           R3 NOW PROBABLY GOOD WORK YEAR.
         LR    1,3                 R1=R3.
         SRL   1,2                 DIV BY 4; R1 NOW LEAP YEAR DAYS.
         CR    1,2                 Q,LEAP YEAR DAYS < REMAINDER?
         BL    PERP200              Y,R3 GOOD WORK YEAR.
         BCTR  3,0                  N,R3 NOW GOOD WORK YEAR.
PERP200  DS    0H
         LR    2,3                 R2=R3.
         LR    1,3                 R1=R3.
         M     0,=A(365)           R1=PREV YRS DAYS,W/O LEAP DAYS.
         SRL   2,2                 R2 NOW PREV LEAP YEAR DAYS.
         AR    2,1                 R2 NOW PREV YEARS DAYS.
         SR    4,2                 R4 NOW DAYS IN CURRENT YEAR.
         LA    3,1(,3)             R3 NOW CORRECT OUTPUT JUL-YEAR.
         MH    3,=Y(1000)          R3 FROM 0000YYY TO 0YYY000.
         AR    3,4                 R3 NOW 0YYYDDD=0YYY000+0000DDD.
         CVD   3,DWORK             DWORK NOW 000000000YYYDDDS.
         MVC   0(4,5),JDATE        MOVE JDATE TO CALLER OUTPUT.
         XR    15,15               RETURN CODE: GOOD CONVERSION.
PERP300  DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
         LTORG
*
SAVREGS  DSECT
         DS    0D,18A              CALLER SAVEREGS.
DWORK    DS    0D,4X
JDATE    DS    PL4                 0YYYDDDS
*
         END



         TITLE 'RE-ENTRANT   JULIAN(0YYYDDDS) TO PERPETUAL(DDDDDS)DATE'
*---------------------------------------------------------------------*
*        CALL  JULPERP,(JDATE,PDATE)  0100366C->36525C
*        LTR   15,15               Q,GOOD DATE CONVERSION?
*        BNZ   ERRDATE              N,HANDLE ERROR DATE.
*---------------------------------------------------------------------*
         SPACE 2
JULPERP  CSECT ,                   RE-ENTRANT                 1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    2,3,0(1)            LOAD CALLER INPUT/OUTPUT PARMS.
         UNPK  JULDTE,0(4,2)       JULDTE NOW CHARACTERS(YYYDDD).
         PACK  DWORK,JULYYY        PACK INPUT JULIAN YEAR.
         CVB   6,DWORK             R6 NOW 00000YYY.
         LTR   4,6                 TEST/MOVE INPUT JULIAN YEAR.
         BNP   JUL300              EXIT, IF BAD INPUT JUL-YEAR.
         BCTR  6,0                 R6/JULIAN YEAR LESS ONE.
         LR    5,6                 R5=R6.
         SRL   5,2                 DIV BY 4; R5=LEAP YEAR DAYS.
         MH    6,=Y(365)           R6 DAYS IN PREV YEARS.
         AR    6,5                 PLUS PREV LEAP YEAR DAYS.
         LA    5,365               ASSUMES NOT LEAP YEAR(365 DAYS).
         N     4,=A(3)             Q,A LEAP YEAR?
         BNZ   JUL200               N,365 DAY YEAR.
         LA    5,366                Y,366 DAY YEAR.
JUL200   DS    0H
         PACK  DWORK,JULDDD        PACK INPUT JULIAN DAY.
         CVB   4,DWORK
         LTR   4,4                 Q,POSITIVE INPUT JULIAN DAY.
         BNP   JUL300               N,EXIT, INVALID INPUT JUL-DAY.
         CR    4,5                 Q,DAYS > EOY (365/366)?
         BH    JUL300               Y,EXIT, INVALID INPUT JUL-DAY.
         AR    4,6                 R4 NOW BINARY PERPETUAL DATE.
         CVD   4,DWORK
         MVC   0(3,3),PDATE        MOVES PDATE TO CALLER OUTPUT.
         XR    15,15               RETURN CODE: GOOD CONVERSION.
JUL300   DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
         LTORG
*
SAVREGS  DSECT
         DS    0D,18A              USER SAVEREGS.
DWORK    DS    0D,5X
PDATE    DS    PL3
JULDTE   DS    0CL6                YYYDDD
JULYYY   DS    CL3                 YYY
JULDDD   DS    CL3                    DDD
*
         END




         TITLE 'RE-ENTRANT               PERPETUAL DATE TO DAY OF WEEK'
*---------------------------------------------------------------------*
*        CALL  PERPDOW,(PDATE,DAYOFWEEK)
*        LTR   15,15               Q,GOOD DAY OF WEEK?
*        BNZ   ERRDATE              N,BAD INPUT PERP-DATE.
*---------------------------------------------------------------------*
         SPACE 2
PERPDOW  CSECT ,                   RE-ENTRANT                 1994ESOTO
         STM   14,12,12(13)        SAVE CALLER REGISTERS.
         BALR  15,0                ESTABLISH ADDRESSABILITY.
         USING *,15
         USING SAVREGS,13          CALLER RE-ENTRANT WORK AREA.
         LM    3,4,0(1)            LOAD CALLER INPUT/OUTPUT PARMS.
         ZAP   DWORK,0(3,3)        MOVE/TEST INPUT PERP-DATE.
         BNP   PERP200             EXIT, ZERO/NEGATIVE INPUT DATE.
         CVB   3,DWORK             PACKED DECIMAL TO BINARY.
         XR    2,2                 NEEDED FOR NEXT(DIVIDE) INSTR.
         D     2,=A(7)             R2 NOW 0-6 (MON-SUN).
         MH    2,=Y(3)             R2 NOW 0-18 (MON-SUN).
         LA    2,DOWTBL(2)         R2 NOW POINTS TO DAY OF WEEK.
         MVC   0(3,4),0(2)         MOVE DAY OF WEEK TO OUTPUT ADR.
         XR    15,15               RETURN CODE: GOOD.
PERP200  DS    0H
         LM    0,12,20(13)         RESTORE CALLER REGISTERS.
         BR    14                  RETURN TO CALLER CONTROL.
*
         LTORG
*                 0  1  2  3  4  5  6
DOWTBL   DC    C'MONTUEWEDTHUFRISATSUN'
*
SAVREGS  DSECT
         DS    0D,18A              CALLER SAVEREGS.
DWORK    DS    D                   CALLER RE-ENTRANT WORK AREA
*
         END

© Copyright Edward Soto & IT Doctors.co.uk. 2003