//MARKA JOB (0),'ASSEMBLE',CLASS=A,MSGCLASS=T //* //* GLOBALLY CHANGE MARK.LIB.LOAD TO A LOAD MODULE LIBRARY //* YOU WANT TO ASSEMBLE INTO. //* //ASMLKD EXEC ASMFCL,MAC='SYS1.AMODGEN',MAC1='MVSSRC.SYM101.F01', // PARM.ASM='OBJECT,NODECK,TERM,XREF(SHORT)', // PARM.LKED='LIST,MAP,NCAL,AC=0' //ASM.SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB // DD DISP=SHR,DSN=SYS1.AMODGEN // DD DISP=SHR,DSN=MARK.PROD.LIB.MACROS.ASM //ASM.SYSIN DD * TITLE ' A S K O P E R ' *********************************************************************** * * * 'ASKOPER' * * * * ORIGIONAL SOURCE: CBT249 OVERFLOW TAPE FILE131, MEMBER ASKOPER * * CBT TAPES ARE AVAILABLE AT HTTP://WWW.CBTTAPE.ORG * * * * MODIFICATIONS I HAVE MADE - SPECIFICALLY FOR MY USE, THEY MAY NOT * * BE USEFUL TO YOU, IN WHICH CASE USE THE CBT FILE. * * (1) INSERTED A NEW PARM1 VALUE THAT IS THE NUMBER OF MINUTES * * THE WTOR WILL REMAIN OUTSTANDING BEFORE IT DEFAULTS TO * * OPTION TWO (TIMEOUT/DEFAULT NEEDED FOR LIGHTS OUT). * * - IF PARM1 IS NOT PROVIDED DEFAULT TO 10 MINUTES * * - IF PARM1 IS 0 (ZERO) USE 12 HOURS * * DISCLAIMER: I HAVE NOT DURING TESTING WAITED 12HRS TO * * THAT, WHO HAS THE TIME. SHOULD WORK. * * ALTHOUGH A BATCH JOB SHOULD S222 JOB TIME * * EXCEEDED BEFORE THEN SO NOT AN ISSUE. * * IF AN INVALID REPLY IS PROVIDED THE WTOR IS REPRESENTED AND * * THE TIMER RESTARTED; ASSUMES SOMEONE IS THERE :-) * * IF TIMER EXPIRES WITH NO ANSWER DEFAULTS TO THE SECOND * * VALID RESPONSE, ASSUMED NORMALLY A CANCEL, AS IF AUTOMATION * * IS WORKING IT WILL HAVE REPLIED THE FIRST AND IF AUTOMATION * * IS NOT WORKING I DO NOT WANT BATCH RUNNING. * * (2) IF A SYSIN DD IS PROVIDED WTO OUT THE FIRST 50 BYTES OF EACH * * CARD IN THE SYSIN FILE (CAN PROVIDE ADITIONAL INFO TO * * CONSOLE OPS IF NEEDED; WHICH ASSUMES YOU ARE NOT LIGHTS-OUT).* * THE SYSIN DD IS OPTIONAL. NO NEED TO DUMMY IT, IF YOU DO NOT * * WANT IT JUST OMIT IT FROM THE JCL. * * (3) CLEANED UP ENTRY/EXIT CODE TO STOP S0C4 ON EXIT * * (4) UPDATED THE ORIGIONAL COMMENTS (BELOW THIS COMMENT BLOCK) * * TO INCLUDE THE NEW PARM IN THE USAGE EXAMPLES * * AND NEW COMMENT... THE CODE SHOWS THAT IF YOU WANT A COMMA * * IN THE MESSAGE TEXT IS TO USE A %, THE CODE TRANSLATES THAT * * TO A COMMA. * * (5) ADDED LOTS OF TEST STEPS AT THE END OF THIS JCL AS EXAMPLES * * * *********************************************************************** * * WRITTEN BY. BILL GODFREY. * DATE WRITTEN. SEPTEMBER 25 1980. * DATE UPDATED. FEBRUARY 9 1982. * * ---> DATE MODIFIED. SEPTEMBER 28 2014. MARK DICKINSON * ---> MADE CHANGES LISTED ABOVE AND UPDATED BELOW USAGE COMMENTS * ---> DATE MODIFIED. JANUARY 23 2016. MARK DICKINSON * ---> S0C4 BACK ON EXIT IN TK4-, FIXED FOR TK4-, NOT TESTED TK3 * * DESCRIPTION. * THIS PROGRAM WRITES A MESSAGE ON THE OPERATOR CONSOLE, * WAITS FOR EITHER OF 2 VALID REPLIES, * SETS THE RETURN CODE TO 0 OR 4 BASED ON THE REPLY. * * THE PARM FIELD SPECIFIES THE MESSAGE AND THE VALID REPLIES. * THERE ARE 4 FIELDS IN THE PARM, SEPARATED BY COMMAS. * * THE FIRST FIELD IN THE PARM IS THE NUMBER OF MINUTES THAT * THE WTOR REMAINS OUTSTANDING BEFORE IT DEFAULTS TO * THE SECOND ANSWER (THE RC=4 ANSWER) * THE SECOND FIELD IN THE PARM IS THE REPLY THAT WILL SET * THE RETURN CODE TO 0. * THE THIRD FIELD IN THE PARM IS THE REPLY THAT WILL SET * THE RETURN CODE TO 4. * THE FOURTH FIELD IN THE PARM IS THE MESSAGE. * FOR EXAMPLE, * PARM='5,DAILY,WEEKLY,IS THIS THE DAILY OR WEEKLY RUN?' * * IF THE FIRST THREE FIELDS ARE NULL (PARM=',,,MESSAGE') * THEN 'YES' AND 'NO' ARE THE VALID REPLIES AND THE * TIMOUT WILL BE 10 MINUTES * SPACE ASKOPER CSECT STM R14,R12,12(13) BALR R12,R0 USING *,R12 LA R15,SAVEAREA ST R15,8(R13) ST R13,4(R15) LR R13,R15 * MVC ANS0,=CL12'YES' SET DEFAULT ANSWERS MVC ANS4,=CL12'NO' LA R4,WTORW+12 MVI 0(R4),C' ' FILL MESSAGE AREA MVC 1(69,R4),0(R4) WITH BLANKS MVC 0(8,R4),WTOR1+12 MOVE DEFAULT MESSAGE 'REPLY?' LA R0,70 SET DEFAULT LENGTH TO 70 STH R0,LENGTH L R2,0(,R1) POINT TO PARM LH R3,0(,R2) GET PARM LENGTH LTR R3,R3 IS THERE A PARM BZ PARMX NO, USE DEFAULTS LA R2,2(,R2) POINT TO PARM DATA * PARM1 - Timeout value, if none default to 10mins PARM1 LA R0,1 CONSTANT 1 FOR INCREMENTING CLI 0(R2),C',' IS IT NULL BE PARM2 YES, LEAVE TIMEOUT DEFAULT SR R7,R7 R7 TO COUNT LENGTH OF NUMBER LR R6,R2 R6 TO REMEMBER STRING START PARM1L CLI 0(R2),C',' LOOK FOR END OF STRING BE PARM2MAT YES, GO DO MATH CLI 0(R2),C'0' VALID NUUMBER ? BL EXIT8 NO, BELOW 0 CLI 0(R2),C'9' VALID NUUMBER ? BH EXIT8 NO, ABOVE 9 AR R7,R0 ADD 1 TO LENGTH AR R2,R0 NEXT INPUT CHAR BCT R3,PARM1L BRANCH UNLESS NO MORE PARM B EXIT8 PARM ERROR DS 0D SDB0001 PACK SDC0001,0(*-*,R6) ** EXECUTE ONLY ** SDC0001 DC D'0' USED AS DBL AND PL8 AREA PARM2MAT SR R7,R0 LEN NOT TO INCLUDE COMMA EX R7,SDB0001 R6 PARMLIST TO DEC, LEN IN R7 CVB R7,SDC0001 THEN TO BINARY INTO R7 SLR R6,R6 CLEAR R6 FOR R6/R7 PAIR MULTIPLY M R6,=F'6000' MINUTES TO 100'S/SECS IN R7 ST R7,TIMEBIN SAVE VALUE FOR STIMER C R7,=F'0' IS IT ZERO BNE SAVETIME NO, OK TO USE L R7,=F'4320000' YES, USE 12HRS SAVETIME ST R7,TIMEBIN SAVE VALUE FOR STIMER * PARM2 - The first possible answer PARM2 AR R2,R0 POINT PAST COMMA SR R3,R0 REDUCE LENGTH ACCORDINGLY LA R0,1 CONSTANT 1 FOR INCREMENTING LA R1,12 MAX LENGTH OF ANSWERS PARM2T LA R4,ANS0 POINT TO ANSWER AREA CLI 0(R2),C',' IS IT NULL BE PARM3 YES, LEAVE ANSWER DEFAULT MVC ANS0,=CL12' ' PAD ANS0 WITH BLANKS SR R5,R5 INITIAL LENGTH PARM2L CLI 0(R2),C',' LOOK FOR END OF STRING BE PARM3 ANS0 COMPLETE AR R5,R0 ADD 1 TO LENGTH CR R5,R1 IS IT TOO LONG BH EXIT8 YES, PARM ERROR MVC 0(1,R4),0(R2) COPY THE CHARACTER AR R4,R0 NEXT OUTPUT CHAR AR R2,R0 NEXT INPUT CHAR BCT R3,PARM2L BRANCH UNLESS NO MORE PARM B EXIT8 PARM ERROR * PARM3 - The second possible answer PARM3 AR R2,R0 POINT PAST COMMA SR R3,R0 REDUCE LENGTH ACCORDINGLY BNP EXIT8 IF NOTHING AFTER COMMA, PARM ERROR PARM3T LA R4,ANS4 POINT TO ANSWER AREA CLI 0(R2),C',' IS IT NULL BE PARM4 YES, LEAVE ANSWER DEFAULT MVC ANS4,=CL12' ' PAD ANS4 WITH BLANKS SR R5,R5 INITIAL LENGTH PARM3L CLI 0(R2),C',' LOOK FOR END OF STRING BE PARM4 ANS0 COMPLETE AR R5,R0 ADD 1 TO LENGTH CR R5,R1 IS IT TOO LONG BH EXIT8 YES, PARM ERROR MVC 0(1,R4),0(R2) COPY THE CHARACTER AR R4,R0 NEXT OUTPUT CHAR AR R2,R0 NEXT INPUT CHAR BCT R3,PARM3L BRANCH UNLESS NO MORE PARM B EXIT8 PARM ERROR * PARM4 - The message text string (any % is translated to a ,) PARM4 AR R2,R0 POINT PAST COMMA SR R3,R0 REDUCE LENGTH ACCORDINGLY BNP EXIT8 IF NOTHING AFTER COMMA, PARM ERROR PARM4T LA R4,WTORW+12 POINT TO WTOR TEXT CLI 0(R2),C',' IS IT NULL BE EXIT8 YES, PARM ERROR MVI 0(R4),C' ' PUT BLANK IN WTOR TEXT MVC 1(69,R4),0(R4) PAD TEXT WITH BLANKS SR R5,R5 INITIAL LENGTH LA R1,70 MAX LENGTH OF TEXT PARM4L CLI 0(R2),C',' LOOK FOR END OF STRING BE PARM4X TEXT COMPLETE AR R5,R0 ADD 1 TO LENGTH CR R5,R1 IS IT TOO LONG BH EXIT8 YES, PARM ERROR MVC 0(1,R4),0(R2) COPY THE CHARACTER CLI 0(R4),C'%' COMMA SUBSTITUTE BNE *+8 NO, SKIP NEXT INSTRUCTION MVI 0(R4),C',' REPLACE WITH COMMA AR R4,R0 NEXT OUTPUT CHAR AR R2,R0 NEXT INPUT CHAR BCT R3,PARM4L BRANCH UNLESS NO MORE PARM PARM4X STH R5,LENGTH PARMX EQU * PARM EXIT RDJFCB SYSIN IS A SYSIN DD CARD ALLOCATED ? LTR R15,R15 CHECK RESULT BNZ PARMX2 NOT ALLOCATED, SKIP SYSIN WTORS OPEN (SYSIN,(INPUT)) OPEN SYSIN SYSILOOP GET SYSIN GET CARD MVC SYSINWTO+8(50),0(R1) USE FIRST 50 BYTES SYSINWTO WTO '....+....1....+....2....+....3....+....4....+....5' B SYSILOOP LOOP UNTIL SYSIN EOF EOFSYSIN CLOSE (SYSIN) DONE WITH SYSIN * PARMX2 LA R1,WTORW MVC 0(12,R1),WTOR1 COPY WTOR PREFIX LH R15,LENGTH LA R15,4(,R15) STH R15,8(,R1) LA R15,8(R15,R1) POINT PAST TEXT MVC 0(4,R1),WTOR1R COPY DESC AND ROUTCDE LOOP MVC REPLY,=CL12' ' XC ECBWTOR,ECBWTOR CLEAR WTOR ECB WTOR ,REPLY,12,ECBWTOR,MF=(E,WTORW) ISSUE WTOR USING WTOR ECB ST R1,WTORMSID SAVE WTOR MSGID FOR DOM LA R3,ECBWTOR GET ADDR FOR LIST ST R3,ECBLIST SAVE IN ECBLIST ST R1,WTORMSID SAVE WTOR MSGID XC TIMERECB,TIMERECB CLEAR TIMER ECB LA R3,TIMERECB AND... ST R3,TIMEXPRM SET ADDR FOR POST STIMER REAL,TIMEOUT,BINTVL=TIMEBIN START TIMER LA R3,TIMERECB GET ADDR FOR LIST ST R3,ECBLIST+4 NEXT LIST ENTRY OI ECBLIST+4,X'80' END OF LIST WAIT 1,ECBLIST=ECBLIST WAIT ON LIST NOW TTIMER CANCEL CANCEL TIMER LA R3,TIMERECB NEED TO CHECK TIMER USING ECB,R3 USE TIMER ECB TM ECBCC,ECBPOST DID TIMER POP? BO TIMEERR YES, TIMEOUT DROP R3 DONE WITH ADDRESSING ECB * ELSE MUST BE THE WTOR REPLY OC REPLY,=CL12' ' UPPER CASE, CAPS CLC REPLY,ANS0 BE EXIT0 CLC REPLY,ANS4 BE EXIT4 WTO MF=(E,WTOINV) B LOOP EXIT0 L R13,4(R13) LM R14,R12,12(R13) SLR R15,R15 BR R14 EXIT4 L R13,4(R13) LM R14,R12,12(R13) LA R15,4 BR R14 EXIT8 WTO 'INVALID PARAMETER STRING PASSED TO PROGRAM' L R13,4(R13) LM R14,R12,12(R13) LA R15,8 BR R14 EJECT * TIMEERR AND TIMEOUT ADDED FOR TIMER EXPIRY HANDLING TIMEERR L R1,WTORMSID RETRIEVE MSGID OF WTOR DOM MSG=(R1),REPLY=YES REPLY=YES (AS IT IS A WTOR) MVC TIMEEWTO+47(12),ANS4 SHOW ASSUMPTION TIMEEWTO WTO 'NO REPLY WITHIN ALLOWED TIME, ASSUMING ....+....1..' B EXIT4 EXIT AS SECOND PARM TIMEOUT SAVE (14,12) L R2,TIMEXPRM ADDR TIMER EVENT POST (2) POST THE TIMER EVENT RETURN (14,12) RETURN CONTROL EJECT LTORG SAVEAREA DS 18F REGISTER ENTRY/EXIT SA WTOINV WTO ' REPLY IS INVALID ',ROUTCDE=(2),MF=L WTOR1 WTOR ' REPLY ?', X ROUTCDE=(2),MF=L WTOR1R EQU *-4 WTOR1L EQU *-WTOR1 ECBWTOR DS F ECB FOR WTOR TIMERECB DS F ECB FOR STIMER ECBLIST DS 3F ECBLIST WTORMSID DS F MSGID OF WTOR TIMEXPRM DS F TIMER POST FLAG TIMEBIN DC F'60000' DEFAULT IS 10 MINS * REPLY DS CL12 ANS0 DS CL12 ANS4 DS CL12 WTORW DS 3F,CL70,XL4 WTORWR EQU *-4 LENGTH DS H DS 0D SYSIN DCB DDNAME=SYSIN,MACRF=(GL),DSORG=PS,EODAD=EOFSYSIN, X EXLST=EXLST EXLST DC 0F'0',X'87',AL3(JFCB) JFCB DS CL176 IHAECB SPACE R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 END ASKOPER //ASM.SYSTERM DD SYSOUT=* //LKED.SYSLMOD DD DSN=MARK.LIB.LOAD(ASKOPER),DISP=SHR //* //TESTIT1 EXEC PGM=ASKOPER,COND=(0,NE), // PARM='5,,,YES%NO% FIVE MINUTE TIMEOUT ?' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //TESTIT2 EXEC PGM=ASKOPER,COND=(4,LT), // PARM='0,FRED,BARNEY,FRED%BARNEY% WILL USE 12HR TIMEOUT ?' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //TESTIT3 EXEC PGM=ASKOPER,COND=(4,LT), // PARM=',DAILY,WEEKLY,IS IT DAILY OR WEEKLY (10MIN TIMEOUT) ?' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //TESTIT4 EXEC PGM=ASKOPER,COND=(4,LT), // PARM=',,,THIS SHOULD WANT YES OR NO% 10MIN TIMEOUT' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //TESTIT5 EXEC PGM=ASKOPER,COND=(4,LT), // PARM='1,,,WANTS YES OR NO WITH SYSIN WTOS' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //SYSIN DD * THIS IS A TEST NO NEED TO REPLY TO ANY OF THESE WTORS THE WTOR WILL TIMEOUT IN 1 MINUTE /* //TESTIT6 EXEC PGM=ASKOPER,COND=(4,LT), // PARM='BADNUM,,,WITH BAD NUMBERS SHOULD RC=0008' //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //