*COMDECK  REVERT
          TITLE  REVERT 
  
**        REVERT
* 
*         NOTE  -  REVERT SHOULD WORK CORRECTLY IF A PROGRAM
*         CALLS CCL TO EXECUTE BEGIN AND THEN IMMEDIATELY CALL
*         CCL AGAIN TO DO A REVERT.  THUS NO CARD WAS READ FROM 
*         THE PROC. WRITTEN TO THE CCL FILES. 
  
 REV01    BSS 
          SA3    ANSSEP 
          SX0    X3-1R. 
          SX6    X3-1R) 
          SX7    0           ASSUME ZERO FOR REVABT 
          ZR     X0,REV02    IF PERIOD
          ZR     X6,REV02    IF RIGHT PAREN 
  
          SA2    SCATBF1
          RJ     =XSTRANS 
  
          SA1    ANSSTR 
 OSNOSBE  IFNE   HOST,SC2 
          SA2    =0LNOLIST
          BX0    X1-X2
          NZ     X0,REV01A   CHECK REVERT,ABORT 
  
 OSNOS    IFEQ   HOST,NOS 
          MESSAGE ,1,R
 OSNOS    ENDIF 
  
          SX7    0
          JP     REV02       SET REVABT 
  
 REV01A   BSS    0
          RJ     DCI         DISPLAY COMMAND IMAGE
  
          SA1    ANSSTR 
          SA2    =0LEX             CHECK REVERT,EXEC
          BX0    X1-X2
          NZ     X0,REV01.B  NOT EXEC 
  
          SA3    ANSSEP 
          SX0    X3-1R.      CHECK TERMINATOR 
          ZR     X0,REV01.A  SET REVRUN 
  
          SX0    X3-1R) 
          ZR     X0,REV01.A  SET REVRUN 
  
          SX3    MSG273      NOT TERMINATED PROPERLY
          JP     BRWERR      STRING MSG - ABORT 
  
 REV01.A  BSS    0
          SX7    1
          SA7    REVRUN      REISSUE CONTROL STATEMENT ON REVERT,EXEC.
          MX7    0           ABORT FLAG 
          JP     REV02       PROCEED WITH REVERT
  
 REV01.B  BSS    0
 OSNOSBE  ENDIF 
          SA2    =0LABORT 
          SX5    ANSSTR 
          SX3    MSG272      $INVALID REVERT PARAMETER$ 
          LX5    18 
          BX0    X1-X2
          BX3    X3+X5
          SX7    B1 
          NZ     X0,BRWERR   IF PARAMETER NE  ABORT 
 REV02    BSS 
          SA5    SNVPNL 
          SA7    REVABT 
          SX3    MSG271 
          ZR     X5,BRWERR   IF REVERT FROM JOB FILE
  
          SX7    X5-1        DECREMENT PNL
          SA7    SNVPNL      DECREMENT PNL
          MX1    0           INDICATE REVERT CALL 
          RJ     ZFS         DETERMINE Z FILE NAMES 
  
 OSSC2    IFEQ   HOST,SC2 
          OPENM  FILEDS,I-O,N   OPEN DATA STACK FILE
 OSSC2    ENDIF 
  
          SX2    FILEDS 
          RJ     =XIOREW     REWIND DATA STACK
  
 REV03    BSS 
          SA5    SNVPNL 
          SX2    FILEDS 
          ZR     X5,REV04    IF SKIP NOT NECESSARY
  
          SB2    X5          SKIP FORWARD EQUAL TO LEVEL NUMBER 
          RJ     =XIOSKP
  
*         READ THE DATA RECORD
  
 REV04    BSS 
 OSNOSBE  IFNE   HOST,SC2 
          READ   FILEDS,R    INITIATE READ
 OSNOSBE  ENDIF 
          SX2    FILEDS 
          SX3    BRDATA 
          SX4    L.BR*10
          MX6    0
          RJ     =XIORDL     READ BR DATA 
  
          SA2    BRDATA+W.BRPNL 
          SA5    SNVPNL 
          EX0    X2,BRPNL 
          SB2    X0 
          SB5    X5+1        INCREMENT BECAUSE PNL ALREADY DECREMENTED
          NE     B2,B5,REV07  ERR IF PNL AND DATA NOT EQUAL 
  
          SA5    FILEPS 
  
*         ACCESS THE CURRENT CONTROL STATEMENT FILE AND CLOSE IT. 
  
          RJ     =XIOCSA     ACCESS C.S.F.
  
 OSNOS    IFEQ   HOST,NOS 
          SETFS  FILEPS,NDST SET *NO AUTO DROP* STATUS
          SETFS  FILEDS,NDST SET *NO AUTO DROP* STATUS
 OSNOS    ENDIF 
  
 OSSC2    IFEQ   HOST,SC2 
          CLOSEM FILEIO,N,FILE   CLOSE OLD C.S.F. 
 OSSC2    ENDIF 
  
 OSBESC2  IFNE   HOST,NOS 
          SA4    BRDATA+W.BRPFP  PREVIOUS COMMAND FILE POSITION 
          SX2    BRDATA+W.BRPFN  PREVIOUS COMMAND FILE NAME 
          BX6    X4 
          SA6    CSFPOS 
          RJ     =XIOCSE     ENTER COMMAND FILE 
 OSBESC2  ENDIF 
  
*         RESTORE THE LOCAL VALUES FROM THE SAVED VALUES
*         IN BRDATA.
*         IF EFG = 0 THEN EFG = EF. 
  
          SA3    SNVEFG 
          SA2    SNVEF
          NZ     X3,REV05    IF EFG NONZERO 
  
          BX7    X2 
          SA7    A3          EFG
 REV05    BSS 
          SA4    BRDATA+W.BRSEF 
          EX6    X4,BRSEF 
          SB7    B0 
          SA5    BRDATA+W.BRSR1 
          SA6    SNVEF       RESTORE EF 
          SB6    3
          SB5    SNVR1-1
 REV06    BSS 
          ERRNZ  59-S.BRSR1 
          BX6    X5 
          SA5    A5+B1
          AX6    60-N.BRSR1  EXTRACT AND EXTEND SIGN
          SB7    B7+B1
          SA6    B5+B7       RESTORE REGISTER(R1,R2,R3) 
          LT     B7,B6,REV06 IF MORE REGISTERS TO RESTORE 
  
          SA4    BRDATA+W.BRDSC 
          EX6    X4,BRDSC 
          SA6    SNVDSC 
          RJ     =XCCLSJC    RESTORE JOB CONTROL INFO.(R1,R2,ETC.)
  
  
*         RETURN FILES WHEN GOING BACK TO ZERO PROCEDURE LEVEL
  
          SA5    SNVPNL 
          NZ     X5,REV06.5  IF NOT ZERO NESTING LEVEL
  
          SA5    FILEPS 
          RJ     IORTN       RETURN LFN AT FILEPS 
  
          SA5    FILECS 
          RJ     IORTN       RETURN LFN AT FILECS 
  
  
 OSNOS    IFEQ   HOST,NOS 
          SA4    BRDATA+W.BRFSC 
          ERRNZ  59-S.BRFSC  EXPECTING VALUE IN UPPER BITS
          MX5    N.BRFSC
          BX5    X4*X5       EXTRACT COMMAND COUNT
          NZ     X5,REV06.3  IF FILE POSITION DATA VALID
  
*         FOR NOS, A ZERO COMMAND COUNT MEANS THAT FILE POSITION DATA 
*         ARE NOT VALID.  THIS OCCURS UNDER THE FOLLOWING CONDITIONS -
*            1)  A PROCEDURE CALL IS THE LAST LINE OF THE COMMAND FILE, 
*            2)  THE PROCEDURE CALL ENDS EXACTLY ON A SECTOR BOUNDARY,
*            3)  THE CALLED PROCEDURE ENDS WITH A *REVERT,EX.* COMMAND
*                WHICH CALLS ANOTHER PROCEDURE, EITHER BY A *BEGIN* OR
*                BY A NAME CALL, FOR EXAMPLE *REVERT,EX.PROCNAM.*.
*         AN ALTERNATE COMMAND FILE MUST BE BUILT TO TAKE THE PLACE OF
*         THE ORIGINAL ONE SO THAT PROCESSING MAY PROPERLY COMPLETED. 
  
          SX2    FILEDS      REWIND FOR THE ALTERNATE COMMAND FILE
          RJ     =XIOREW
  
          SA1    REVRUN 
          ZR     X1,REV06.1  IF NOT A REVERT,EX 
  
          SX6    B0          CLEAR THE REVERT,EX FLAG 
          SA6    A1 
          RJ     REVEX       BUILD COMMAND TO BE EXECUTED ON REVERT,EX
  
          SX3    PROCWSA     WRITE THE COMMAND TO FILE
          SX4    V.CCC
          SX2    FILEDS 
          RJ     =XIOWTL
  
 REV06.1  BSS    0
          SX3    BGATPX      WRITE THE EXIT STATEMENT TO FILE 
          SX4    V.CCC
          SX2    FILEDS 
          RJ     =XIOWTL
  
          SX2    FILEDS      WRITE END OF SECTION 
          RJ     =XIOEOR
  
          SX2    FILEDS      REWIND THE COMMAND FILE
          RJ     =XIOREW
  
          SX2    FILEDS      GET FILE POSITION INTO CSFPOS
          RJ     =XIOPOS
  
          SX2    FILEDS 
          JP     REV06.7     ENTER THE ALTERNATE COMMAND FILE 
  
 REV06.3  BSS    0
 OSNOS    ENDIF 
  
          SA5    FILEDS      RETURN LFN AT FILEDS 
          RJ     IORTN
  
 REV06.5  BSS 
  
 OSNOS    IFEQ   HOST,NOS 
          SA4    BRDATA+W.BRPFP  PREVIOUS COMMAND FILE POSITION 
          SX2    BRDATA+W.BRPFN  PREVIOUS COMMAND FILE NAME 
          BX6    X4 
          SA6    CSFPOS 
 REV06.7  BSS    0
          RJ     =XIOCSE     ENTER COMMAND FILE 
  
 OSNOS    ENDIF 
  
 OSNOSBE  IFNE   HOST,SC2 
          SA5    REVRUN 
          NZ     X5,EXIT4    REISSUE CONTROL STATEMENT ON REVERT
  
 OSNOSBE  ENDIF 
          SA5    REVABT 
          ZR     X5,EXIT     ABORT NOT SPECIFIED
  
          JP     EXIT2       ABORT
  
  
  
*         ERROR,  THE NESTING LEVEL STORED IN THE DATA RECORD 
*         AND THE CURRENT VALUE OF PNL ARE IN CONFLICT. 
* 
*         ATTEMPT TO RETURN TO THE ORIGINAL JOB FILE. 
* 
*                X5  = PNL
  
 REV07    BSS 
  
          SX3    MSG270 
          RJ     STRMGA      ASSEMBLE AND ISSUE ABORT MESSAGE 
  
          SA5    SNVPNL 
          ZR     X5,REV08    PROC NESTING BACK TO JOB IN ERROR
  
          MX7    0
          MX6    1
          SA7    SNVPNL      RESET PNL TO ZERO
          SA6    REVABT      SET REVERT ABORT FLAG
          SX2    FILEDS 
          RJ     =XIOREW     REWIND 
  
*         NOW RETURN TO THE ORIGINAL JOB FILE.  THIS WILL 
*         BE DONE BY SIMPLY JUMPING BACK INTO THE REVERT CODE.
*         SINCE PNL NOW EQUAL ZERO REVERT WILL POSITION TO THE
*         FIRST DATA RECORD AND REVERT TO THE JOB.  HOWEVER 
*         BEFORE DOING SO IT IS NECESSARY TO ENSURE THAT THE
*         WORK FILE (ZZZZZC2) WHICH CONTAINS THE FIRST RECORD 
*         IS ACCESSIBLE AND NOT A CONTROL STATEMENT FILE. 
  
          SA4    FILEDS 
          BX6    X4 
          SA6    BGTMP2      SAVE DATA FILE NAME
          MX1    0
          RJ     ZFS         DETERMINE DATA FILE NAME WITH PNL=0. 
  
          SA2    BGTMP2 
          SA3    FILEDS 
          MX0    -18
          BX2    X0*X2
          BX5    X3 
          BX3    X0*X3
          BX0    X2-X3
          ZR     X0,REV03    IF DATA FILE NAME SAME,HENCE AVAILABLE 
  
*         SWITCH THE CONTROL STATEMENT FILE FROM ONE WORK FILE TO 
*         THE OTHER SO THAT THE FIRST DATA RECORD IS ACCESSIBLE.
  
          RJ     =XIOCSA     ACCESS CURRENT CONTROL STATEMENT 
  
*         ENTER THE OTHER WORK FILE AS THE C.S.F. 
  
          MX6    0
          SA6    CSFPOS 
          SX2    FILEPS 
          RJ     =XIOCSE     ENTER C.S.F. 
  
          JP     REV03       RETURN TO JOB FILE 
  
  
*         THE ATTEMPT TO RETURN TO THE ORIGINAL JOB FILE
*         HAS FAILED.  TERMINATE THE JOB IMMEDIATELY BY WRITING 
*         AN EXIT TO A FILE AND THEN DECLARE THAT FILE TO BE
*         THE CONTROL STATEMENT FILE SO THAT THE SYSTEM 
*         WILL EXECUTE THE EXIT CARD. 
  
 REV08    BSS 
          SX2    FILEDS 
          RJ     =XIOREW     REWIND 
  
          SX2    FILEDS 
          SX4    V.CCC
          SX3    REVCC       EMERGENCY EXIT CARD
          RJ     =XIOWTL     WRITE
  
          SX2    FILEDS 
          RJ     =XIOEOR     WRITE END OF SECTION 
  
          SX2    FILEDS 
          RJ     =XIOREW     REWIND 
  
          SA5    FILEPS 
          RJ     =XIOCSA     ACCESS 
  
          SX2    FILEDS 
          RJ     =XIOPOS     GET CURRENT POSITION 
  
*         ADD STATEMENT COUNT TO CSFPOS WORD
  
 OSNOS    IFEQ   HOST,NOS 
          SA3    CSFPOS 
          SA4    BRDATA+W.BRFSC    WORD WITH STATEMENT COUNT
          MX5    N.CSFESC 
          ERRNZ  S.CSFESC-59
          BX4    X5*X4
          BX3    -X5*X3      CLEAR POSITION FOR STATEMENT COUNT 
          BX6    X4+X3       COMBINE STATEMENT COUNT AND CSFPOS 
          SA6    CSFPOS      STORE FOR ENCSF MACRO USAGE
 OSNOS    ENDIF 
          SX2    FILEDS 
          RJ     =XIOCSE     ENTER FILE, EXIT WILL EXECUTE
  
          JP     EXIT        RETURN 
  
 REVCC    DATA   L$EXIT. CCL, FATAL ERR, TERMINATE JOB$ 
  
  
 REVABT   BSS    1
 REVRUN   BSSZ   1           1 = REISSUE CONTROL STATEMENT ON REVERT
