Newsgroups: comp.lang.asm370
Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!caen!hellgate.utah.edu!cs.utah.edu!bytheway
From: bytheway@cs.utah.edu (Sidney Bytheway)
Subject: Re: Time conversion
Date: 9 Apr 91 16:20:16 MDT
Message-ID: <1991Apr9.162017.3541@hellgate.utah.edu>
Sender: Sid Bytheway
Organization: University of Utah CS Dept
References: <9104091932.AA01859@ucbvax.Berkeley.EDU>
Distribution: inet

In article <9104091932.AA01859@ucbvax.Berkeley.EDU> IBM 370 Assembly Programming Discussion List <ASM370@OHSTVMA.BITNET> writes:
>Does anyone know how to convert the SNNTTIME field in dsect
>DFHSNNT to a HHMMSS format that is easily usable for display
>purposes?  I think its in STCK format?
>
>
>                            Paul Myers (zprm@aacc)
>                            Anne Arundel Community College
>                            301-541-2414

The following is a routine we use at the University of Utah to convert
STCK time to a more managable format.  From here you can use CVD and UNPK
to get it into printable form.

-------- example use of dptodcnv ---------
*
MMDDYY	DS	0CL6
MONTH	DS	CL2
DAY	DS	CL2
YEAR	DS	CL2
PWORK	DS	D
SYSDATE	DS	D
STORCLK	DS	0CL32
CLKYY	DS	F
CLKMM	DS	F
CLKDD	DS	F
	DS	5F
*
	STCK	SYSDATE
	LINK	EP=DPTODCNV,PARAM=(SYSDATE,STORCLK),VL=1
	L	R3,CLKMM
	CVD	R3,PWORK
	UNPK	MONTH,PWORK
	OI	MONTH+1,X'F0'
*
-------- example use of dptodcnv ---------


DPTODCNV TITLE 'DPTODCNV - CONVERT TOD CLOCK VALUE'
*
* DPTODCNV - CONVERT TOD CLOCK VALUE.  THIS PROGRAM IS CALLED USING
*            STANDART LINKAGE CONVENTIONS TO CONVERT AN 8-BYTE TIME OF
*            DAY CLOCK VALUE TO YEAR, MONTH, DAY, HOUR, MINUTE, AND
*            MICROSECONDS.
*
*            ON ENTRY, REGISTER 1 HAS THE ADDRESS OF A PARAMETER LIST.
*            THE FIRST WORD OF THE PARAMETER LIST IS THE ADDRESS OF THE
*            8-BYTE TIME OF DAY CLOCK VALUE; THE SECOND WORD HAS THE
*            ADDRESS OF THE 8-WORD RETURN AREA.  THIS PROGRAM WILL SET
*            THE RETURN AREA TO THE VALUES:
*
*              4-BYTE BINARY YEAR (0 = THE YEAR 1900)
*              4-BYTE BINARY MONTH (1 TO 12)
*              4-BYTE BINARY DAY OF MONTH (1 TO 31)
*              4-BYTE BINARY HOUR OF DAY (00 TO 23)
*              4-BYTE BINARY MINUTE OF HOUR (00 TO 59)
*              4-BYTE BINARY MICROSECOND OF MINUTE (00 TO 59999999)
*              4-BYTE BINARY DAY OF WEEK (0 TO 6; 0=SUNDAY)
*              4-BYTE BINARY DAY OF YEAR (1 TO 366)
*
*            ON RETURN, THIS PROGRAM SETS REGISTER 15 TO 0 (TO AVOID
*            SOME PROBLEMS WITH THE COBOL RETURN-CODE REGISTER).
*
*   BY M. QUINLAN - UNIVERSITY OF UTAH
*   
*
         EJECT
DPTODCNV PGMSTART SA=SA,PGMBASE=REG12,PARMREG=REG11
         EJECT
*
* CNVRTTOD - CONVERT THE TOD VALUE.
*
*            THIS CODE IS DERIVED FROM THE "TODEBCD" ROUTINE IN THE
*            DFHXMOLS PROGRAM DISTRIBUTED WITH CICS RELEASE 1.5.
*
CNVRTTOD EQU   *
         L     REG14,0(REG11)      GET ADDRESS OF TOD VALUE
         SPACE 1
* CONVERT TOD VALUE TO DAYS SINCE DAY 0, HOURS IN DAY, MINUTES IN HOUR,
* AND MICROSECONDS IN MINUTE.  DAY 0 IS JAN 1, 1900.
         LM    REG0,REG1,0(REG14)  GET TOD VALUE
         SRDL  REG0,12             CONVERT VALUE TO MICROSECONDS
         D     REG0,=F'60000000'   DIVIDE BY # MICROSEC IN 1 MINUTE
         LR    REG10,REG0          R10=ODD MICROSEC LESS THAN A MINUTE
         SLR   REG0,REG0           CLEAR FOR DIVIDE
         D     REG0,=F'60'         DIVIDE MINUTES BY 60 TO GET HOURS
         LR    REG9,REG0           R9=ODD MINUTES LESS THAN 1 HOUR
         SLR   REG0,REG0           CLEAR FOR DIVIDE
         D     REG0,=F'24'         DIV HRS BY 24 TO GET DYS & ODD HRS
         LR    REG8,REG0           R8=ODD HOURS LESS THAN 1 DAY
         SPACE 1
* REG1 HAS THE NUMBER OF DAYS SINCE DAY 0.
         SPACE 1
* COMPUTE THE DAY OF THE WEEK
         LA    REG3,1(,REG1)       R3=DAY COUNT SINCE SUNDAY LONG PAST
         SLR   REG2,REG2           CLEAR FOR DIVIDE
         D     REG2,=F'7'          R2=DAY OF WEEK (0=SUNDAY -> 6=SAT.)
         ST    REG2,DAYOFWK#       SAVE DAY OF WEEK
         SPACE 1
* NOW COMPUTE THE YEAR NUMBER; REG1 HAS NUMBER OF DAYS SINCE DAY 0.
         SLR   REG7,REG7           ASSUME NOT A LEAP YEAR FOR NOW
         S     REG1,=F'365'        SUBTRACT # OF DAYS IN YR 1900
         BNM   CVTOD010            BRANCH IF YEAR NOT = 1900
* TREAT THE YEAR 1900 AS A SPECIAL CASE
         LA    REG2,365(,REG1)     SET DAY OF YEAR (RELATIVE TO 0)
         SLR   REG5,REG5           SET YEAR = 1900
         B     CVTOD030            GO CALC DAY OF YEAR
* NOT THE YEAR 1900
CVTOD010 EQU   *                   NOT THE YEAR 1900
         SLR   REG0,REG0           CLEAR FOR DIVIDE
         D     REG0,=F'1461'       DIV DYS BY DYS IN 4 YRS ((4*365)+1)
         SLL   REG1,2              MULT BY 4 TO GET YEAR NUMBER
         LA    REG5,1(,REG1)       R5=YRS LESS ODD YRS SINCE 1900
         LR    REG3,REG0           R3=REMAINING DAYS IN 4-YR PERIOD
         SLR   REG2,REG2           CLEAR FOR DIVIDE
         D     REG2,=F'365'        GET # ODD YRS AND # ODD DAYS
         CL    REG3,=F'3'          CHECK FOR LEAP YEAR
         BL    CVTOD020            BRANCH IF NOT A LEAP YEAR
         LA    REG7,1              ADJUST EXTRA DAY REGISTER FOR LEAPYR
         BE    CVTOD020            BRANCH IF NOT LAST DAY OF LEAP YEAR
         BCTR  REG3,0              DECR YEAR TO FORCE IT = 3
         LA    REG2,365            SET FOR LAST DAY OF YR (REL. TO 0)
CVTOD020 EQU   *
         ALR   REG5,REG3           R5 HAS YEARS SINCE 1900
         EJECT
CVTOD030 EQU   *
* R2=DAY OF YEAR (RELATIVE TO ZERO); R7=1 IF LEAP YEAR, 0 OTHERWISE
* COMPUTE THE MONTH AND DAY OF MONTH.  THIS CODE USES SOME MAGIC
* NUMBERS TO FIGURE OUT WHAT THE MONTH AND DAY OF MONTH ARE; IT IS
* COPIES FROM THE DFHXMOLS PROGRAM.
         LA    REG2,1(,REG2)       MAKE DAY OF YR RELATIVE TO 1
         ST    REG2,DAYOFYR        SAVE THE DAY OF THE YEAR
         LA    REG1,59(,REG7)      R1=60 IF LEAPYR; 59 OTHERWISE
         CLR   REG2,REG1           IS THE DATE PAST FEBRUARY?
         BNH   CVTOD040            NO: LET DATE STAND AS IS
         LA    REG2,2(,REG2)       SET FOR NON-LEAPYEAR INITIALLY
         SLR   REG2,REG7           SUBTRACT 1 IF A LEAP YEAR
CVTOD040 EQU   *
         LA    REG3,91(,REG2)      R3=DAY OF YEAR + 91
         LR    REG7,REG3           COPY FOR LATER
         M     REG2,=F'2145'       MAGIC NUMBER
         SRL   REG3,16             DIV BY 65536 TO GET MONTH NUMBER+2
         LR    REG6,REG3           R6=MONTH NUMBER + 2
         S     REG6,=F'2'          R6=MONTH NUMBER
         M     REG2,=F'1955'       ANOTHER MAGIC NUMBER
         SRL   REG3,6              DIV BY 64 GET TOT DYS IN PAST MON+91
         SLR   REG7,REG3           R7 = DAY OF MONTH
         EJECT
*
* REG5     = YEAR NUMBER            (0 = 1900)
* REG6     = MONTH NUMBER           (1 TO 12)
* REG7     = DAY OF MONTH           (1 TO 31)
* REG8     = HOUR OF DAY            (0 TO 23)
* REG9     = MINUTE OF HOUR         (0 TO 59)
* REG10    = MICROSECONDS OF MINUTE (0 TO 59999999)
* DAYOFWK# = DAY OF WEEK            (0 TO 6; 0=SUNDAY)
* DAYOFYR  = DAY OF YEAR            (1 TO 366)
*
         SPACE 1
* RETURN THE TIME VALUES TO THE CALLER
         L     REG1,4(,REG11)      GET RETURN AREA ADDRESS
         STM   REG5,REG10,0(REG1)  SET RETURN AREA VALUES
         MVC   24(4,REG1),DAYOFWK# RETURN DAY OF WEEK VALUE
         MVC   28(4,REG1),DAYOFYR  RETURN DAY OF YEAR VALUE
         SPACE 1
* RETURN TO THE CALLER
         L     REG13,4(,REG13)     RESTORE OLD SAVE AREA
         RETURN (14,12),RC=0       RETURN TO THE CALLER
         EJECT
*
* DATA AREAS
*
         LTORG
SA       DC    9D'0'
DAYOFWK# DC    F'-1'
DAYOFYR  DC    F'-1'
         END
