TITLE ********** ROUTINE TO ALLOW COBOL TO SLEEP ********** SUBTTL *** WORDS OF WISDOM *** ;******************************************************************* ;* * ;* BETTER IS THE POOR THAT WALKETH IN HIS INTEGRITY, * ;* THAN HE THAT IS PERVERSE IN HIS LIPS, AND IS A * ;* FOOL. A FALSE WITNESS SHALL NOT BE UNPUNISHED, AND * ;* HE THAT SPEAKETH LIES SHALL NOT ESCAPE. * ;* * ;******************************************************************* SUBTTL *** INSTRUCTIONS *** COMMENT @ "COBSLP" -- SLEEP SUBROUTINE FOR COBOL -------------------------------------- THIS SUBROUTINE IS ENTERED FROM COBOL WITH A PARAMETER AREA SET UP INDICATING THE SLEEP TIME AND THE ENABLE BITS TO BE USED WHEN THIS JOB GOES TO SLEEP. COBSLP WILL THEN SET THE ENABLE BITS AND SLEEP FOR THE SPECIFIED TIME INTERVAL. NOTE IF A ZERO TIME INTERVAL IS SPECIFIED THE SLEEP WILL BE ETERNAL OR UNTIL THE JOB IS AWAKENED BY SOME EXTERNAL EVENT. COBSLP EXPECTS THE FOLLOWING TYPE OF PARAMETER AREA TO BE SET UP BEFORE ENTRY INTO THE SUBROUTINE: 01 WAIT-ARGUMENTS. 02 WAIT-BITS PIC X(6). 02 WAIT-TIME PIC S9(4) COMP. COBSLP IS THEN ENTERED FROM COBOL WITH THE FOLLOWING COBOL STATEMENT: ENTER MACRO COBSLP USING WAIT-ARGUMENTS. ON RETURN WAIT-BITS SHOULD BE EXAMINED. IT WILL HOLD ONE OF FOUR POSIBLE VALUES. THESE VALUES AND THEIR MEANINGS ARE LISTED BELOW: ERROR THE HIBERNATE UUO FAILED. "JOBNUMBER" RETURNED ONLY WHEN COBSLP IS CALLED FOR THE FIRST TIME. THIS APPEARS IN SIXBIT LEFT JUSTIFIED IN WAIT-BITS. TTY IF THE JOB WAS AWAKENED BECAUSE OF PENDING TELETYPE INPUT. "NULL" IF THE JOB WAS AWAKENED FOR ANY REASON OTHER THEN PENDING TELETYPE INPUT. COBSLP REQUIRES A DUMMY FIRST TIME CALL TO SET THE INITIAL WAIT-BITS. THIS SHOULD BE DONE IN THE VERY BEGINNING OF THE COBOL PROGRAM THAT IS TO USE COBSLP. THIS DUMMY CALL WILL THEN RETURN THE JOB'S JOB NUMBER IN WAIT-BITS. NOTE THAT EACH TIME COBSLP IS CALLED WAIT-BITS MUST BE SET, FOR IT IS REPLACED WITH A NEW VALUE EACH TIME CONTROL RETURNS TO THE COBOL PROGRAM. THE FOLLOWING IS AN EXPLAINATION OF THE PARAMETER AREA THAT COBSLP MUST BE CALLED WITH: WAIT-BITS ENABLE BITS FOR THE OPERATION. THE FOLLOWING IS A LIST OF LEGAL BITS AND THE SYMBOLS THAT THEY REPRESENT. THE SYMBOLS SHOULD APPEAR IN WAIT-BITS BEFORE A CALL IS MADE TO COBSLP. U SAME PROJECT NUMBER REQUIRED TO WAIT THIS JOB. N SAME PROGRAM NUMBER REQUIRED TO WAKE THIS JOB. O ONLY THIS JOB CAN WAKE ITSELF. C WAKE ON CHARACTER READY (INPUT). L WAKE ON LINE READY (INPUT). P WAKE ON PTY ACTIVITY. WAIT-TIME TIME IN SECONDS TO SLEEP. IF ZERO SLEEP WILL BE ETERNAL OR UNTIL ONE OF THE ABOVE CONDITIONS IS SATISFIED. COBSLP IS LOADED ALONG WITH THE COBOL PROGRAM THAT IS TO EXECUTE IT. THE FOLLOWING "CCL" COMMAND CAN BE USED TO LOAD COBSLP PROVIDED COBSLP.REL IS IN THE SYSTEM LIBRARY [1,4]. LOAD "COBOL PROGRAM NAME",SYS:COBSLP THE JOB CAN THEN BE SAVED WITH THE MONITOR COMMAND "SSAVE JOBNAME" OR "SAVE JOBNAME". @ SUBTTL *** DEFINITIONS *** ; ACCUMULATOR DEFINITIONS. S=0 ;USED TO HOLD BITS FOR HIBERNATE. T1=1 ;TEMPORARY AC'S. T2=2 T3=3 HP=16 ;HOLDS POINTER TO COBOL ARGUMENTS. PDP=17 ;PUSH-DOWN POINTER. ; OPCODE DEFINITIONS. OPDEF MME [XWD 047000,000000] ;MASTER MODE ENTRY. OPDEF NOP [JFCL] ;NO OPERATION. ; MASTER MODE ENTRY SYMBOLS. .JOB==30 ;RETURN JOB NUMBER. .HIBER==72 ;PUT ME TO SLEEP. .WAKE==73 ;WAKE ME UP. ; CONSTANTS. ZERO==0 ;USED IN INDEXING. ONE==1 ;DITTO. ; THINGS WHICH HAVE NO OTHER PLACE TO LIVE. ENTRY COBSLP ;PROGRAM ENTRY POINT. SUBTTL *** SLEEP CONTROL *** ;HERE TO PUT THIS JOB INTO A SLEEP STATE. ;COBSLP ASSUMES THAT IT IS CALLED FROM COBOL ;WITH THE FOLLOWING PARAMETER AREA SET UP: ; ; 01 WAIT-ARGUMENTS. ; 02 WAIT-BITS PIC X(6). ; 02 WAIT-TIME PIC S9(4) COMP. ; ;COBSLP IS THEN ENTERED WITH THE FOLLOWING COBOL ;STATEMENT: ; ;ENTER MACRO COBSLP USING WAIT-ARGUMENTS. COBSLP: MOVE HP,ZERO(PDP) ;PICK UP POINTER TO POINTER. MOVE HP,@ZERO(HP) ;GET ACTUAL BYTE POINTER TO ARGUMENTS. SKIPE FSTFLG ;SKIP IT THIS IS FIRST TIME HERE. JRST BYEBYE ;NO NEED TO WAKE IF NOT. MME T1,.JOB ;GET JOB NUMBER. MME T1,.WAKE ;WAKE ME UP... NOP ;NICE TRY IF FAIL... BYEBYE: SETZM S ;CLEAR STATUS REGISTER. MOVNI T1,6 ;COUNT OF MAX NUMBER OF BITS TO SET. H.NXT: ILDB T2,HP ;PICK UP A BIT NAME. HRLZI T3,-H.CNT ;COUNT OF LEGAL BITS. H.SET: CAME T2,H.TAB(T3) ;TEST FOR A MATCH. AOBJN T3,H.SET ;TEST THE WHOLE LIST. IOR S,H.BIT(T3) ;SET THE BIT. AOJN T1,H.NXT ;DO ALL THE BITS. HRR T1,ONE(HP) ;GET THE SLEEP TIME. IMULI T1,^D1000 ;CONVERT TO MILISECONDS. HRR S,T1 ;PLACE IN THE RIGHT PLACE. MME S,.HIBER ;PUT ME AWAY. JRST NOHIB ;FAILURE... SKIPN FSTFLG ;FIRST TIME FLAG SET. JRST FSTTIM ;YES RETURN JOB NUMBER. MOVEI S,1 ;CLEAR THIS AND GO TO SLEEP AGAIN. MME S,.HIBER ;THIS IS TO CLEAR THE WAKE BIT. NOP ;IGNORE BAD RETURNS. MOVSI T1,'TTY' ;TEST HERE TO SEE IF LIFE CAME FROM TTY. SKPINC ;MAKE THE CHECK. SETZM T1 ;SOME OTHER REASON. RET: MOVEM T1,ZERO(HP) ;SAVE REASON OR JOB NUMBER. SETOM FSTFLG ;SET FLAG TO SAY WE'VE BEEN HERE. AOS (PDP) ;BUMP POINTER. POPJ PDP,COBSLP ;BACK TO COBOL. ;HERE WHEN THE HIBERNATE MME FAILS. NOHIB: MOVE T1,[SIXBIT "ERROR"] ;SAY IT IS AN ERROR. JRST RET ;AND RETURN. ;HERE TO RETURN THE JOB NUMBER. FSTTIM: SETZM T3 ;CLEAR REGISTER TO GET RESULT. MME T1,.JOB ;PICK UP JOB NUMBER. OCTDEC: IDIVI T1,^D10 ;GET A DIGIT. ADDI T2,20 ;CONVERT TO SIXBIT. LSHC T2,-6 ;SHIFT IN NEW DIGIT. SKIPE T1 ;SKIP IF LAST DIGIT. JRST OCTDEC ;GET THE NEXT. DECDON: MOVE T1,T3 ;PUT IT IN THE RIGHT PLACE. JRST RET ;VANISH... H.TAB: SIXBIT " U" ;SAME PROJECT REQUIRED TO WAKE ME. SIXBIT " N" ;SAME PROGRAMER REQUIRED TO WAKE ME. SIXBIT " O" ;ONLY I CAN WAKE ME. SIXBIT " C" ;WAKE ME ON CHARACTER READY. SIXBIT " L" ;WAKE ME ON LINE READY. SIXBIT " P" ;WAKE ME ON PTY READY. H.CNT=.-H.TAB ;COUNT OF BITS. H.BIT: 000001000000 ;BITS TO SET. 000002000000 000004000000 000010000000 000020000000 000040000000 000000000000 ;ERROR BITS TO SET [I.E. -- NONE]. FSTFLG: 000000000000 ;FIRST TIME FLAG. PRGLEN==.-COBSLP ;PROGRAM LENGTH IN OCTAL. END ;TERMINUS.....