++APAR(ASX3019). /* IMPACT: CRITICAL ----------------------------------- COPYRIGHT AUSTRALIAN SYSTEMS ENGINEERING PTY. LTD. 1998. ASY3019 980529 65SCBK BH LTXFV2 V203 ABS0C4 LTX2WORK 980529 PMD Abend S0C4 when notification exit is called if GMT date is 31st December 2000. _PROBLEM DESCRIPTION: An abend S0C4 occurs when the notification exit is called if the date is 31st December 2000. _PROBLEM SUMMARY: USERS AFFECTED: All The BLDT routine is called to convert a TOD clock value into a date/time string. This routine incorrectly determines that year 2000 is not a leap year. This incorrect calculation causes a loop to occur and a subsequent S0C4 abend. _PROBLEM CONCLUSION RECOMMENDATION: Apply APAR fix ASX3019 The BLDT routine will be changed to determine that year 2000 is a leap year. _INSTALLATION NOTES: This apar replaces the LTXFBLDT macro. Your LTX2WORK module must be re-assembled and link edited after you have applied this fix. Refer to members LTXFPARM and LTX2WORK in the install library. As this APAR changes the LTXF SVC an IPL with a CLPA or a MLPA of module LTX2SVC ( and IGC00... (change ... to SVC module name) if it is an alias of LTX2SVC) will be required to implement this fix. NEED FURTHER HELP? CALL ASE FOR ASSISTANCE. */ ++VER(Z038) FMID(ASEL203) PRE(ASZ2988). ++HOLD(ASX3019) SYSTEM FMID(ASEL203) REASON(ACTION) COMMENT(LTX2WORK must be re-assembled after applying this apar. See coverletter for more details. An IPL or MLPA is required to activate this fix.). ++ZAP(LTX2SVC). NAME LTX2SVC IDRDATA ASX3019 VER 1046 4780B04E REP 1046 4700B04E ++MAC(LTXFBLDT). MACRO &NAME LTXFBLDT &DWD=CVDDWD,&BASED=,&PROC=NO *---------------------------------------------------------------------- * BUILD YYYYMMDD HHMMSS DAY STRG FROM TOD CLK * * INPUT : IF &OMCSDATE IS SET TO 'Y2K' * : IF R1 IS +VE :- * - R1->19-BYTE AREA FOR OUTPUT TO BE BUILT IN * - R0=TOD CLK H.O. FULLWORD * : IF R1 IS -VE :- * - COMPLEMENT OF R1 -> 19-BYTE AREA * - R0=OFFSET IN SECONDS INTO 20TH CENTURY (UNSIGNED) * ELSE * : IF R1 IS +VE :- * - R1->17-BYTE AREA FOR OUTPUT TO BE BUILT IN * - R0=TOD CLK H.O. FULLWORD * : IF R1 IS -VE :- * - COMPLEMENT OF R1 -> 17-BYTE AREA * - R0=OFFSET IN SECONDS INTO 20TH CENTURY (UNSIGNED) * * WARNG : ONLY ACCURATE TO NEAREST 1 SECOND * * HISTORY: * 931028 PMD CHANGED CONVERSION OF TOD CLOCK UNITS TO SECONDS * TO PREVENT OVERFLOW WHEN TOD IS CLOSE TO X'FFFFFFFF' * 961218 PMD YEAR 2000 IS A LEAP YEAR * 970527 PMD YEAR 2000 COMPLIANCE * 970826 PMD SUPPORT FOR $PROC * 971114 PMD CORRECT ROUNDING ERRORS DUE TO SUBTRACTING 19800101 * 971203 PMD SUPPORT FOR $PROC2 *---------------------------------------------------------------------- GBLC &OMCSDATE GBLC &PROCNDX AIF ('&OMCSDATE' EQ 'Y2K').C &YYLEN SETC '2' &MMOFF SETC '2' &DDOFF SETC '4' &HHOFF SETC '7' &MINOFF SETC '9' &SSOFF SETC '11' &DAYOFF SETC '14' AGO .A .C ANOP &YYLEN SETC '4' &MMOFF SETC '4' &DDOFF SETC '6' &HHOFF SETC '9' &MINOFF SETC '11' &SSOFF SETC '13' &DAYOFF SETC '16' .A ANOP AIF ('&PROC' NE 'YES').E &NAME $PROC LOCAL=(BLDTDWD:D) &ADWD SETC 'BLDTDWD' AGO .F .E ANOP AIF ('&PROC' NE '2').ED &NAME $PROC2 LOCAL=(BLDTDWD:D) &ADWD SETC 'BLDTDWD' AGO .F .ED ANOP &NAME LTXFNTRY LVL=*,BASED=&BASED &ADWD SETC '&DWD' .F ANOP XR R5,R5 ** ------------------- CHK INPUT LR R4,R1 R4->17-BYTE OUTPUT AREA LTR R4,R4 R4 -VE? BNM &NAME.B NO-> LCR R4,R4 YES,R4->OUTPUT AREA LR R1,R0 AND R0 CONTAINS SECONDS B &NAME.C ** ------------------- CONVERT TOD CLK UNITS -> SECONDS &NAME.B SL R0,&NAME.U CALC OFFSET FROM BASE TIME XR R5,R5 DAYS TO ADD TO CALCULATION XR R14,R14 REMAINDER CL R0,=X'8F809FD4' IS TIME GREATER THAN 19800101 BL &NAME.BD NO -> L R5,=X'00007223' DAYS TO ADD TO CALCULATION SL R0,=X'8F809FD4' ADJUST TOD CLOCK VALUE L R14,=X'0006F000' REMAINDER= 454656/500000 OF A SECOND &NAME.BD LR R1,R0 # OF 1.048576 SEC UNITS SR R0,R0 LR R15,R1 SLL R15,31 DROP ALL BUT L.O. BIT SRL R15,31 SRL R1,1 DIVIDE BY 2 M R0,=F'1048576' CONVERT TODUNITS->2-SEC UNITS D R0,=F'1000000' GET REM IN R0 SLL R1,1 CONVERT 2-SEC UNITS TO SECONDS ALR R1,R15 ADD IN A POSSIBLE 1.048576 SEC AS 1 SEC AR R0,R14 ADD PREVIOUS REMAINDER C R0,=F'500000' WAS REMAINDER LARGE ENUF TO ADD ANOTHER? BL &NAME.C NO-> AL R1,=F'1' YES, ADD ANOTHER SECOND C R0,=F'1000000' WAS REMAINDER LARGE ENUF TO TWO SECONDS ? BL &NAME.C NO-> AL R1,=F'1' YES, ADD ANOTHER SECOND C R0,=F'1500000' WAS REMAINDER LARGE ENUF TO 3 SECONDS ? BL &NAME.C NO-> AL R1,=F'1' YES, ADD ANOTHER SECOND ** ------------------- CALC DAYS &NAME.C SR R0,R0 D R0,=F'86400' GET # ELAPSED DAYS IN R1 SH R1,=H'365' DEDUCT THE YEAR 1900 (NOT IN 20TH CENT) ALR R1,R5 ADD DAYS TO 19800101 IF REQUIRED LR R2,R1 SAVE # ELAPSED DAYS IN 20TH CENT ** ------------------- CALC HHMMSS ELAPSED IN CURR DAY LR R1,R0 SR R0,R0 D R0,=F'3600' GET HH IN R1 CVD R1,&ADWD OI &ADWD+7,15 UNPK &HHOFF.(2,R4),&ADWD HH LR R1,R0 SR R0,R0 D R0,=F'60' GET MM IN R1 CVD R1,&ADWD OI &ADWD+7,15 UNPK &MINOFF.(2,R4),&ADWD MM CVD R0,&ADWD SS OI &ADWD+7,15 UNPK &SSOFF.(2,R4),&ADWD SS ** ------------------- CALC YYMMDD LR R1,R2 # ELAPSED DAYS IN 20TH CENTURY SR R0,R0 D R0,=F'1461' R1=#PRIOR QUADYEARS, R0=#PRIOR DAYS 0-1460 MH R1,=H'4' CALC PRECEEDING YEARS DUE QUADYEARS @0416 LA R3,=AL2(365,365,365,366) &NAME.D CH R0,0(R3) IS THERE ONE WHOLE YEAR IN REMAINING DAYS? BL &NAME.F NO-> SH R0,0(R3) YES, DISCOUNT THE REMAINING DAYS LA R1,1(R1) AND INCREMENT THE PRECEEDING YEARS LA R3,2(R3) BUMP -> DAYS-IN-YEAR B &NAME.D LOOP-> &NAME.F LA R1,1901(R1) CONVERT YY=0,1,2,.. -> 1901,1902,1903 LR R5,R1 SAVE YYYY (1901,1902,..1999,2000,..) CVD R1,&ADWD OI &ADWD+7,15 UNPK 0(&YYLEN,R4),&ADWD LA R3,&NAME.V CALC MMDD LA R1,1 MONTH NUMBER STARTS AT 01 &NAME.H LH R15,0(R3) #DAYS IN MTH CH R15,=H'28' FEB? BNE &NAME.J NO-> LR R14,R5 R14=01,02,03,...99,100,101,102,... SLL R14,30 SHIFT OUT ALL BUT 2 L.O. BITS OF YY LTR R14,R14 YY A MULT OF 4? BNZ &NAME.J NO-> LA R15,1(R15) YES,FEB HAS 29 DAYS THEN &NAME.J CR R0,R15 #DAYS LEFT<#IN MTH? BL &NAME.L YES-> SLR R0,R15 ADJUST FOR MTH LA R1,1(R1) BUMP MM LA R3,2(R3) B &NAME.H LOOP-> &NAME.L CVD R1,&ADWD OI &ADWD+7,15 UNPK &MMOFF.(2,R4),&ADWD AH R0,=H'1' ADJUST DAYS OFFSET TO DAY NUMBER IN MTH CVD R0,&ADWD OI &ADWD+7,15 UNPK &DDOFF.(2,R4),&ADWD ** ------------------- CALC DAYNAME LR R1,R2 SR R0,R0 D R0,=F'7' MH R0,=H'3' LR R1,R0 LA R1,&NAME.W(R1) MVC &DAYOFF.(3,R4),0(R1) MVI &HHOFF-1(R4),C'-' MVI &DAYOFF-1(R4),C'-' ** ------------------- RETURN AIF ('&PROC' NE 'YES').W &NAME.X $RETURN AGO .X .W AIF ('&PROC' NE '2').WD &NAME.X $RETURN2 AGO .X .WD ANOP &NAME.X LM R14,R12,12(R13) BR R14 .X ANOP ** ------------------- LITERALS &NAME.U DC F'0' TOD BASE VALUE FOR 19000101-000000 &NAME.V DC AL2(31,28,31,30,31,30,31,31,30,31,30,31) &NAME.W DC C'TUEWEDTHUFRISATSUNMON' MEND