*COMDECK  COMCRCV - REPRIEVE INTERFACE. 
          CTEXT  COMCRCV - REPRIEVE INTERFACE.
 COMCRCV  SPACE  4
*** 
*         RECOVR SERVES AS AN INTERFACE BETWEEN THE OPERATING SYSTEM
*         AND USER PROGRAMS THAT WISH TO REGAIN CONTROL AFTER SYSTEM
*         ABORT DUE TO MODE ERROR, TIME LIMIT, PP CALL ERROR, ETC.
* 
*         SUBPROGRAMS THAT WISH TO REGAIN CONTROL AFTER AN ERROR
*         SHOULD CALL "RECOVR" DURING THEIR INITIALIZATION. 
* 
*         IN CASE OF SYSTEM ABORT, "MTR" WILL RETURN CONTROL TO THE 
*         RECOVERY PACKAGE ( AT "RECVR" ) , WHICH WILL THEN RETURN
*         CONTROL TO THE SUBPROGRAMS THAT CALLED IT IN THE REVERSE
*         ORDER OF THE CALLS TO "RECOVR". 
* 
*         "RECOVR" CALLS THE POST PROCESSOR RECOVERY SUBPROGRAM 
*         WITH -
*                CALL NAME ( EXCHPKG , ABTFLAG , CM ) 
*         WHERE - 
*                EXCHPKG IS A 21B WORD ARRAY CONTAINING THE CONTENTS
*                OF THE EXCHANGE PACKAGE AT THE TIME OF ABORT 
*                AND WORD 21B CONTAINS (RA+1) 
*                THE LOWER 18 BITS OF THE FIRST WORD ( B0 ) CONTAIN THE 
*                SYSTEM ERROR CODE
* 
*                ABTFLAG = 0 INITIALLY, AND IT SHOULD BE SET TO 
*                ANY NON ZERO VALUE IF THE USER WISH THE JOB STEP 
*                TO TERMINATE NORMALLY ( WITH AN "ENDRUN" REQUEST ) . 
* 
*                CM IS A ARRAY STARTING AT RA+1 AND 
*                MAY BE USED TO ACCESS ANY PART OF CORE 
*                CM(100B) IS RA+100B, CM(0) IS RA+0 
          TITLE  MESSAGES AND OTHER DATA
*** 
*         ERROR MESSAGES
* 
 MSG1     DIS    ,/RECOVR - TOO MANY RECOVERY REQUESTS/ 
 MSG2     DIS    ,/RECOVR - BAD CHECKSUM/ 
 MSG3     DIS    ,/RECOVR - BAD ARGUMENT LIST/
  
 WAIT     MACRO  N
+         SA.N   B7 
          NZ     X.N,*
          ENDM
  
 FMBIT    MACRO  BIT
          IFLE   $,12,1            IF .LT. A BYTE LEFT IN THE WORD
          VFD    12/0              PAD OUT THE WORD 
          IFC    EQ,/BIT/-/ 
          VFD    12/0 
          ELSE
          VFD    12/1S_BIT
          ENDIF 
          ENDM
  
*         TABLE TO CONVERT THE SYSTEM ERROR CODE INTO THE BIT SET 
*         IN THE FLAG MASK FOR IT 
* 
*                FLAG MASK BIT     SYSTEM ERROR CODE
  
 SEC.FMB  FMBIT  6                 0 - NORMAL TERMINATION 
          FMBIT  2                 1 - TIME LIMIT EXCEEDED
          FMBIT  0                 2 - MODE ERROR 
          FMBIT  4                 3 - PPU ABORT
          FMBIT  5                 4 - CPU ABORT
          FMBIT  1                 5 - PP CALL ERROR
          FMBIT  3                 6 - OPERATOR DROP
          FMBIT  3                 7 - KILL 
          FMBIT  3                 8 - RERUN
          FMBIT  5                 9 - SPECIAL ABT
          FMBIT  4                 10 - ECS PARITY ERROR
          FMBIT  -                 11 - 
          FMBIT  -                 12 - 
          FMBIT  1                 13 - AUTO RECALL ERROR 
          FMBIT  1                 14 - JOB HUNG IN AUTO RECALL 
          FMBIT  2                 15 - MASS STORAGE LIMIT
          FMBIT  1                 16 - XXX NOT IN PP LIB 
          FMBIT  2                 17 - IO TIME LIMIT 
  
 STI      BSSZ   1                 STACK INDEX
  
          IF     -DEF,N.STK,1 
 N.STK    EQU    5
  
 O.STK    BSSZ   N.STK*2           RECOVERY STACK 
 L.STK    EQU    N.STK*2+1
  
 FMASK    DATA   0                 SHIFT( SEC.FMB(ERROR CODE) , 18 )
  
 ABTFLAG  DATA   0                 .NE. 0 TO END WITH ENDRUN REQUEST. 
  
 AP1      VFD    60/FWA            ADDRESS OF EXCHANGE PACKAGE
          VFD    60/ABTFLAG 
          DATA   1                 ADDRESS OF RA+1
          DATA   0                 END OF APLIST
          TITLE              RECOVERY EXECUTIVE 
*** 
*         RECVR - RECOVERY EXECUTIVE
* 
*         ENTERED BY "MTR" WHEN THE SYSTEM ABORTS THE PROGRAM RUNNING 
*         AT THE CONTROL POINT. 
* 
 FWA      BSSZ   20B+1             EXCHANGE PACKAGE + A WORD FOR RA+1 
 SYSEP    SA5    FWA               ** SYSTEM ENTRY POINT ***
          SX6    X5                EXTRACT ERROR NUMBER 
          BX7    X6 
          AX6    2                 /4 
          SA1    SEC.FMB+X6        FETCH TABLE ENTRY
          LX6    2
          IX7    X7-X6             REMAINDER = N - (N/4)*4
          LX7    2
          IX6    X7+X7
          FX5    X6+X7             *12
          MX0    12 
          SB1    X5 
          LX1    B1,X1             POSITION BYTE
          BX6    X0*X1
          LX6    12+18             POSITION MASK BIT TO STACK POSITION
          SA6    FMASK
  
 RECVR    SA1    STI               STACK INDEX
          SX6    X1-2 
          SB7    1
          NG     X6,RECEND
          SA6    A1 
          SA3    O.STK+X6          FETCH ENTRY
          SA4    A3+B7             AND CHECKSUM 
          SA1    FMASK
          BX0    X1*X3
          MX1    30 
          ZR     X0,RECVR          NO RECOVR FOR THIS CALL
          BX7    X1*X3
          SX1    TRACE. 
          IX7    X7+X1
          SB3    X3                LWA+1 TO CHECKSUM OR ZERO
          AX3    30 
          SA7    RECVR1            STORE RETURN JUMP
          SB1    X3+B7             B1=CHECKSUM FWA
          SB2    B3-B1             B2=LENGTH TO CHECKSUM
*                                  (IF THERE WAS NO CHECKSUM THEN 
*                                   B3=0 AND B2 ENDS UP NEGATIVE BUT
*                                   THE RJ CHKSUM IS DONE ANYWAY JUST 
*                                   TO MAKE DARN SURE THE STORE INTO
*                                   RECVR1 IS DONE WHEN WE GET THERE) 
          RJ     CHKSUM 
          EQ     B3,RECVRA         WAS NO CHECKSUM
          BX5    X2-X4
          CX0    X5 
          SX2    MSG2 
          NZ     X0,ERRMSG         IF CHECKSUM IS BAD 
  
 RECVRA   SA1    AP1               AP LIST FOR FTN
          SB1    B7                SET B1=1 BEFORE GOING BACK TO USER 
          IF     DEF,RUNREG,3 
          SB1    X1 
          SB2    ABTFLAG
          SB3    B7 
 RECVR1   RJ     *                 GO TO USER RECOVERY PROGRAM
          EQ     RECVR             LOOP 
          EJECT 
*** 
*         TERMINATION OF POST PROCESSING
* 
 RECEND   SA1    ABTFLAG
          NZ     X1,NOABT          IF SET NO ABORT
          WAIT   5
          SA1    RPVABT 
          BX7    X1 
          SA7    B7                CALL RPV TO PUT BACK ERROR FLAG
 NOABT    SX7    3REND
          LX7    42 
          EQ     RECFIN            GO TERMINATE THE PROGRAM 
          SPACE  3
*** 
*         ERROR EXIT
* 
 ERRMSG   SX7    3RMSG
          LX7    42 
          IX7    X7+X2
          WAIT   5                 WAIT FOR RA+1 TO CLEAR 
          SA7    B7                STORE MSG CALL 
  
 RECABT   SX7    3RABT
          LX7    42 
 RECFIN   WAIT   5
          SA7    B7                STORE ABT REQUEST
 +        EQ     *                 THATS ALL FOLKS
* 
 L.RECVR  EQU    *-1               END OF PACKAGE TO BE CHECKSUMMED 
 CHKSUM   EJECT  3,10 
*** 
*         CHKSUM - CHECKSUM AN AREA 
* 
*         ON ENTRY -
*                B1 = FWA OF AREA TO BE CHECKSUMMED 
*                B2 = WORD COUNT
* 
*         ON EXIT:  
*                X2 = CHECKSUM
* 
 CHKSUM 
          MX2    30 
          LE     B2,CHKSUM         NO CHECKSUM
          SB2    B2-B7
 CHKSUM1  SA1    B1+B2
          IX2    X2+X1             INTEGER SUM ALL WORDS
          SB2    B2-B7
          LX2    1                 SHIFT 1 AS EACH WORD ADDED 
          GE     B2,CHKSUM1 
          EQ     CHKSUM 
          SPACE  3
 RPVCL    VFD    24/4LRPVP,12/0,24/FWA
 RPVABT   VFD    24/3LRPV,12/4000B,24/0 
 SETUP.   TITLE              REQUEST RECOVERY AFTER ABORT 
***       SETUP. - PROCESS USER REQUEST FOR REPRIEVE PROCESSING.
* 
* 
*         ON ENTRY -
*                B1 = ADDRESS OF USER SUPPLIED RECOVERY SUBROUTINE. 
* 
*                B3 = CHECKSUM. 
*                   = 0 IF NO CHECKSUM. 
*                   NON ZERO - CHECKSUM FORM B1+1 TO B3.
* 
*                X4 = MASK. 
*                   SET BIT 2**N FOR EACH ERROR TO BE REPRIEVED.
* 
*         BIT    ERROR
*         0      MODE ERROR 
*         1      RA+1 REQUEST ERROR ( PP CALL ERROR ) 
*         2      SYSTEM LIMIT EXCEEDED ( TIME LIMIT, ETC. ) 
*         3      OPERATOR DROP, RERUN OR KILL 
*         4      SYSTEM ABORT ( PP ABORT, ECS PARITY ERROR, ETC. )
*         5      CPU ABORT ( THE LEFT HAND DIDN"T TELL THE RIGHT ONE
*                             WHAT IT WAS DOING ) 
*         6      NORMAL TERMINATION 
* 
          ENTRY  SETUP.            MACRO USER CALL
 SETUP. 
          SA1    STI
          SB7    1                 B7=1 
          SB2    -2 
          SB4    X1                B4= STACK INDEX
          SB5    B7+B7             B5=2 
 SET1     SB2    B2+B5             B2=0 FIRST TIME
          GE     B2,B4,SET3        DONE LOOKING AT STACK
          SA2    O.STK+B2 
          AX2    30 
          SB6    X2 
          NE     B6,B1,SET1        THIS ENTRY .NE. NEW ENTRY
          SB4    B4-B5             DECREMENT STACK INDEX
 SET2     SA2    O.STK+2+B2 
          SA3    A2+B7               REMOVE 
          BX6    X2                  CURRENT
          LX7    X3                  ENTRY
          SA6    A2-B5               FROM 
          SA7    A3-B5               STACK
          SB2    B2+B5
          LT     B2,B4,SET2        LOOP TILL EMPTY SLOT COMPRESSED OUT
          SX6    B4 
          SA6    A1                STORE NEW STACK INDEX
 SET3     MX6    -12
          BX6    -X6*X4 
          ZR     X6,SET4           MASK = 0, DONT BUILD NEW STACK ENTRY 
          LX6    18 
          SX7    B4+B5             BUMP STACK INDEX 
          SX1    B3 
          MX0    1
          SA7    A1                STORE NEW STACK INDEX
          SX5    B4-L.STK 
          BX6    X6+X1
          LX0    60-5              (X0) = 0100... RJ INSTRUCTION
          SX3    B1 
          BX6    X6+X0
          LX3    30 
          SX2    MSG1 
          BX6    X6+X3
          SA6    O.STK+B4 
          PL     X5,ERRMSG
          EQ     B3,SET4           NO CHECKSUM WANTED 
          SB3    B3-B7             B3=LWA 
          SB2    B3-B1             B2=LENGTH OF CHECKSUM
          SB1    B1+B7             B1=FWA 
          SX2    MSG3 
          LT     B2,ERRMSG
          RJ     CHKSUM            CHECKSUM POST PROCESSOR
          BX6    X2 
          SA6    A6+B7             STORE CHECKSUM 
 SET4     SA1    STI
          SB4    X1 
          SB2    B0 
 SET5     GE     B2,B4,SET6 
          SA2    O.STK+B2 
          BX1    X1+X2             LOGICAL SUM EACH ENTRY IN STACK
          SB2    B2+B5             TO GET MASK FOR RPV
          EQ     SET5 
 SET6     SA2    RPVCL
          MX0    -12
          LX0    24 
          SX7    L.RECVR
          LX1    6
          BX1    -X0*X1            MASK BITS FOR RPV
          LX7    30 
          SA7    X2                (FWA) = VFD 30/L.RECVR,30/0
          BX0    -X0*X2            MASK BITS FOR LAST RPV CALL
          BX0    X0-X1
          ZR     X0,SET7           IF SAME MASK AS LAST CALL
          BX6    X2-X0             RPV CALL WITH NEW MASK BITS
          SA6    A2 
          WAIT   4                 WAIT FOR RA+1 TO CLEAR 
          SA6    B7 
          WAIT   4                 WAIT FOR RPV TO REPLY
 SET7     SB1    B7                SET B1 TO 1 BEFORE GOING BACK TO USER
          EQ     SETUP. 
          ENDX
