//MARKA JOB (0),'ASSEMBLE WTORDEMO',CLASS=A,MSGCLASS=T //* //* GLOBALLY REPLACE MARK.LIB.LOAD WITH THE DSN OF YOUR //* PERSONAL PROGRAM LIBRARY BEFORE RUNNING THIS. //* //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=MVSSRC.SYM101.F01 //ASM.SYSIN DD * TITLE 'WTORDEMO -- VERSION 1.0' PRINT NOGEN *********************************************************************** * * WTORDEMO: * * ISSUES A WTOR PROMPT FOR A PASSWORD AND A TIMER TO CANCEL THE * WTOR IF A REPLY IS NOT RECIEVED IN 60 SECONDS * * --- PURPOSE --- * * THE PURPOSE OF THIS DEMO IS SIMPLY TO REMIND MYSELF HOW TO DO THIS, * I HAD A NEED FOR A 'TIMED' WTOR IN ONE OF MY STC TASKS WHERE I * WANTED TO TAKE A DEFAULT ACTION IF A OPERATOR RESPONSE WAS NOT * RECIEVED (THE DEFAULT WAS A LAST GASP RECOVERY ATTEMPT SO WAS * NOT AUTOMATED BY MESSAGE HANDLERS, IR REALLY WANTED A RESPONSE). * * IF NO RESPONSE WAS RECIEVED WITHIN THE TIME LIMIT THEN BEFORE * TAKING THE DEFAULT ACTION THE WTOR NEEDED TO BE CANCELLED/DOM'ED * SO IT DIDN'T KEEP HANGING AROUND. * IT WAS BLOODY HARD TO FIND ANY DOCUMENTATION ON HOW TO DO THAT * BUT I EVENTALLY GOT THERE SO AM DOCUMENTING IT WITH THIS SAMPLE * PROGRAM. * * THIS IS AN EXTREMELY CUTDOWN VERSION OF THE CODE I USED AS I HAVE * REMOVED ALL THE ECB WAITS (AND SETUP ETC.) FOR COMM TASKS FROM * THIS DEMO (IE: ALL THE CODE TO ALLOW F JOB,XXX AND P JOB REMOVED) * BUT FOR PRACTICAL PURPOSES IN THE DEMO IT IS ONLY ONE LESS ENTRY * IN THE ECBLIST USED IN THE WAIT (AND AN AWFULL LOT LESS CODE). * * --- WHAT DOES IT DO --- * WILL EITHER * IF NO REPLY IN 60 SECONDS * CANCEL THE TIMER * CANCEL THE WTOR AND END * IF A REPLY IS RECIEVED WITHIN 60 SECS * CANCEL THE TIMER * CHECK THE REPLY MATCHES THE HARD CODED 'SECRET' OF PASSWORD * *********************************************************************** WTORDEMO 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 SPACE 3 *********************************************************************** * (1) START A TIMER * (2) START A WTOR * (3) PUT BOTH ON AN ECB LIST * (4) WAIT UNTIL ONE OF THOSE EVENTS TRIGGERS * NOTE: WHEN THE TIMER EXPIRES THE TIMER HANDLER DOES POSTS THE TIMEOUT * EVENT TO THE ECB LIST FOR US TO CHECK *********************************************************************** XC TIMERECB,TIMERECB * CLEAR THE STIMER EXIT'S ECB XC WTORECB,WTORECB * CLEAR THE WTOR ECB LA R15,TIMERECB * LOAD ADDRESS OF TIMER ECB ST R15,TIMEXPRM * STORE IT FOR TIMER EXIT TO POST * START THE TIMER, THE TIMER * HANDLER IS AT LABEL 'TIMEOUT' * FOR THE DEMO, WAIT 60 SECONDS STIMER REAL,TIMEOUT,DINTVL=SECS60 * ISSUE THE WTOR, * TEXT * DATA AREA FOR OPERATOR REPLY * LENGTH OF THAT DATA AREA * WHERE TO STORE INFO FOR ECB WTORMSG WTOR 'MID096A ENTER SECRET PASSWORD WITHIN 60 SECONDS', X WTORREPL,L'WTORREPL,WTORECB ST R1,WTORMSID * SAVE MESSAGE ID OF WTOR * RETURNED IN R1 FROm WTOR CALL LA R3,WTORECB * POINT TO THE WTOR ECB ST R3,ECBLIST * STORE ADDR OF WTORECB IN ECBLIST LA R3,TIMERECB * POINT TO THE STIMER ECB ST R3,ECBLIST+4 * STORE IN NEXT ECB LIST ENTRY OI ECBLIST+4,X'80' * MARK END OF ECB LIST TABLE WAIT 1,ECBLIST=ECBLIST * WAIT FOR ANYTHING IN ECB LIST * * FIGURE OUT WHAT IT WAS TTIMER CANCEL * CANCEL THE TIMER FOR ANY EVENT * * OR SOME NASTY LOOPS OCCUR * CHECK THE COMMAND THAT TRIGGERED THE EVENT LA R3,TIMERECB * POINT TO TIMER ECB USING ECB,R3 * COVER THE STIMER ECB TM ECBCC,ECBPOST * DID THE TIMER POP? BO TIMEERR * YES, NO RESPONSE IN TIME DROP R3 * ELSE MUST BE THE WTOR REPLY * CAN DO LOTS OF OTHER TM TESTS TO CHECK IF * IT WAS THE WTOR OR ANY OTHER EVENTS YOU MAY * HAVE STORED IN THE ECB LIST RATHER THAN THE TWO * (TIMER AND WTOR ONLY) IN THIS DEMO. * BUT AS WE ASSUME WTO IN THE DEMO, CHECK THE REPLY NOW CLC WTORREPL(L'WTORREPL),SECRET * WAS IT WHAT WE EXPECTED BNE WTORERR * IT WAS WHAT WE WANTED WTO 'WTORDEMO: CORRECT RESPONSE, DEMO ENDED HAPPILY' B EXIT WTORERR WTO 'WTORDEMO: INVALID (HINT) PASSWORD PROVIDED' B EXIT TIMEERR WTO 'WTORDEMO: NO RESPONSE IN 60SECS, WTOR CANCELLED' * AS WE SAY WE ARE CANCELLING IT, * LETS CANCEL IT THEN L R1,WTORMSID * RETRIEVE MSGID OF WTOR DOM MSG=(R1),REPLY=YES * REPLY=YES (AS IT IS A WTOR), * CANCEL/DOM THE WTOR INSTEAD * OF WAITING UNTIL MVS CANCELS * IT WHEN THE PROGRAM ENDS EJECT *********************************************************************** * ALL DONE - EXIT * *********************************************************************** EXIT CNOP 0,4 L R13,SAVEAREA+4 RESTORE POINTER TO CALLER'S SAVE AREA LM R14,R12,12(R13) RESTORE REGISTERS SLR R15,R15 EXIT CODE 0 BR R14 RETURN TO SYSTEM SPACE 5 * ******************************************************************** * CALLED WHEN THE STIMER TIMEOUT PERIOD EXPIRES. THIS IS THE EXIT * ROUTINE DEFINED TO THE STIMER CALL EARLIER IN THE CODE. * IT ISSUES A POST ON THE TIMER EXPIRY EVENT WHICH WILL BE PICKED UP * BY THE MAINLINE WAIT ON THE ECB LIST (THE POST TRIGGERS THE TIMER * ENTRY MATCH IN THE ECB LIST). * THEN AS IT IS EFFECTIVELY JUST AN EXIT WE MUST BRANCH BACK TO * THE OS/CALLER AND WAIT FOR THE ECBLIST WAIT TO HANDLE THE POST * WE HAVE JUST MADE. * ******************************************************************** TIMEOUT SAVE (14,12) L R2,TIMEXPRM IT IS THE TIMER EVENT WE ARE POSTING POST (2) POST THE TIMER EVENT, DO NO MORE !!! RETURN (14,12) STIMER EXIT END, RETURN CONTROL EJECT *********************************************************************** * * D A T A A R E A B I T S * *********************************************************************** SAVEAREA DC 18F'0' MAIN PROGRAM SAVE AREA SECRET DC CL8'PASSWORD' THE PASSWORD VALUE EXPECTED WTORMSID DS F SAVE MESSAGE ID OF WTOR HERE WTORREPL DC CL8' ' REPLY AREA FOR WTOR WTORECB DS F WTOR ECB TIMERECB DS F THE STIMER ECB ECBLIST DS 3F ECB LIST FOR STIMER,WTOR TIMEXPRM DS F TIMER PARAMETER SECS60 DC CL8'00006000' SIXTY SECONDS FOR STIMER INVOCATION IHAECB ECB INFORMATION REQUIRED SPACE 5 * STANDARD REGISTER EQUATES HERE R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * AFTER COMPARE INSTRUCTIONS I ALWAYS INCLUDE GT EQU 2 - A HIGH LT EQU 4 - A LOW NE EQU 7 - A NOT EQUAL B EQ EQU 8 - A EQUAL B GE EQU 11 - A NOT LOW LE EQU 13 - A NOT HIGH END WTORDEMO //ASM.SYSTERM DD SYSOUT=* //LKED.SYSLMOD DD DSN=MARK.LIB.LOAD(WTORDEMO),DISP=SHR //* //* RUN THE DEMO //DEMOTEST EXEC PGM=WTORDEMO //STEPLIB DD DISP=SHR,DSN=MARK.LIB.LOAD //