*
*       FORTRAN subroutine to return the date in three INTEGER*4 variables
*
*       Calling Sequence:       CALL DATE(MM,DD,YY)
*
*
*       AmigaDOS returns the number of days since 01/01/78. The system
*       date is extracted using a translation of the following julian
*       routine:
*
*               n  = days+28431
*               ny = (4*n-1)/1461
*               nd = (4*n+3-1461*ny)/4
*               nm = (5*nd-3)/153
*               nd = (5*nd+2-153*nm)/5
*               if (nm>=10) goto 2
*               nm = nm+3
*               goto 3
*       2       nm = nm-9
*               ny = ny+1
*       3       continue
*
*
* Edit history:
*
*  20 Feb 86    file created                                            PAJ
*

DATESTAMP EQU -192


DATE:   MOVEM.L A0/A6,-(A7)
        MOVEA.L -20(A0),A6              * pointer to "dos.library"
        SUBA.W  #12,A7                  * allocate a buffer for return values
        MOVE.L  A7,D1                   * set pointer to buffer
        JSR     DATESTAMP(A6)           * fill the buffer
        MOVE.L  (A7)+,D1                * load number of days
        ADDQ.W  #8,A7                   * skip minutes and ticks
        MOVEM.L (A7)+,A0/A6

*
* - register assignments
*
*  D0 = nm
*  D1 = nd
*  D2 = ny
*

        ADDI.L  #28431,D1               * time+28431
        LSL.L   #2,D1
        MOVE.L  D1,D2
        SUBQ.L  #1,D2
        DIVU    #1461,D2
        ANDI.L  #$0000FFFF,D2
        ADDQ.L  #3,D1
        MOVE.L  D2,D4
        MULU    #1461,D4
        SUB.L   D4,D1
        LSR.L   #2,D1
        MOVE.L  D1,D4
        LSL.L   #2,D1
        ADD.L   D4,D1                   * 5*nd
        MOVE.L  D1,D0
        SUBQ.L  #3,D0
        DIVU    #153,D0
        ANDI.L  #$0000FFFF,D0
        ADDQ.L  #2,D1
        MOVE.L  D0,D4
        MULU    #153,D4
        SUB.L   D4,D1
        DIVU    #5,D1
        ANDI.L  #$0000FFFF,D1
        CMPI.L  #10,D0
        BGE.S   L1
        ADDQ.L  #3,D0                   * nm = nm+3
        BRA.S   L2                      * goto 3
L1:     SUBI.L  #9,D0                   * nm = nm-9
        ADDQ.L  #1,D2                   * ny = ny+1

*
* - set return values
*

L2:     MOVEA.L 12(A7),A1               * address of mm
        MOVE.L  D0,(A1)
        MOVEA.L 8(A7),A1                * address of dd
        MOVE.L  D1,(A1)
        MOVEA.L 4(A7),A1                * address of yy
        MOVE.L  D2,(A1)
        RTS

        END
