:ST,S,$TC19,5 
FTN4,L,T
      PROGRAM RECOV 
C                                                                              B
C THIS PROGRAM IS USED TO PROCESS MTO LOG TAPES AND 
C TO BRING A COPY DISC TO THE STATE THAT THE LIVE ONE                          B
C WAS WHEN RECOVERY BECAME NECESSARY.                                          B
C                                                                              B
      COMMON IB(20) 
      COMMON ID(1000) 
      COMMON IL,IX,IRX
      DIMENSION IR(5),ISUB(8) 
      ITI=0 
      IRX = -1
      IX=0
1     WRITE(1,900)                                                             B
900   FORMAT(" INPUT LOG TAPE IDENTIFIER._")
      READ(1,910)(IR(K),K=1,5)
910   FORMAT(5A2) 
      WRITE(1,920)                                                             B
920   FORMAT(" INPUT LOG TAPE LU#._") 
      READ(1,*)IL 
      WRITE(1,700)
700   FORMAT(" INPUT # OF SUBCHANNELS TO BE UPDATED._") 
      READ(1,*) INS 
      IF(INS .LT. 1 .OR. INS .GT. 8) STOP 
      DO 172 I=1,INS
      WRITE(1,710)
710   FORMAT(" INPUT SUBCHANNEL #._") 
      READ(1,*) ISUB(I) 
172   CONTINUE
C                                                                              B
C NOW HAVE LOG TAPE ID AND LU, SO DO A
C ONE RECORD READ AND VERIFY IT                                                B
C                                                                              B
      CALL EXEC(3,400B+IL)
70    CALL EXEC(1,100B+IL,IB,20)                                               B
      CALL EXEC(13,IL,IS,ILOG)                                                 B
      IF(IAND(IS,200B) .NE. 0) GOTO 40
      IF(IAND(IS,40B) .EQ. 0) GOTO 71 
      CALL NTAPE
      GOTO 70 
C                                                                              B
C NOW COMPARE LOG TAPE ID 
C                                                                              B
71    DO 10 I=1,5 
      IF(IR(I).NE.IB(I)) GOTO 20
10    CONTINUE
      GOTO 30                                                                  B
C                                                                              B
C LOG TAPE ID INCORRECT 
C                                                                              B
20    WRITE(1,930)(IB(K),K=1,5) 
930   FORMAT(" LOG TAPE IDENTIFIER INCORRECT -",/ 
     *       " IDENTIFIER ON TAPE IS: ",5A2)
      IF(ITI.EQ.0)GOTO 1
72    WRITE(1,931)
931   FORMAT(" ABORT RECOVERY?_") 
      READ(1,980)IC 
      IF(IC.EQ.2HYE) GOTO 55
      IF(IC.EQ.2HNO) GOTO 70
      GOTO 72 
C 
C VERIFY THE SUBCHANNEL 
C 
30    ISA = IAND(IB(11),177B) 
      ISB = 0 
      DO 175 I=1,INS
      IF(ISA .EQ. ISUB(I)) ISB = 1
175   CONTINUE
      IF(ISB .NE. 0) GOTO 19
      IF(IB(8) .EQ. 15) CALL EXEC(1,IL,ID(1),IB(13))
      GOTO 70 
C                                                                              B
C NOW CHECK WHAT IS ON LOGGING TAPE,SHOULD BE A HEADER BLOCK                   B
C                                                                              B
19    CONTINUE
      IT = IB(8)
      ITI=1 
801   IF(IT .NE. 15) GOTO 805 
      CALL WRTE 
      GOTO 40 
805   CONTINUE
C 
C AT THIS STAGE WE CANNOT UNDERSTAND THE HEADER                                B
C                                                                              B
      WRITE(1,940)                                                             B
940   FORMAT(" CANNOT DECIPHER HEADER, HEADER IS")
      WRITE(6,940)                                                             B
      WRITE(1,950)IB                                                           B
950   FORMAT(2(8O7/)) 
      WRITE(6,950)IB                                                           B
C 
C NOW SEE WHAT THE OPERATOR WANTS TO DO 
C 
80    WRITE(1,970)
970   FORMAT(" ABORT RECOVERY?_") 
      READ(1,980)IC 
980   FORMAT(A2)
      IF(IC.EQ.2HNO) GOTO 70
      IF(IC.NE.2HYE) GOTO 80
C 
C NOW ABORT RECOVERY
C 
      WRITE(1,990)
      WRITE(6,990)
990   FORMAT(//" RECOVERY ABORTED AT OPERATOR'S REQUEST."//)
      GOTO 55 
C                                                                              B
C COME HERE AFTER PROCESSING RECORD                                            B
C                                                                              B
C SEE IF ITS END OF TAPE                                                       B
C                                                                              B
40    CALL EXEC(13,IL,ISTAT,ILOG)                                              B
      IF(IAND(ISTAT,40B) .NE. 0) GOTO 45
      IF(IAND(ISTAT,200B) .EQ. 0) GOTO 50 
      GOTO 47 
45    CALL NTAPE
      GOTO 801
C                                                                              B
C NOW ITS AN  END OF FILE SO TELL OPERATOR                                     B
C                                                                              B
47    WRITE(1,990)
      WRITE(6,960)                                                             B
960   FORMAT(" END OF FILE - END OF PROGRAM.")
55    IX=1
C 
C  CHECK FOR PROGRAM ABORT                                                     B
C 
50    IF(IX.NE.0) CALL EXEC(6)                                                 B
      GOTO 70                                                                  B
      END                                                                      B
      SUBROUTINE PERR(IE)                                                      B
C                                                                              B
C THIS SUBROUTINE CHECKS FOR LOG PARITY ERRORS                                 B
C                                                                              B
      COMMON IB(20) 
      COMMON ID(1000) 
      COMMON IL,IX
      IE=0
C                                                                              B
C GET STATUS OF LU                                                             B
C                                                                              B
      CALL EXEC(13,IL,ISTAT,ILOG)                                              B
      IF(IAND(ISTAT,40042B).NE.0)IE=1                                          B
C                                                                              B
C HAVE SET ERROR INDICATOR 0=GOOD 1=BAD                                        B
C                                                                              B
      RETURN                                                                   B
      END                                                                      B
      SUBROUTINE WRTE                                                          B
      COMMON IB(20) 
      COMMON ID(1000) 
      COMMON IL,IX,IRX
C                                                                              B
C THIS SUBROUTINE PROCESSES DISK WRITES                                        B
C                                                                              B
      CALL PERR(I)                                                             B
C                                                                              B
C FIX UP FILE NAME
C 
      IDA = IOR(IAND(IB(11),177400B),40B) 
      IF(I.EQ.0) GOTO 20
      WRITE(1,900)IB                                                           B
      WRITE(6,900)IB                                                           B
900   FORMAT(" ERROR ON LOG READ - DATA IS:"//,5(4@10/))
C                                                                              B
C NOW SEE WHAT THE OPERATOR WANTS TO DO                                        B
C                                                                              B
30    WRITE(1,910)                                                             B
910   FORMAT(" ABORT RECOVERY?_") 
      READ(1,920)IC 
920   FORMAT(A2)
C                                                                              B
      IF(IC.EQ.2HYE)GOTO 10                                                    B
      IF(IC.EQ.2HNO)GOTO 70 
      GOTO 30 
C                                                                              B
C NOW SET FOR ABORT                                                            B
C                                                                              B
10    IX=1
      WRITE(1,930)                                                             B
      WRITE(6,930)                                                             B
930   FORMAT(" LOG ERROR:",//" ABORTED AT OPERATOR'S REQUEST.") 
40    RETURN                                                                   B
C                                                                              B
C                                                                              B
70    WRITE(1,940)                                                             B
940   FORMAT(" TRY THE WRITE?_")
C                                                                              B
      READ(1,920)IC                                                            B
      IF(IC.EQ.2HYE) GOTO 20
      IF(IC.EQ.2HNO)GOTO 60                                                    B
      GOTO 70                                                                  B
C                                                                              B
C DOESNT WANT TO RISK THE WRITE SO WILL RETURN                                 B
C                                                                              B
60    GOTO 40 
C                                                                              B
C OK ITS HIS DISK GET THE DATA                                                 B
C                                                                              B
20    CALL EXEC(1,IL,ID(1),IB(13))
C                                                                              B
C SEE IF WE READ IT OK                                                         B
C                                                                              B
      CALL PERR(IE)                                                            B
      IF(IE.EQ.0)GOTO 80                                                       B
C                                                                              B
C NOW HAVE A READ ERROR                                                        B
C 
      IR=IAND(IB(11),177B)                                                     B
      WRITE(1,950)                                                             B
      WRITE(6,950)                                                             B
950   FORMAT(" READ ERROR ON DATA TO BE WRITTEN ON DISC.")
      WRITE(1,960) IB(9),IB(10),IDA,IB(12),IR 
      WRITE(6,960) IB(9),IB(10),IDA,IB(12),IR 
960   FORMAT(" DISC FILE NAME:",3A2,/" SECT:",I5,/" UD: ",I2,/////) 
C                                                                              B
C NOW OUTPUT THE DATA                                                          B
C                                                                              B
      WRITE(6,970)                                                             B
970   FORMAT(" DATA:"//)
      DO 90 I=1,IB(13)                                                         B
      WRITE(1,980)I,ID(I)                                                      B
90    WRITE(6,980)I,ID(I)                                                      B
980   FORMAT(" WORD ",I4," = ",@7)
C                                                                              B
C SEE WHAT HE WANTS TO DO                                                      B
C                                                                              B
100   WRITE(1,990)                                                             B
990   FORMAT(" TRY THE WRITE?_")
      READ(1,920)IC                                                            B
      IF(IC.EQ.2HYE)GOTO 110                                                   B
      IF(IC.EQ.2HNO)GOTO 120                                                   B
      GOTO 100                                                                 B
C                                                                              B
C DOESNT WANT IT WRITTEN SO RETURN                                             B
C                                                                              B
120   GOTO 40                                                                  B
C                                                                              B
C OK ITS STILL HIS DISK                                                        B
C                                                                              B
C GET TO CORRECT SUBCHANNEL                                                    B
C                                                                              B
80    CONTINUE
110   IR = IAND(IB(11),177B)
      IF(IR .EQ. IRX) GOTO 888
      IRX = IR
      CALL EXEC(23,0,IR,1)
C 
C CHECK THAT FILE EXISTS
C 
888   CONTINUE
      CALL EXEC(18,IB(9),ISEC)
C 
C SEE IF FILE EXISTS
C 
      IF(ISEC.NE.0) GOTO 150
C 
C TELL OPERATOR FILE DOESN'T EXIST
C 
      WRITE(1,991)IB(9),IB(10),IDA
991   FORMAT(" FILE ",3A2," DOES NOT EXIST!") 
      WRITE(6,991)IB(9),IB(10),IDA
C 
C SEE WHAT HE WANTS TO DO 
C 
175   WRITE(1,910)
130   READ(1,920)IC 
      IF(IC.EQ.2HYE) GOTO 10
      IF(IC.NE.2HNO)GOTO 175
      GOTO 40 
C 
C FILE EXISTS SO CHECK LENGTH 
C 
150   CONTINUE
      ILEN=IB(13)/128 
      ILET=ILEN*128 
      IF(ILET.NE.IB(13))ILEN=ILEN+1 
      ILEN=ILEN+IB(12)
      IF(ILEN.GT.ISEC) GOTO 170 
C 
C LENGTH OK SO DO THE WRITE 
C 
C                                                                              B
C NOW DO THE WRITE                                                             B
C                                                                              B
      CALL EXEC(15,3,ID(1),IB(13),IB(9),IB(12))                                B
C                                                                              B
C NOW RETURN                                                                   B
C                                                                              B
      GOTO 40                                                                  B
C 
C FILE NOT LARGE ENOUGH SO TELL OPERATOR
C 
170   CONTINUE
      WRITE(1,992) IB(9),IB(10),IDA 
992   FORMAT(" NOT ENOUGH ROOM IN ",3A2," TO WRITE!") 
C 
C SEE WHAT HE WANTS TO DO 
C 
155   WRITE(1,910)
      READ(1,920)IC 
      IF(IC.EQ.2HYE) GOTO 10
      IF(IC.NE.2HNO) GOTO 155 
      GOTO 40 
      END                                                                      B
      SUBROUTINE NTAPE
      COMMON IB(20) 
      COMMON ID(1000) 
      COMMON IL,IX
      CALL EXEC(3,IL+500B)
10    WRITE(1,100)
100   FORMAT(" MOUNT NEXT TAPE - TYPE 'READY'._") 
      READ(1,110) IS
110   FORMAT(A2)
      IF(IS .NE. 2HRE) GOTO 10
      RETURN
      END 
      END$
::
:CO MOUNT TAPE #13, TYPE :GO
:PA 
                                