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 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