*SAVE COMMANDS                                          HEADER  FUPSAV  0001.000
         M.PGM     FUP.SAVE,MPX-32,3.6.1,00                             0002.000
         SPACE                                                          0003.000
*                                                                       0004.000
************************************************************************0005.000
*                                                                      *0006.000
*                    PROPRIETARY INFORMATION                           *0007.000
*                    -----------------------                           *0008.000
*   THE INFORMATION CONTAINED HEREIN IS PROPRIETARY TO ENCORE          *0009.000
*   COMPUTER CORPORATION AND/OR ITS VENDORS, AND ITS USE, DISCLOSURE,  *0010.000
*   OR DUPLICATION IS SUBJECT TO THE RESTRICTIONS STATED IN THE        *0011.000
*   STANDARD ENCORE COMPUTER CORPORATION LICENSE TERMS AND CONDITIONS  *0012.000
*   OR THE APPROPRIATE THIRD-PARTY SUBLICENSE AGREEMENT.               *0013.000
*                                                                      *0014.000
*                       RESTRICTED RIGHTS                              *0015.000
*                       -----------------                              *0016.000
*   USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT       *0017.000
*   TO RESTRICTIONS AS SET FOURTH IN SUBDIVISION (c) (1) (ii) OF       *0018.000
*   THE RIGHTS IN TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT       *0019.000
*   252.227.7013                                                       *0020.000
************************************************************************0021.000
* (C) COPYRIGHT 1989 ENCORE COMPUTER CORPORATION                       *0022.000
*     ALL RIGHTS RESERVED                                              *0023.000
************************************************************************0024.000
*-                                                                      0025.000
*+                                                                      0026.000
*        FUNCTIONAL DESCRIPTION                                         0027.000
*                                                                       0028.000
*    THIS MODULE CONTAINS ONE OF THE COMMAND PROCESSING ROUTINES        0029.000
*    FOR THE FILE UTILITY PROGRAM FOR THE NEW FILE SYSTEM. THIS         0030.000
*    MODULE HANDLES THE "SAVE" COMMAND. IT WRITES ALL THE FILES         0031.000
*    SPECIFIED IN THE COMMAND TO THE CURRENT SAVE TAPE AFTER            0032.000
*    WRITING A SAVE FILE DIRECTORY. THE FILES ARE WRITTEN AS            0033.000
*    A SERIES OF RECORDS AS PART OF A SINGLE MAG-TAPE FILE. THE         0034.000
*    INDIVIDUAL FILES ARE FOUND USING THE DIRECTORY.                    0035.000
*-                                                                      0036.000
*+                                                                      0037.000
*        ENVIRONMENT                                                    0038.000
*                                                                       0039.000
*    THE LOGICAL FILE CODE: "TAP" IS USED TO WRITE THE SAVE FILES.      0040.000
*    THE LOGICAL FILE CODE: "DSC" IS USED TO READ THE FILES TO SAVE.    0041.000
*-                                                                      0042.000
*********************************************************************   0043.000
*                                                                   *   0044.000
*        HISTORY OF FUPSAV             MPX 3.6.0                    *   0045.000
*                                                                   *   0046.000
*********************************************************************   0047.000
*        VOLMGR REV 3.6.0.05                                    EQIC360A0048.000
*        MODULES: FUPSAV (REV 3.6.0.03)                         EQIC360A0049.000
*        EQIC360A  03/11/93  10833  IF A NEW DEVICE IS MOUNTED  EQIC360A0050.000
*                  AFTER VOLMGR IS INVOKED (I.E. IF A NEW       EQIC360A0051.000
*                  DEVICE IS SPECIFIED THROUGH J.MOUNT), SET    EQIC360A0052.000
*                  OR RESET SEOF MODE ACCORDING TO THE UDT OF   EQIC360A0053.000
*                  THE NEW DEVICE.                              EQIC360A0054.000
*                                                                       0055.000
*        VOLMGR REV 3.6.0.04                                            0056.000
*        MODULES: FUPSAV (REV 3.6.0.02)                                 0057.000
*                                                                       0058.000
*        03/04/93  10833 OUTPUT MESSAGE AFTER TAPE HAS BEEN     S881599A0059.000
*                  CHANGED.                                     S881599A0060.000
*                                                                       0061.000
*        VOLMGR REV 3.6.0.02                                    EQIC360 0062.000
*        MODULES: FUPSAV (REV 3.6.0.01)                         EQIC360 0063.000
*                                                               EQIC360 0064.000
*        02/12/93  10833 ADD SCSI QIC SUPPORT                   EQIC360 0065.000
*                                                                       0066.000
*        02/23/93  10833 IF MULTIVOLUME TAPE, WRITE MESSAGE TO  S881599 0067.000
*                  SLO WHEN A NEW TAPE IS MOUNTED.              S881599 0068.000
*                                                                       0069.000
*********************************************************************   0070.000
*                                                                       0071.000
*    EXTERNAL REFERENCES:                                               0072.000
*                                                                       0073.000
         EXT       TAPZ            LOGICAL FILE CODE G-STRING           0074.000
         EXT       GEN.M004        ERROR MESSAGE                        0075.000
         EXT       GEN.M012        ERROR MESSAGE                        0076.000
*!       EXT       GEN.M011        ERROR MESSAGE               ! 32B01  0077.000
         EXT       GEN.M022        ERROR MESSAGE                        0078.000
         EXT       GEN.M001        ERROR MESSAGE                        0079.000
         EXT       GEN.M031                                             0080.000
         EXT       ERROR5                                               0081.000
         EXT       ERROR2                                               0082.000
         EXT       FORMATOT                                             0083.000
         EXT       C.BSPIMA                                             0084.000
         EXT       M.FWDR          FORWARD A REC                S860212 0085.000
         EXT       FUPABC6         ABORT CODE 'VO06'            S860212 0086.000
         EXT       TAPE.NUM                                             0087.000
         EXT       FUPABRT3        ABORT ROUTINE - ENTRY POINT          0088.000
         EXT       CNP.ACCD        CNP OPTION VALUE                     0089.000
         EXT       CNP.ACC5        CNP OPTION VALUE                     0090.000
         EXT       X.CLOSE         CLOSE RESOURCE                       0091.000
         EXT       INQ.BUF         RESOURCE INQUIRY BUFFER              0092.000
         EXT       RRS.OPT1                                             0093.000
         EXT       RRS.ACC3        READ EXCLUSIVE ACCESS                0094.000
         EXT       IO2Z            LOGICAL FILE CODE G-STRING           0095.000
         EXT       BUILDRR2        BUILD A RRS ENTRY OF TYPE 2          0096.000
         EXT       X.ALOC          GENERAL ALLOCATE RESOURCE            0097.000
         EXT       GEN.M002        ERROR MESSAGE                        0098.000
         EXT       FUPABORT        ABORT ROUTINE - ENTRY POINT          0099.000
         EXT       ERRDISC         DISC I/O ERROR MESSAGE PROCESSING    0100.000
         EXT       GEN.M006        ERROR MESSAGE                        0101.000
         EXT       CNP.ACC6        CNP OPTION VALUE                     0102.000
         EXT       CNP.ACC8        CNP OPTION VALUE            ! 32B01  0103.000
         EXT       X.OPEN          OPEN RESOURCE ROUTINE                0104.000
         EXT       IO2FCB          SCRATCH FILE FCB                     0105.000
         EXT       M.RWND          REWIND ROUTINE                       0106.000
         EXT       GEN.M007        I/O ERROR MESSAGE                    0107.000
         EXT       FUPABRT2        ABORT ROUTINE                        0108.000
         EXT       FUPABC1         ABORT CODE 'VO01'            S860416 0109.000
         EXT       ABORTNOM                                             0110.000
         EXT       FUPERR1         FUP ERROR NUMBER                     0111.000
         EXT       STACKPTR        STACK POINTER SAVE AREA              0112.000
         EXT       FUPERR2         FUP ERROR NUMBER                     0113.000
         EXT       FUPERR3         FUP ERROR NUMBER                     0114.000
         EXT       ADR.MASK        TO CLEAR CC'S                        0115.000
         EXT       M.BCKR          BACK OVER A RECORD                   0116.000
         EXT       M.BCKF          BACK OVER A FILE             S860212 0117.000
         EXT       FUPTIME         DATE/TIME OF RUN START               0118.000
         EXT       AUDIT0          AUDIT TRAIL                          0119.000
         EXT       CONFIRM         CONFIRM SAVE ROUTINE                 0120.000
         EXT       CHCKBAOR        CHECK TASK ACTIVATION STATUS         0121.000
         EXT       GETPROTO                                             0122.000
         EXT       GETRD0          GET RD BY RID                        0123.000
         EXT       GETRD1          GET RD BY FIL/DIR/VOL                0124.000
         EXT       COMPTIME        CHECK TIME CONSTRAINTS               0125.000
         EXT       STACKPTR        STACK POINTER                        0126.000
         EXT       RD1.BUF         RD BUFFER                            0127.000
         EXT       RD2.BUF         RD BUFFER                            0128.000
         EXT       F.SAVE          FUNCTION STRING                      0129.000
         EXT       FUN.SAVE        ADDRESS OF FUNCTION STRING           0130.000
         EXT       RRS.BUF         RRS BUFFER                           0131.000
         EXT       RDTR.BUF        RDTR BUFFER                          0132.000
         EXT       RCB.BUF         RCB BUFFER                           0133.000
         EXT       ERROR           ERROR HANDLER                        0134.000
         EXT       ERRORIO         WRITES I/O RELATED ERROR MESSAGE     0135.000
         EXT       X.ALOC6         ALLOCATE FILE BY RID                 0136.000
         EXT       X.RINQ          RESOURCE INQUIRY                     0137.000
         EXT       X.DALC          DE-ALLOCATE RESOURCE                 0138.000
         EXT       DSCZ            LFC FOR READING DISC FILE            0139.000
         EXT       M.WEOF          WRITE EOF TO TAPE                    0140.000
         EXT       M.WEOFL         WRITE LOGICAL EOF TO TAPE    EQIC360 0141.000
         EXT       TAPFCB          FCB ADDRESS FOR TAPE WRITES          0142.000
         EXT       WSEQ            WRITE TO TAPE ROUTINE                0143.000
         EXT       DISCFCB         FCB ADDRESS FOR DISC READS           0144.000
         EXT       RSEQ            READ FROM DISC ROUTINE               0145.000
         EXT       COPYSTRG        COPY A STRING                        0146.000
         EXT       TAPBUFF         TAPE OUTPUT BUFFER                   0147.000
         EXT       IO2BUFF         LARGE DATA BUFFER                    0148.000
         EXT       IO3BUFF         LARGE DATA BUFFER                    0149.000
         EXT       LASTIO2         LAST SLOT IN IO2BUFF                 0150.000
         EXT       NEXTIO2         NEXT SLOT IN IO2BUFF                 0151.000
         EXT       INITIO2         INITIALISE IO2BUFF POINTERS          0152.000
         EXT       LASTTAP         LAST SLOT IN TAPBUFF                 0153.000
         EXT       NEXTTAP         NEXT SLOT IN TAPBUFF                 0154.000
         EXT       FLAGWORD        INDICATES IF IO2 SPILL OCCURED       0155.000
         EXT       INITTAP         INITIALISE TAPBUFF POINTERS          0156.000
         EXT       BSAVRCB         BUILD DIR RCB FROM RD                0157.000
         EXT       CLEARRCB        CLEAR RCB BUFFER            85-0391  0158.000
         EXT       GETRD2          GET RD FROM SHORT RID                0159.000
         EXT       MODRD0          GET RD FOR MODIFICATION              0160.000
         EXT       MODRD1          REWRITE RD AFTER MODIFICATION        0161.000
         EXT       FLAGBITS        GLOBAL FLAG BITS                     0162.000
         EXT       FLAGBIT2        SECOND GLOBAL FLAG BITS      S881599 0163.000
         EXT       LOBLOCK         LOCAL OPTION BLOCKS                  0164.000
         EXT       COBADDR         CURRENT OPTION BLOCK ADDRESS         0165.000
         EXT       DOBLOCK         DEFAULT OPTION BLOCK         EQIC360 0166.000
*                                                                       0167.000
*                                                                       0168.000
         EXT       FORMATOT        FORMAT AND OUTPUT A MESSAGE          0169.000
         EXT       COMDADDR        COMMAND DISPATCHER ADDRESS           0170.000
         EXT       UDTADDR         UDT ADDRESS FOR TAPE DEVICE  EQIC360A0171.000
         EXT       INVKEY          ERROR - INVALID KEYWORD              0172.000
         EXT       INVTERM         ERROR - INVALID TERINATOR            0173.000
         EXT       INVPARM         ERROR - INVALID PARAMETER            0174.000
         EXT       FILERTN         FILE EXEC DISPATCHER RETURN ADDRESS  0175.000
         EXT       SS.PATNM        STATE EXPRESSION FOR PATHNAME        0176.000
         EXT       SS.KWSYN        STATE EXPRESSION FOR KEYWORD SYNTAX  0177.000
         EXT       SS.SAVN         STATE TABLES FOR SAVN=BOOL OPTION    0178.000
         EXT       SS.INP          STATE TABLES FOR "PATH=" KEYWORD     0179.000
         EXT       A.GLOBAL        ACTION ROUTINE TO SET UP FOR GLOBAL O0180.000
         EXT       SS.BRIE         STATE TABLES FOR BRIEF OPTION        0181.000
         EXT       SS.CONF         STATE TABLES FOR CONFIRM BOOLEAN OPT.0182.000
         EXT       SS.TIMOP        STATE TABLES FOR TIME OPTIONS        0183.000
         EXT       PERR006         ERRVAL TRANSITION FOR NO PATHNAMES   0184.000
         EXT       A.LOCAL         ACTION ROUINE TO SET UP FOR LOCAL OPT0185.000
         SPACE                                                          0186.000
*                                                                       0187.000
*    EXTERNAL DEFINITIONS                                               0188.000
*                                                                       0189.000
         SPACE                                                          0190.000
         DEF       S.SAVCMD        STATE TABLE FOR THE COMMAND          0191.000
         DEF       C.SAVE          PROCEDURE ENTRY POINT                0192.000
         DEF       S.SAVINC        STATE TABLE FOR SAVE INCREMENTAL     0193.000
         DEF       DIRCOUNT        NUMBER OF DIRECTORY ENTRIES          0194.000
         DEF       SPILLIO2        ROUTINE TO ADMINISTER "IO2" TEMP FILE0195.000
         DEF       SAVTIME         CURRENT TIME STORAGE AREA            0196.000
         SPACE                                                          0197.000
*                                                                       0198.000
*    SYSTEM MACRO CALLS FOR DEFINITIONS AND EQUATES                     0199.000
*                                                                       0200.000
         SPACE                                                          0201.000
         LIST      NOMAC                                                0202.000
         M.EQUS                                                         0203.000
         M.RCB                     RCB EQUATES                          0204.000
         M.RR.TEQ                  RESOURCE REQUIREMENT SUMMARY EQUATES 0205.000
         M.FCB.                                                         0206.000
         M.DFT.                    FILE ASSIGNMENT TABLE EQUATES        0207.000
         M.UDT.                    UNIT DEFIN. TABLE EQUATES    EQIC360A0208.000
         M.RDCOM   RD                                                   0209.000
         M.RDSPD   RD                                                   0210.000
         STINIT                    INIT TPARSE VALUES AND DEFINITIONS   0211.000
         SPACE                                                          0212.000
*                                                                       0213.000
*    LOCAL DEFINITIONS                                                  0214.000
*                                                                       0215.000
         SPACE                                                          0216.000
REMM14   EQU       14              ERROR CODE VALUE                     0217.000
         SPACE                                                          0218.000
*                                                                       0219.000
*  TEMPORARY EQUATES UNTIL PUT INTO MACRO LIBRARY                       0220.000
*                                                                       0221.000
RD.DEFI  EQU       14                                                   0222.000
         SPACE                                                          0223.000
*                                                                       0224.000
*    LOCAL STORAGE                                                      0225.000
*                                                                       0226.000
         SPACE                                                          0227.000
SAVE.EOF DATAB     C' SAVE      *** EOF ***',0                          0228.000
SAV.SEOF DATAB     C' SAVE      *** SEOF ***',0                 EQIC360A0229.000
EOPI     DATAB     C'0TAPE REPOSITIONED AT END OF PREVIOUS IMAGE',0 V.290230.000
BOTAPE   DATAB     C'0TAPE REPOSITIONED AT BEGINNING OF TAPE',0     V.290231.000
SAVERR1  DATAB     C' ALL FILES ON THIS IMAGE ARE NOT SAVED',0          0232.000
* SPR# 85-0367                                                          0233.000
SAVERR2  DATAB     C' EOF/EOM HAS BEEN DETECTED TWICE',0        S860416 0234.000
MV.BLK   REZ       10W             VARIABLES BLOCK              S881599 0235.000
MVMSG    DATAB     C' *** MULTIVOLUME TAPE VOL %L4N MOUNTED',0  S881599 0236.000
         SPACE                                                          0237.000
         BOUND     1D                                                   0238.000
*                                                                       0239.000
SAVTIME  REZ       1D              BUFFER FOR CURRENT TIME              0240.000
*                                                                       0241.000
DIRCOUNT REZ       1W              TOTAL FILES IN THIS IMAGE            0242.000
PROTADDR REZ       1W              TEMPORARY SPACE FOR PROTOTYPE ADDR   0243.000
*                                                                       0244.000
IOERRCNT REZ       1W              DISC I/O COUNT                       0245.000
IOERRTRY EQU       -5              DISC I/O ERROR RETRY=5 TIMES S860784 0246.000
         TITLE     'SAVE' FUP COMMAND                                   0247.000
         SPACE                                                          0248.000
         CSECT                                                          0249.000
         SPACE                                                          0250.000
*                                                                       0251.000
* ROUTINE C.SAVE - ENTRY POINT FOR 'SAVE' FUP COMMAND                   0252.000
*                                                                       0253.000
*        THIS ROUTINE IS ENTERED BY THE FILE UTILITY MAIN               0254.000
*        COMMAND DISPATCHER AFTER THE 'SAVE' COMMAND                    0255.000
*        HAS BEEN SUCCESSFULLY PARSED.                                  0256.000
*                                                                       0257.000
C.SAVE   EQU       $                                                    0258.000
         PUSH                      SAVE REGISTERS                       0259.000
SAVE3.2  LA        R7,F.SAVE       FUNCTION STRING ADDRESS              0260.000
         STW       R7,FUN.SAVE                                          0261.000
         TBM       B.EOMSET,FLAGWORD  EOM REACHED?              S860416 0262.000
         BS        SAVE50          EXIT THE VOLMGR WITH VO01    S860416 0263.000
*                                                                       0264.000
*  CHECK FOR LFC "TAP" ASSIGNED, UNBLOCKED, AND WRITE ACCESS            0265.000
*                                                                       0266.000
         BL        OPENTAP                                              0267.000
*                                                                       0268.000
* CLEAR DOWN THE FLAGWORD (FLAGWORD) AND THE COUNT OF ENTRIES IN        0269.000
* THE CURRENT SAVE IMAGE (DIRCOUNT) AT THE START OF EACH SAVE           0270.000
* COMMAND.                                                              0271.000
*                                                                       0272.000
         ZMW       FLAGWORD                                             0273.000
         ZMW       DIRCOUNT                                             0274.000
         SPACE                                                          0275.000
*                                                                       0276.000
* SEE IF ANY COMMAND WAS PREMATURLY TERMINATED, IF SO, THEN FORCE A     0277.000
* DEALLOCATION ON LFC "DSC" IN CASE A USER'S PERMANENT FILE IS STILL    0278.000
* ALLOCATED                                                             0279.000
*                                                                       0280.000
         TBM       ABORT.F,FLAGBITS                                     0281.000
         BNS       SAVE3.1         GO FOR NO COMMAND TERMINATED         0282.000
         LA        R5,DISCFCB      FCB ADDRESS LFC "DSC"                0283.000
         BL        X.DALC          FORCE A DEALLOCATE                   0284.000
*** IGNORE ANY ERROR STATUS FROM DEALLOCATION                           0285.000
SAVE3.1  EQU       $                                                    0286.000
         SPACE                                                          0287.000
*                                                                       0288.000
* INITIALISE DIRECTORY BUFFER POINTERS ON THE ASSUMPTION                0289.000
* THAT AT LEAST ONE FILE IS TO BE SAVED!!                               0290.000
*                                                                       0291.000
         LI        R7,PROSZ.O      SIZE OF ENTRIES IN IO2BUFF           0292.000
         BL        INITIO2                                              0293.000
*                                                                       0294.000
* GET THE NEXT PROTOTYPE BLOCK                                          0295.000
* CC1 WILL BE SET IF THERE ARE NO MORE BLOCKS                           0296.000
* R2 CONTAINS THE ADDRESS OF THE BLOCK IF THERE ARE MORE                0297.000
*                                                                       0298.000
SAVE3    BL        GETPROTO                                             0299.000
         BCT       1,SAVE0         BRANCH IF NO MORE                    0300.000
*                                                                       0301.000
* THERE IS ANOTHER PROTOTYPE BLOCK TO BE CONSIDERED.                    0302.000
* THE FOLLOWING OPTIONS ARE ALLOWED ON THE SAVE COMMAND AND             0303.000
* MUST BE CONSIDERED BEFORE THE SAVE CAN TAKE PLACE:                    0304.000
*                                                                       0305.000
*        (1) SINCE TIME                                                 0306.000
*        (2) BEFORE TIME                                                0307.000
*        (3) OVERRIDE 'NSAVE' CREATE OPTION                             0308.000
*        (4) CONFIRM BEFORE SAVE                                        0309.000
*                                                                       0310.000
*                                                                       0311.000
* SEE IF THE USER HAS REQUESTED CONFIRMATION BEFORE THE RESTORE         0312.000
* TAKES PLACE.                                                          0313.000
*                                                                       0314.000
*                                                                       0315.000
* OBTAIN THE RD FIRST OF ALL FOR THE TIME COMPARISONS                   0316.000
* AND THE 'NSAVE' BIT CHECKING.                                         0317.000
* ROUTINE GETRD0 OBTAINS THE RD BY RID AND PUTS IT INTO                 0318.000
* THE BUFFER RD.BUF                                                     0319.000
*                                                                       0320.000
         SPACE                                                          0321.000
SAVE1    EQU       $                                                    0322.000
         SPACE                                                          0323.000
         LW        R6,PROFRD.O,X2  IS RID PRESENT IN PROTOTYPE ENTRY ???0324.000
         BNZ       SAVE1.10        GO FOR RID PRESENT                   0325.000
         LA        R7,RD1.BUF      TO HOLD THE RD                       0326.000
         BL        GETRD1          GET RD BY PATHNAME                   0327.000
         BS        SAVE2           BRANCH IF ERRORS                     0328.000
         BU        SAVE1.20        JOIN COMMON CODE                     0329.000
         SPACE     2                                                    0330.000
SAVE1.10 EQU       $                                                    0331.000
         LA        R7,RD1.BUF      TO HOLD THE RESOURCE DESCRIPTOR      0332.000
         LA        R2,PROFVN.O,X2  RID ADDRESS WITHIN PROTOTYPE         0333.000
         BL        GETRD0          GET RESOURCE DESCRIPTOR BY RID       0334.000
         SUI       R2,PROFVN.O     PROTOTYPE ADDRESS                    0335.000
         TBR       R0,CC1          ANY ERROR(S) ???                     0336.000
         BS        SAVE2           GO FOR ERROR(S)                      0337.000
         SPACE                                                          0338.000
SAVE1.20 EQU       $                                                    0339.000
*                                                                       0340.000
* SEE IF THE TIME CONSTRAINTS ARE APPLICABLE                            0341.000
* THE ROUTINE COMPTIME TAKES AS INPUT THE OPTION BLOCK                  0342.000
* ADDRESS AND ASSUMES THE RD IS IN RD.BUF                               0343.000
* IT RETURNS CC1=0 IF RESOURCE NOT TO BE SAVED                          0344.000
* ELSE CC1=1 IF RESOURCE IS ELIGIBLE FOR SAVING                         0345.000
*                                                                       0346.000
         LW        R3,PROFOA.O,R2  OPTION BLOCK ADDRESS                 0347.000
         BL        COMPTIME                                             0348.000
         BCF       1,SAVE3         LOOP IF NOT TO BE SAVED              0349.000
*                                                                       0350.000
* CHECK THE 'NSAVE' OVERRIDE OPTION IN THE OPTION BLOCK                 0351.000
* IF IT IS NOT SET THEN THE 'NSAVE' BIT IN THE RD MUST BE               0352.000
* EXAMINED                                                              0353.000
* IF IT IS SET THEN THE FILE IS ELIGIBLE TO BE SAVED WITHOUT            0354.000
* LOOKING AT THE RD.                                                    0355.000
*                                                                       0356.000
         TBM       OPT.B.SV,OPT.FLGS,R3                                 0357.000
         BS        SAVE4           BRANCH IF OVERRIDE IS ON             0358.000
*                                                                       0359.000
         LA        R3,RD1.BUF      RD BUFFER ADDRESS                    0360.000
         TBM       RD.NSAVE,RD.SFLGS,R3                                 0361.000
         BNS       SAVE1.30        IF SET NOSAVE OPTION IS SET 82-1543  0362.000
         BL        ERROR5          OUTPUT ERROR MESSAGE        82-1543  0363.000
         LA        R2,GEN.M031                                 82-1543  0364.000
         BL        FORMATOT                                    82-1543  0365.000
         BU        SAVE3           GET NEXT PROTOTYPE          82-1543  0366.000
*                                                                       0367.000
SAVE1.30 LW        R3,PROFOA.O,R2  OPTION BLOCK ADDRESS        83-0089  0368.000
         TBM       OPT.B.CO,OPT.FLGS,R3 TEST CONFIRM BIT       83-0089  0369.000
         BNS       SAVE4           BRANCH IF NO CONFIRMATION   83-0089  0370.000
*                                                              83-0089  0371.000
         BL        CHCKBAOR        IS JOB INTERACTIVE MODE?    83-0089  0372.000
         BS        SAVE4           IF NOT, CONFIRM OPT. NOT VAL83-0089  0373.000
         BL        CONFIRM         ASK THE USER                83-0089  0374.000
         BCF       1,SAVE3         BRANCH IF NEGATIVE REPLY    83-0089  0375.000
*                                                              83-0089  0376.000
* THE FILE IS ELIGIBLE TO BE SAVED AS FAR AS TIME CONSTRAINTS           0377.000
* AND THE SAVE OPTION ARE CONCERNED.                                    0378.000
* COPY THE RID TO THE PROTOTYPE ENTRY FOR FAST ACCESS LATER.            0379.000
* TRY TO ALLOCATE THE FILE TO ENSURE THAT THE SAVER HAS                 0380.000
* SUFFICIENT RIGHTS TO DO THE SAVE. IT IS NECCESSARY TO KNOW            0381.000
* THIS NOW SO THAT WE DONT WRITE A LARGE NUMBER OF DUMMY (NO DATA)      0382.000
* FILES TO TAPE.                                                        0383.000
* THE FILE IS ALLOCATED BY RID BY THE ROUTINE M.ALOC6.                  0384.000
* ON SUCCESSFUL ALLOCATION R5 CONTAINS THE ALLOCATION INDEX             0385.000
* WHICH CAN BE USED TO DE-ALLOCATE THE FILE (I AM ASSUMING              0386.000
* THIS IS QUICKER THAN DE-ALLOCATION BY LFC).                           0387.000
* IF ERRORS OCCURED DURING THE ALLOCATION CC1 WILL BE                   0388.000
* SET ON RETURN, AND R7 WILL CONTAIN THE H.REXS ERROR CODE              0389.000
*                                                                       0390.000
SAVE4    EQU       $                                                    0391.000
         STW       R2,PROTADDR     SAVE PROTOTYPE ADDRESS TEMPORARILY   0392.000
         TRR       R6,R6           RID ALREADY PRESENT ???              0393.000
         BNZ       SAVE4.10        GO FOR RID ALREADY PRESENT           0394.000
         LA        R3,PROFVN.O,R2  ADDRESS OF PROTOTYPE DESTINATION     0395.000
         LA        R2,RD1.BUF      ADDRESS OF RID                       0396.000
         LI        R4,RID.SIZE     SIZE OF RID                          0397.000
         BL        COPYSTRG        COPY FROM RD TO PROTOTYPE            0398.000
*                                                                       0399.000
*  NOTE: MAY WANT TO GET RD # OF DIRECTORY FILE RESIDES IN.             0400.000
*  THIS IS "RD.PAREN" IN THE RD & IS SAVED IN THE PROTOTYPE ENTRY       0401.000
*  AT "PROFR2.O"                                                        0402.000
*                                                                       0403.000
         SPACE                                                          0404.000
SAVE4.10 EQU       $                                                    0405.000
         SPACE                                                          0406.000
         LA        R2,RD1.BUF      ADDRESS OF FILES RID                 0407.000
         LA        R7,DISCFCB      FCB FOR 'DSC' LFC                    0408.000
         LW        R6,RRS.ACC3     READ EXCLUSIVE ACCESS                0409.000
         LW        R4,RRS.OPT1     AUTO OPEN, UNBLOCKED                 0410.000
         SPACE                                                          0411.000
*                                                                       0412.000
*  ALLOW (EXPLICIT OR IMPLICIT) SHARED ALLOCATION OF (USER'S) FILE      0413.000
*  IF EXCLUSIVE ALLOCATION IS DENIED                                    0414.000
*                                                                       0415.000
         SBM       NONEXCL,FLAGBITS                                     0416.000
         SPACE                                                          0417.000
         BL        X.ALOC6         ALLOCATE PERMANENT FILE              0418.000
         BCT       1,SAVE5         BRANCH IF NOT SUCCESSFUL             0419.000
*                                                                       0420.000
* THE FILE TO BE SAVED CAN BE ALLOCATED TO THE CURRENT USER.            0421.000
* DE-ALLOCATE THE FILE AND WRITE THE PROTOTYPE TO THE                   0422.000
* DIRECTORY BUFFER READY FOR THE REAL SAVE LATER.                       0423.000
* R5 WAS RETURNED FROM X.ALOC6 CONTAINING THE ALLOCATION                0424.000
* INDEX.                                                                0425.000
* CALL THE ROUTINE X.DALC TO DO THE DE-ALLOCATION.                      0426.000
* IF ERRORS OCCURED DURING THE DE-ALLOCATION CC1 WILL BE                0427.000
* SET ON RETURN, AND R7 WILL CONTAIN THE H.REXS ERROR CODE              0428.000
*                                                                       0429.000
         BL        X.DALC          DE-ALLOCATE THE FILE                 0430.000
         BCT       1,SAVE5         BRANCH IF NOT SUCCESSFUL             0431.000
*                                                                       0432.000
* ALL LOOKS O.K. SO ADD THE PROTOTYPE ENTRY TO THE DIRECTORY            0433.000
* BUFFER, FROM WHICH THE DIRECTORY ON THE FRONT OF THE SAVE             0434.000
* AND THE RESOURCES TO BE SAVED WILL BE EXTRACTED ON THE                0435.000
* NEXT PASS.                                                            0436.000
*                                                                       0437.000
* WRITEIO2 EXPECTS R2 TO CONTAIN THE START ADDRESS OF THE RECORD        0438.000
* AND R7 TO CONTAIN THE LENGTH OF THE RECORD                            0439.000
*                                                                       0440.000
* FINALLY BUMP THE TOTAL ENTRIES (DIRCOUNT)                             0441.000
*                                                                       0442.000
         LW        R2,PROTADDR     RETRIEVE PROTOTYPE ADDRESS           0443.000
         LI        R7,PROSZ.O      SIZE OF IO2 RECORD                   0444.000
         BL        WRITEIO2                                             0445.000
         ABM       31,DIRCOUNT     ONE MORE ENTRY                       0446.000
         BU        SAVE3           LOOP FOR NEXT PROTOTYPE              0447.000
*                                                                       0448.000
* HANDLE ANY ERRORS FROM SERVICE CALLS                                  0449.000
* R7 HOLDS THE ERROR CODE                                               0450.000
*                                                                       0451.000
SAVE5    LW        R2,PROTADDR     PROTOTYPE ADDRESS                    0452.000
         BL        ERROR           ERROR HANDLER                        0453.000
         BU        SAVE3           LOOP FOR NEXT PROTOTYPE              0454.000
*                                                                       0455.000
* THE INITIAL SCAN OF THE PROTOTYPE TABLE HAS BEEN MADE AND             0456.000
* ALL FILES INELIGIBLE FOR SAVING HAVE BEEN ELIMINATED.                 0457.000
* NOW GO AND BUILD THE DIRECTORY AND WRITE THE TAPE.                    0458.000
*                                                                       0459.000
* IF THE ELIGIBLE PROTOTYPES HAD TO BE SPILLED TO DISC                  0460.000
* (B.SPILL BIT OF FLAGWORD), THEN ANY DATA REMAINING IN                 0461.000
* THE CURRENT BUFFER MUST BE SPILLED BEFORE THE DISC FILE               0462.000
* IS REWOUND FOR A SECOND PASS.                                         0463.000
*                                                                       0464.000
* IF THE COUNT OF FILES TO BE SAVED IS ZERO THE SKIP ANY                0465.000
* FURTHER PROCESSING AND EXIT TO THE CALLER IMMEDIATELY.                0466.000
*                                                                       0467.000
SAVE0    LW        R7,DIRCOUNT                                          0468.000
         BZ        SAVE6           BRANCH IF NONE TO SAVE               0469.000
*                                                                       0470.000
         LI        R7,PROSZ.O      IO2BUFF RECORD SIZE                  0471.000
         TBM       B.SPILL,FLAGWORD     ANY SPILLAGE AT ALL?            0472.000
         BNS       SAVE30          BRANCH IF NONE                       0473.000
         BL        SPILLIO2        SPILL ANY REMAINING DATA             0474.000
SAVE30   BL        REWNDIO2        REWIND IO2 FILE AND RESET POINTERS   0475.000
*                                                                       0476.000
* WE GET HERE WHEN A BUFFER OF PROTOTYPE ENTRIES IS READY               0477.000
* FOR PROCESSING TO FORM A DIRECTORY BUFFER FOR WRITING                 0478.000
* TO TAPE.                                                              0479.000
* POINTERS TO THE START OF THE PROTOTYPE BUFFER (IO2BUFF)               0480.000
* HAVE BEEN SET UP BY REWNDIO2, SO NOW SET UP POINTERS TO               0481.000
* THE BUFFER IN WHICH THE TAPE DIRECTORY IS TO BE BUILT (TAPBUFF).      0482.000
* THE FIRST WORD OF THE BUFFER IS THE RECORD TYPE AND THE               0483.000
* SECOND WORD THE NUMBER OF ENTRIES.                                    0484.000
* AFTER THESE HAVE BEEN SET, EXECUTE A LOOP DIRCOUNT LONG               0485.000
* READING PROTOTYPE ENTRIES AND BUILDING DIRECTORY ENTRIES.             0486.000
* THE ROUTINE DIRENTRY DOES THIS, READING SCRATCH FILE IO2              0487.000
* AND WRITING DIRECTORY RECORDS TO TAPE AS NECCESSARY.                  0488.000
*                                                                       0489.000
         LI        R7,DIRENTSZ     SIZE OF ENTRY IN TAPBUFF             0490.000
         BL        INITTAP         INITIALISE TAPBUFF                   0491.000
*                                                                       0492.000
         LA        R3,TAPBUFF      ADDRESS OF DIRECTORY BUFFER          0493.000
         LI        R6,REC.DIR      A DIRECTORY RECORD                   0494.000
         LA        R2,DOBLOCK      DEFAULT OPTION BLOCK ADDR    EQIC360 0495.000
         TBM       OPT.B.SE,OPT.FLGS,X2 SOFT EOF?               EQIC360 0496.000
         BNS       SAVE31          IF NOT, DO NOT SET FLAG      EQIC360 0497.000
         SBR       R6,IDIRSEOF     THIS IMAGE SAVED UNDER SEOF  EQIC360 0498.000
SAVE31   CEQU      $                                            EQIC360 0499.000
         STW       R6,REC.TYPE,R3                                       0500.000
         LW        R6,DIRCOUNT     ENTRY COUNT                          0501.000
         STW       R6,REC.DCNT,R3                                       0502.000
         ABM       28,NEXTTAP      BUMP INPUT POINTER                   0503.000
*                                                                       0504.000
         TRN       R6,R6           -VE COUNT OF ENTRIES FOR LOOP        0505.000
         LI        R7,PROSZ.O      SIZE OF IO2 RECORD                   0506.000
SAVE8    BL        DIRENTRY        FORM NEXT DIRECTORY ENTRY            0507.000
         BIB       R6,SAVE8        AND LOOP FOR NEXT                    0508.000
*                                                                       0509.000
* THE DIRECTORY HAS BEEN FULLY FORMATTED AND ANY FULL                   0510.000
* BUFFERS WILL HAVE BEEN OUTPUT TO TAPE.                                0511.000
* IF TAPBUFF HAS SOME RECORDS IN IT, THEY MUST BE FLUSHED               0512.000
* TO TAPE AT THIS POINT.                                                0513.000
* THIS CONDITION IS DETECTED BY THE NEXT FREE SLOT IN                   0514.000
* THE OUTPUT BUFFER NOT BEING EQUAL TO THE START ADDRESS                0515.000
* OF THE BUFFER.                                                        0516.000
*                                                                       0517.000
         LA        R7,TAPBUFF      OUTPUT BUFFER                        0518.000
         CAMW      R7,NEXTTAP      SAME AS NEXT FREE SLOT?              0519.000
         BEQ       SAVE9           BRANCH IF NONE REMAIN TO FLUSH       0520.000
         WRITES    TAPFCB,TAPBUFF,IOBUFFSZ                              0521.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)         V.29     0522.000
*                                                                       0523.000
* THE DIRECTORY HAS BEEN WRITTEN TO TAPE SO ADD A EOF MARKER            0524.000
*                                                                       0525.000
SAVE9    LI        R4,1                                                 0526.000
         LA        R3,DOBLOCK      DEFAULT OPTION BLOCK ADDR    EQIC360 0527.000
         TBM       OPT.B.SE,OPT.FLGS,X3 SOFT EOF?               EQIC360 0528.000
         BS        SCSI1           IF SO, WRITE LOGICAL EOF     EQIC360 0529.000
         BL        M.WEOF          WRITE EOF TO TAPE                    0530.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)                  0531.000
         BU        SCSI2                                        EQIC360 0532.000
SCSI1    CEQU      $                                            EQIC360 0533.000
         BL        M.WEOFL         WRITE LOGICAL EOF TO TAPE    EQIC360 0534.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)          EQIC360 0535.000
SCSI2    CEQU      $                                            EQIC360 0536.000
*                                                                       0537.000
* NOW THE SAVING OF THE FILES CAN BEGIN IN ERNEST.                      0538.000
* THE SCRATCH FILE IO2 (IF USED) IS REWOUND AGAIN AND THE               0539.000
* PROTOTYPE ENTRIES RE-READ.                                            0540.000
*                                                                       0541.000
         LI        R7,PROSZ.O      SIZE OF IO2 RECORD                   0542.000
         BL        REWNDIO2        REWIND IO2 (IF USED)                 0543.000
*                                                                       0544.000
* EXECUTE A LOOP OF THE TOTAL NUMBER OF FILES TO BE SAVED (DIRCOUNT)    0545.000
*                                                                       0546.000
*        (0) GET THE NEXT PROTOTYPE ENTRY                               0547.000
*        (1) FORMING A RDTR RECORD AND WRITING IT TO TAPE               0548.000
*        (2) READING THE DISC FILE AND WRITING IT TO TAPE               0549.000
*        (3) ADD AN EOF AFTER EACH FILE                                 0550.000
*        (4) UPDATING THE DISC RD TO CONTAIN THE NEW SAVE DATE          0551.000
*        (5) PRINTING THE AUDIT TRAIL FOR THE FILE SAVED                0552.000
*                                                                       0553.000
         LNW       R6,DIRCOUNT     LOOP CONTROL                         0554.000
SAVE11   LI        R7,PROSZ.O      SIZE OF IO2 RECORD                   0555.000
         BL        READIO2         READ NEXT IO2 RECORD                 0556.000
         LW        R2,NEXTIO2      ADDRESS OF PROTOTYPE ENTRY           0557.000
*                                                                       0558.000
         BL        RDTR            FORM AND WRITE RDTR RECORD           0559.000
         BCF       1,SAVE13        BRANCH IF FILE CAN BE SAVED          0560.000
         LA        R2,TAPFCB                                            0561.000
         LI        R4,1                                                 0562.000
         LA        R3,DOBLOCK      DEFAULT OPTION BLOCK ADDR    EQIC360 0563.000
         TBM       OPT.B.SE,OPT.FLGS,X3 SOFT EOF?               EQIC360 0564.000
         BS        SCSI3           IF SO, WRITE LOGICAL EOF     EQIC360 0565.000
         BL        M.WEOF          ADD AN EOF AFTER THE RDTR            0566.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)                  0567.000
         BU        SCSI4                                        EQIC360 0568.000
SCSI3    CEQU      $                                            EQIC360 0569.000
         BL        M.WEOFL         ADD LOG EOF AFTER THE RDTR   EQIC360 0570.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)          EQIC360 0571.000
SCSI4    CEQU      $                                            EQIC360 0572.000
         BU        SAVE12          AND GET NEXT PROTOTYPE               0573.000
*                                                                       0574.000
SAVE13   BL        WRITDATA        WRITE THE DISC FILE TO TAPE          0575.000
         BS        SAVE12          IF ERROR GET NEXT IO2 REC    S860784 0576.000
         LA        R2,TAPFCB                                            0577.000
         LI        R4,1                                                 0578.000
         TBM       OPT.B.SE,OPT.FLGS,X3 SOFT EOF?               EQIC360 0579.000
         BS        SCSI5           IF SO, WRITE LOGICAL EOF     EQIC360 0580.000
         BL        M.WEOF          ADD AN EOF                           0581.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)         V.29     0582.000
         BU        SCSI6                                        EQIC360 0583.000
SCSI5    CEQU      $                                            EQIC360 0584.000
         BL        M.WEOFL         ADD A LOGICAL EOF            EQIC360 0585.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)          EQIC360 0586.000
SCSI6    CEQU      $                                            EQIC360 0587.000
         BL        MODIFYRD        UPDATE THE RD WITH THE SAVE DATE     0588.000
         BCT       1,SAVE14        BRANCH IF ERROR ON REWRITE           0589.000
         LW        R2,NEXTIO2      ADDRESS OF PROTOTYPE                 0590.000
         BL        AUDIT0          PRINT THE AUDIT LINE                 0591.000
*                                                                       0592.000
* MOVE TO THE NEXT ENTRY IN THE PROTOTYPE TABLE.                        0593.000
* THE CURRENT ENTRY ADDRESS IS IN R2                                    0594.000
*                                                                       0595.000
SAVE12   ARMW      R7,NEXTIO2      MOVE TO NEXT IO2 RECORD              0596.000
         BIB       R6,SAVE11       LOOP FOR NEXT PROTOTYPE              0597.000
*                                                                       0598.000
* END OF ALL SAVING HAS BEEN REACHED SO WRITE ANOTHER EOF               0599.000
* TO INDICATE THE END OF A SAVE IMAGE, AND THEN WRITE A THIRD           0600.000
* EOF TO INDICATE EOT.                                                  0601.000
* THIS THIRD ONE IS THEN BACKED OVER SO THAT FURTHER SAVE               0602.000
* COMMANDS MAY BE ISSUED, BUT IT ALSO ALLOWS THE FUP                    0603.000
* USER TO DO THINGS LIKE REWIND AND LOG IMAGE KNOWING                   0604.000
* THAT HE HAS A WELL FORMED TAPE.                                       0605.000
*                                                                       0606.000
         LA        R2,TAPFCB                                            0607.000
         TBM       OPT.B.SE,OPT.FLGS,X3 SOFT EOF?               EQIC360 0608.000
         BS        SCSI7           IF SO, DO EOF DIFFERENTLY    EQIC360 0609.000
         LI        R4,2                                                 0610.000
         BL        M.WEOF                                               0611.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)                  0612.000
         LI        R4,1                                                 0613.000
         BL        M.BCKR                                               0614.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)                  0615.000
         SPACE                                                          0616.000
         LA        R2,SAVE.EOF     FORMATTING STRING                    0617.000
         BL        FORMATOT        FORMAT & PRINT THE DOUBLE            0618.000
         BL        FORMATOT        EOF MESSAGE                          0619.000
         BU        SAVE6           JOIN COMMON CODE             EQIC360 0620.000
SCSI7    CEQU      $                                            EQIC360 0621.000
         LI        R4,1            SET UP                       EQIC360 0622.000
         BL        M.WEOF          WRITE EOF                    EQIC360 0623.000
         BCT       CC2,SAVE35      I/O ERROR(S)                 EQIC360 0624.000
*        LA        R2,SAVE.EOF     FORMATTING STRING    EQIC360 EQIC360A0625.000
         LA        R2,SAV.SEOF     FORMATTING STRING            EQIC360A0626.000
         BL        FORMATOT        FORMAT & PRINT EOF MESSAGE   EQIC360 0627.000
         SPACE                                                          0628.000
*                                                                       0629.000
*THE END OF THE SAVE HAS BEEN COMPLETED SO RETURN TO THE CALLER         0630.000
*                                                                       0631.000
SAVE6    EQU       $                                                    0632.000
         POP                       RESTORE REGISTERS                    0633.000
         TRSW      R0              AND EXIT TO CALLER                   0634.000
*                                                                       0635.000
* AN ERROR OCCURRED WHEN ATTEMPTING TO REWRITE THE RD OF THE            0636.000
* DISC FILE JUST SAVED.                                                 0637.000
*                                                                       0638.000
* FOR NOW INDICATE THE ERROR AND 'FILE NOT SAVED' EVEN THOUGH           0639.000
* THE TAPE SAVE OF THE FILE IS COMPLETE.                                0640.000
*                                                                       0641.000
SAVE14   EQU       $                                                    0642.000
         LW        R2,PROTADDR     PROTOTYPE ADDRESS                    0643.000
         BL        ERROR                                                0644.000
         LI        R7,PROSZ.O      R7=00000080                  S860777 0645.000
         BU        SAVE12          MOVE TO NEXT FILE                    0646.000
*                                                                       0647.000
* AN ERROR HAS BEEN DETECTED DURING THE PRELIMINARY SCAN OF             0648.000
* THE PROTOTYPE TABLE, SO INDICATE THAT THE SAVE OF THE                 0649.000
* RESOURCE HAS BEEN ELIMINATED.                                         0650.000
*                                                                       0651.000
SAVE2    BL        ERROR                                                0652.000
         BU        SAVE3           LOOP FOR NEXT PROTOTYPE              0653.000
*                                                                       0654.000
* AN ERROR HAS OCCURRD IN I/O (NOT RELATED TO TAPE I/O)         S860212 0655.000
* FIELD A GENERAL MESSAGE AND ABORT                                     0656.000
*                                                                       0657.000
SAVE35.1 LA        R6,GEN.M007     I/O ERROR MESSAGE   S860212 ! 32B03  0658.000
         BL        FUPABRT2        AND ABORT           S860212 ! 32B03  0659.000
         SPACE     2                                                    0660.000
*                                                                       0661.000
*  AN ERROR OCCURRED ON A TAPE I/O OPERATION                    S860212 0662.000
*  SETUP LOGICAL EOT PROPERLY AND ABORT IMMEDIATELY             S860212 0663.000
*                                                                       0664.000
SAVE35   EQU       $                                           ! 32B03  0665.000
         LA        R6,GEN.M007        85-0367                  V.29     0666.000
         BL        ERRORIO            85-0367                  V.29     0667.000
*!       LW        R2,PROTADDR                        S860212  V.29     0668.000
*!       BL        ERROR5                             S860212  V.29     0669.000
*!       LA        R7,SAVERR1         85-0367                   S860212 0670.000
*!       BL        ERROR2             85-0367                   S860212 0671.000
*!       SBM       B.TAPERR,FLAGBITS  85-0367                   S860212 0672.000
*!       LI        R2,1               85-0367         S860212  V.29     0673.000
*!       STW       R2,TAPE.NUM        85-0367         S860212  V.29     0674.000
         LA        R2,TAPFCB       TAP FCB                      S860212 0675.000
         LI        R4,1            BACK 1 FILE                  S860212 0676.000
         BL        M.BCKF          TO THE END OF LAST SAVED FIL S860212 0677.000
         BL        M.FWDR          FORWARD THE EOF JUST HIT     S860212 0678.000
         TBM       B.DIRENT,FLAGWORD  IF IT HAPPENED WHILE      S860212 0679.000
         BS        SAVE35.4        WRITING DIRENTRY TO TAP,SKIP S860212 0680.000
*        BUILD A RDTR WITH B.RDTRIO SET TO INDICATE THERE WAS A S860212 0681.000
*        TAPE I/O ERROR OCCURRED DURING SAVING OF THIS FILE.    S860212 0682.000
*        ALL FILES SAVED AHEAD OF THIS FILE ARE GOOD.           S860212 0683.000
         LW        R2,PROTADDR     GET PROTOTYP ENTRY ADDR      S860212 0684.000
         BL        ERROR5          PRINT FUNC & FILE NAME       S860212 0685.000
         LA        R3,RDTR.BUF     RDTR OF FILE W/IO ERR        S860212 0686.000
         SBM       B.RDTRIO,REC.PERR,X3 I/O ERROR OCCURRED      S860212 0687.000
         WRITES    TAPFCB,RDTR.BUF,RDTR.SIZ WRITE TO TAPE       S860212 0688.000
         LA        R2,TAPFCB       GET TAP FCB                  S860212 0689.000
         LI        R4,2            WRITE 2 EOF TO FORM EOI      S860212 0690.000
         BL        M.WEOF          ALLOW NO MORE TAPE OPERATION S860212 0691.000
*!VE35.4 LI        R4,1 NEED ANOTHER EOF TO FORM EOT    S860212 EQIC360 0692.000
SAVE35.4 CEQU      $                                            EQIC360 0693.000
         LA        R3,DOBLOCK      DEFAULT OPTION BLOCK ADDR    EQIC360 0694.000
         TBM       OPT.B.SE,OPT.FLGS,X3 SOFT EOF?               EQIC360 0695.000
         BNS       SCSI8           IF NOT,DIFFERENT PARAMETER   EQIC360 0696.000
         LI        R4,2            NEED ANOTHER EOF TO FORM EOT EQIC360 0697.000
         BU        SCSI9           JOIN COMMON CODE             EQIC360 0698.000
SCSI8    CEQU      $                                            EQIC360 0699.000
         LI        R4,1            NEED ANOTHER EOF TO FORM EOT EQIC360 0700.000
SCSI9    CEQU      $                                            EQIC360 0701.000
         BL        M.WEOF          LOGICAL EOT BUILT            S860212 0702.000
*        ABORT VOLMGR IMMEDIATELY                               S860212 0703.000
         LW        R5,FUPABC6      ABORT CODE = 'VO06'          S860212 0704.000
         SVC       1,X'57'         ABORT SELF                   S860212 0705.000
*!       BL        C.BSPIMA           85-0367         S860212  V.29     0706.000
*!       BCT       CC3,SAVE35.2       85-0367         S860212  V.29     0707.000
*!       LA        R2,EOPI            85-0367         S860212  V.29     0708.000
*!       BU        SAVE35.3           85-0367         S860212  V.29     0709.000
*!VE35.2 LA        R2,BOTAPE          85-0367         S860212  V.29     0710.000
*!VE35.3 BL        FORMATOT           85-0367         S860212  V.29     0711.000
*!       BL        ABORTNOM           85-0367         S860212  V.29     0712.000
*                                                                       0713.000
* EOF/EOM HAS OCCURED                                                   0714.000
* FIELD A GENERAL MESSAGE AND ABORT                                     0715.000
*                                                                       0716.000
SAVE36   SBM       B.EOMSET,FLAGWORD  SET EOM FLAG              S860416 0717.000
         LA        R6,GEN.M004     EOF/EOM ERROR MESSAGE        S860416 0718.000
*!VE36   LA        R6,GEN.M004     EOF/EOM ERROR MESSAGE        S860416 0719.000
         BL        FUPABRT2        AND ABORT                            0720.000
SAVE50   LA        R7,SAVERR2      GET ERROR MESSAGE            S860416 0721.000
         BL        ERROR2          PRINTOUT AND THEN ABORT      S860416 0722.000
         LW        R5,FUPABC1      ABORT CODE 'VO01'            S860416 0723.000
         SVC       1,X'57'         ABORT THE VOLMGR             S860416 0724.000
         TITLE     ADD A DIRECTORY ENTRY TO THE OUTPUT BUFFER           0725.000
*                                                                       0726.000
* THIS ROUTINE READS THE NEXT PROTOTYPE ENTRY FROM THE BUFFER           0727.000
* IO2BUFF (READING THE SCRATCH FILE IO2 IF NECCESSARY),                 0728.000
* AND WRITES A DIRECTORY BUFFER ENTRY TO TAPBUFF (WRITING               0729.000
* THE BUFFER TO TAPE IF NECCESSARY)                                     0730.000
*                                                                       0731.000
* INPUTS:                                                               0732.000
*        NONE                                                           0733.000
*                                                                       0734.000
* OUTPUTS:                                                              0735.000
*        NONE                                                           0736.000
*                                                                       0737.000
DIRENTRY EQU       $                                                    0738.000
         PUSH                      SAVE REGISTERS                       0739.000
*                                                                       0740.000
* GET THE ADDRESS OF THE NEXT PROTOTYPE ENTRY INTO NEXTIO2.             0741.000
* THIS MAY INVOLVE READING THE FILE IO2.                                0742.000
*                                                                       0743.000
         TRR       R7,R5           SAVE IO2 ENTRY SIZE                  0744.000
         BL        READIO2         GET NEXT PROTOTYPE                   0745.000
*                                                                       0746.000
* DO A SIMILAR CHECK ON THE OUTPUT BUFFER TAPBUFF, SPILLING             0747.000
* IT TO TAPE IF NECCESSARY.                                             0748.000
*                                                                       0749.000
DIRENT1  LW        R3,NEXTTAP      NEXT FREE SLOT                       0750.000
         CAMW      R3,LASTTAP      COMPARE WITH LAST POSSIBLE           0751.000
         BLE       DIRENT2         BRANCH IF ROOM                       0752.000
*                                                                       0753.000
         WRITES    TAPFCB,TAPBUFF,IOBUFFSZ                              0754.000
         SBM       B.DIRENT,FLAGWORD  SET FLAG IN CASE I/O ERR  S860212 0755.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)                  0756.000
         ZBM       B.DIRENT,FLAGWORD  CLEAR FLAG                S860212{0757.000
         LI        R7,DIRENTSZ     SIZE OF ENTRY IN TAPBUFF             0758.000
         BL        INITTAP         AND RESET BUFFER POINTERS            0759.000
         LW        R3,NEXTTAP                                           0760.000
*                                                                       0761.000
* ALL IS NOW O.K. TO COPY THE FILE/DIR/VOL NAMES FROM THE               0762.000
* PROTOTYPE BUFFER (IO2BUFF) TO THE TAPE BUFFER (TAPBUFF).              0763.000
*                                                                       0764.000
DIRENT2  LW        R2,NEXTIO2      ADDRESS OF PROTOTYPE ENTRY           0765.000
         ADI       R2,PROFFN.O     ADDRESS OF FILE NAME                 0766.000
         LI        R4,DIRENTSZ     NUMBER OF BYTES IN ENTRY             0767.000
         BL        COPYSTRG        DO THE COPY                          0768.000
*                                                                       0769.000
* SET UP THE PROTOTYPE AND TAPE POINTERS TO THE NEXT ENTRIES            0770.000
* IN THEIR RESPECTIVE BUFFERS.                                          0771.000
*                                                                       0772.000
         ARMW      R5,NEXTIO2      MOVE TO NEXT IO2 RECORD              0773.000
         ARMW      R4,NEXTTAP      MOVE TO NEXT TAPE BUFFER RECORD      0774.000
*                                                                       0775.000
         POP                       RESTORE REGISTERS                    0776.000
         TRSW      R0                                                   0777.000
         TITLE     FORM AND WRITE RDTR TO TAPE                          0778.000
*                                                                       0779.000
* THIS ROUTINE FORMATS AN RDTR RECORD AND WRITES IT TO TAPE             0780.000
* THE RECORD IS A 384 WORD ENTITY, THE FIRST 192 WORDS CURRENTLY        0781.000
* CONTAIN INFORMATION KNOWN TO FUP ONLY, THE SECOND 192 WORDS           0782.000
* CONTAIN THE RD OF THE FILE BEING SAVED.                               0783.000
*                                                                       0784.000
* INPUTS:                                                               0785.000
*        R2 = ADDRESS OF PROTOTYPE NETRY                                0786.000
*                                                                       0787.000
* OUTPUTS:                                                              0788.000
*        CC1 IS SET IF AN ERROR OCCURRED WHILST READING THE RD          0789.000
*        R7 CONTAINS THE ERROR CODE                                     0790.000
*                                                                       0791.000
RDTR     EQU       $                                                    0792.000
         ANMW      R0,ADR.MASK     ASSUME A GOOD SAVE                   0793.000
         PUSH                      SAVE REGISTERS                       0794.000
*                                                                       0795.000
* CLEAR DOWN THE RDTR BUFFER TO MAKE THE RECORD LOOK CLEAN.             0796.000
* CODE IS NASTY BECAUSE RDTR.BUF IS AN EXTERNAL!!                       0797.000
*                                                                       0798.000
         LI        R4,-RDTMXIDX    SIZE IN BYTES                        0799.000
         ZR        R3              INDEX TO RDTR.BUF                    0800.000
RDTR5    ZMW       RDTR.BUF,R3     ZERO NEXT WORD                       0801.000
         ABR       R3,29           MOVE TO NEXT WORD                    0802.000
         BIW       R4,RDTR5                                             0803.000
*                                                                       0804.000
* THE FIRST WORD OF THE RDTR CONTAINS A RECORD TYPE FLAG.               0805.000
* THE SECOND WORD CONTAINS A FLAG INDICATING WHAT HAS                   0806.000
* BEEN SAVED FOR THE CURRENT FILE IMAGE AS FOLLOWS:                     0807.000
*                                                                       0808.000
*        0            = RD AND FILE SAVED                               0809.000
*        B.RDTRRD SET = NO RD AND NO FILE DATA                          0810.000
*        B.RDTRFI SET = NO FILE DATA                                    0811.000
*                                                                       0812.000
* THE NEXT TWELVE WORDS CONTAIN A COPY OF THE FILE/DIR/VOL              0813.000
* NAME OF THE RESOURCE BEING SAVED.                                     0814.000
*                                                                       0815.000
         LA        R3,RDTR.BUF     ADDRESS OF RDTR BUFFER               0816.000
*                                                                       0817.000
         LI        R7,REC.RDTR     RDTR RECORD INDICATOR                0818.000
         STW       R7,REC.TYPE,R3                                       0819.000
*                                                                       0820.000
         ZMW       REC.PERR,R3     CLEAR THE FLAGWORD                   0821.000
*                                                                       0822.000
         LA        R3,REC.PATH,R3  ADDRESS OF FILE/DIR/VOL START        0823.000
         LI        R4,PRONM.O*3    3 NAMES TO BE SAVED                  0824.000
         BL        COPYSTRG        R2 CONTAINS FILE/DIR/VOL SOURCE      0825.000
*                                                                       0826.000
* FINALLY ADD AN RCB WHICH REFLECTS THE ATTRIBUTES OF THE               0827.000
* DIRECTORY FROM WHICH WE ARE SAVING THE CURRENT FILE.                  0828.000
* THIS IS SO THAT THE DIRECTORY CAN BE RECREATED ON THE                 0829.000
* RESTORE COMMAND SHOULD IT PROVE NECCESSARY.                           0830.000
* ALL WE HAVE IS THE SHORT RID OF THE DIRECTORY IN THE                  0831.000
* PROTOTYPE TABLE ENTRY.                                                0832.000
* CALL ROUTINE TO GET THE RD OF THE DIRECTORY INTO RD.BUF               0833.000
* AND THEN CALL ANOTHER ROUTINE (BSAVRCB) TO BUILD THE                  0834.000
* RCB INTO RCB.BUF                                                      0835.000
* FINALLY COPY THE RCB TO THE RDTR BUFFER (RDTR.BUF).                   0836.000
*                                                                       0837.000
* R2 MUST CONTAIN THE PROTOTYPE ENTRY ADDRESS AT THIS POINT.            0838.000
*                                                                       0839.000
         LD        R4,PROFFN.O,R2  SAVE FIRST TWO WORDS OF FILENAME     0840.000
         ZMD       PROFFN.O,R2     PRETEND NO FILE (WANT DIR RD)        0841.000
         LA        R7,RD1.BUF      TO HOLD RD                           0842.000
         BL        GETRD1          GET RD BY DIRECTORY PATHNAME         0843.000
         STD       R4,PROFFN.O,R2  PUT FILENAME BACK AGAIN              0844.000
         BCT       1,RDTR1         BRANCH IF ERRORS                     0845.000
         SPACE                                                          0846.000
         BL        BSAVRCB         BUILD DIRECTORY RCB                  0847.000
         STW       R2,PROTADDR     SAVE TEMPORARILY                     0848.000
         LA        R2,RCB.BUF      SOURCE ADDRESS                       0849.000
         LA        R3,RDTR.BUF                                          0850.000
         ADI       R3,REC.DRCB     DESTINATION ADDRESS                  0851.000
         LI        R4,RCB.SIZE     SIZE OF AN RCB                       0852.000
         BL        COPYSTRG        COPY RCB TO RDTR                     0853.000
         BL        CLEARRCB        CLEAR RCB                   85-0391  0854.000
         LW        R2,PROTADDR     RESTORE PROTOTYPE ADDRESS            0855.000
*                                                                       0856.000
* ATTEMPT TO ALLOCATE THE FILE TO BE SAVED.                             0857.000
* ANY ERRORS CAUSE BIT B.RDTRFI TO BE SET IN FLAGWORD                   0858.000
* RDTR.BUF AND AN ERROR TO BE PRODUCED.                                 0859.000
*                                                                       0860.000
         ADI       R2,PROFVN.O     ADDRESS OF RID OF FILE               0861.000
         LA        R7,DISCFCB      FCB FOR 'DSC' LFC                    0862.000
         LW        R6,RRS.ACC3     READ EXCLUSIVE ACCESS                0863.000
         LW        R4,RRS.OPT1     AUTO OPEN, UNBLOCKED                 0864.000
         SPACE                                                          0865.000
*                                                                       0866.000
*  ALLOW EXPLICIT SHARED ALLOCATION OF (USER'S) FILE           ! 84-00200867.000
*  ALLOW IMPLICIT SHARED ALLOCATION OF (USER'S) FILE           !S870949 0868.000
*  IF EXCLUSIVE ALLOCATION IS DENIED                                    0869.000
*                                                                       0870.000
*  NOTE THAT THE SPR 87-0949 FIX IS ALSO HANDLED IN FUPUTL     !S870949 0871.000
*  SUBROUTINE X.ALOC6.  THE  REST OF THE FIX WAS HANDLED AS    !S870949 0872.000
*  A QAR201-34.  NOW, IMPLICIT SHARED READ ACCESS IS GIVEN     !S870949 0873.000
*  ONLY IF NO OTHER WRITER OR APPENDER IS CURRENT WITH THE     !S870949 0874.000
*  READER.  THIS IS DONE TO AVOID A DEADLOCK SITUATION.        !S870949 0875.000
*  ERROR RETURN STATUS IS RM54.                                !S870949 0876.000
*                                                                       0877.000
         SBM       NONEXCL,FLAGBITS                                     0878.000
*        SBM       IMPLSHAR,FLAGBITS  NOT IMPL. SHAR. !84-0020 !S870949 0879.000
         SPACE                                                          0880.000
         BL        X.ALOC6         ATTEMPT THE ALLOCATION               0881.000
         BCT       1,RDTR2         BRANCH IF ERROR                      0882.000
*                                                                       0883.000
* ALL LOOKS GOOD.                                                       0884.000
* RETURN R5 (THE ALLOCATION INDEX FROM X.ALOC6) TO THE                  0885.000
* USER READY FOR THE EVENTUAL DEALLOCATION.                             0886.000
*                                                                       0887.000
         STW       R5,5W,R1                                             0888.000
*                                                                       0889.000
* GET THE RD FOR THE FILE TO BE SAVED.                                  0890.000
* THE BUFFER INTO WHICH THE RD IS READ (RD.BUF) IS MAPPED               0891.000
* ONTO THE SECOND 192 WORDS OF THE RDTR BUFFER (RDTR.BUF).              0892.000
* ANY ERRORS ON ACCESS TO THE RD CAUSE BIT B.RDTRRD TO BE SET           0893.000
* IN FLAGWORD RDTR.BUF AND AN ERROR TO BE PRODUCED.                     0894.000
*                                                                       0895.000
         LW        R2,PROTADDR     PROTOTYPE ADDRESS                    0896.000
         ADI       R2,PROFVN.O     RID ADDRESS                          0897.000
         LA        R7,RD1.BUF      TO HOLD RD                           0898.000
*        TESTSAM                   SYSTEM ADMINISTRATOR??               0899.000
*        BCF       1,RDTR6         BRANCH IF NOT SAM                    0900.000
*        TRR       R2,R3           RID ADDRESS TO R3                    0901.000
*        BL        MODRD0          GET FOR MODIFICATION                 0902.000
*        BCT       1,RDTR1         BRANCH IF CANNOT GET                 0903.000
*        BU        RDTR7           COMMON CODE AGAIN                    0904.000
*                                                                       0905.000
RDTR6    BL        GETRD0          GET RD BY RID                        0906.000
         BCT       1,RDTR1         BRANCH IF AN ERROR                   0907.000
         SPACE                                                          0908.000
*                                                                       0909.000
*  INSURE "CURRENT SYSTEM IMAGE FLAG" IN RES. DESCR. IS TURNED OFF      0910.000
*  SO THIS INFORMATION IS NOT PROPAGATED WHEN THE FILE IS RESTORED !!!  0911.000
*                                                                       0912.000
         LA        R3,RD1.BUF      BUFFER HOLDING R.D. FOR FILE TO BE   0913.000
*                                  SAVED                                0914.000
         ZBM       RD.DEFI,RD.SFLGS,X3  TURN FLAG OFF                   0915.000
         BNS       RDTR6.1         IS THIS SYSTEM IMAGE        83-0179  0916.000
         TESTSAM                   SYS. ADMIN. DOING SAVE ?    83-0179  0917.000
         BCF       1,RDTR6.1       BRANCH IF NOT               83-0179  0918.000
         SBM       B.DFLT,FLAGBITS SET FLAG TO SHOW SYS IMAGE  83-0179  0919.000
         SPACE                                                          0920.000
*                                                                       0921.000
* ADD THE SAVE TIME TO THE RD TO BE WRITTEN TO TAPE.                    0922.000
* IT WAS OBTAINED AT THE START OF THE SAVE AND IS IN                    0923.000
* THE DOUBLE WORD 'FUPTIME'.                                            0924.000
*                                                                       0925.000
RDTR6.1  LA        R3,RD1.BUF      RD BUFFER ADDRESS                    0926.000
         STW       R1,STACKPTR     SAVE THE STACK POINTER               0927.000
         LA        R1,SAVTIME      ADDRESS OF CURRENT TIME BUFFER       0928.000
         ORMW      R1,=X'01000000'  INDICATE BINARY FORMAT              0929.000
         SVC       2,X'50'         GET THE CURRENT TME                  0930.000
         LW        R1,STACKPTR     RESTORE THE STACK POINTER            0931.000
         LD        R6,SAVTIME      CURRENT TIME                         0932.000
         STW       R6,RD.SVDAT,R3  DATE                                 0933.000
         STW       R7,RD.SVTIM,R3  TIME                                 0934.000
*                                                                       0935.000
         BU        RDTR4           WRITE THE RDTR TO TAPE               0936.000
*                                                                       0937.000
* CANNOT GET RD FOR REASON IN R7.                                       0938.000
* SET B.RDTRRD IN FLAGWORD, LOG THE ERROR AND THEN WRITE                0939.000
* THE RDTR TO TAPE                                                      0940.000
*                                                                       0941.000
RDTR1    LA        R3,RDTR.BUF                                          0942.000
         SBM       B.RDTRRD,REC.PERR,R3                                 0943.000
         BL        ERROR           LOG THE ERROR                        0944.000
RDTR3    SBM       CC1,0W,R1       SET ERROR EXIT INDICATOR             0945.000
RDTR4    WRITES    TAPFCB,RDTR.BUF,RDTR.SIZ                             0946.000
         BCT       CC2,SAVE35      GO FOR I/O ERROR(S)                  0947.000
*                                                                       0948.000
         POP                       RESTORE REGISTERS                    0949.000
         TRSW      R0                                                   0950.000
*                                                                       0951.000
* CANNOT ALLOCATE FILE FOR REASON IN R7.                                0952.000
* SET B.RDTRFI IN FLAGWORD, LOG THE ERROR AND WRITE THE RDTR            0953.000
* TO TAPE.                                                              0954.000
*                                                                       0955.000
RDTR2    LA        R3,RDTR.BUF                                          0956.000
         SBM       B.RDTRFI,REC.PERR,R3                                 0957.000
         LW        R2,PROTADDR                                          0958.000
         BL        ERROR           LOG THE ERROR                        0959.000
         BU        RDTR3           COMMON EXIT                          0960.000
         TITLE     WRITE THE FILE DATA TO TAPE                          0961.000
*                                                                       0962.000
* THIS ROUTINE IS CALLED WHEN THE DISC FILE IS TO BE                    0963.000
* COPIED TO TAPE.                                                       0964.000
*                                                                       0965.000
* INPUTS:                                                               0966.000
*        R2 = PROTOTYPE ADDRESS IN CASE OF ERRORS TO BE REPORTED        0967.000
*        R5 = ALLOCATION INDEX FROM THE ALLOCATE (FOR THE DEALLOCATE)   0968.000
*                                                                       0969.000
* OUTPUTS:                                                              0970.000
*        NONE                                                           0971.000
*                                                                       0972.000
* IF A TAPE ERROR OCCURS THEN AN I/O ABORT IS MADE.                     0973.000
*                                                                       0974.000
* IF A DISC READ ERROR OCCURS THEN A MESSAGE IS PRINTED AND             0975.000
* A RETURN TO THE CALLER MADE FOR AN EOF TO BE ADDED TO THE             0976.000
* TAPE.                                                                 0977.000
*                                                                       0978.000
* IF A DISC ERROR OCCURS WHERE DATA WAS NOT WRITTEN TO TAPE     S860784 0979.000
* THEN THE RDTR IS WRITTEN OVER TO INDICATE FILE DATA NOT SAVED.S860784 0980.000
*                                                                       0981.000
* R4 - THE NUMBER OF TIMES TO RETRY AFTER GETTING AN I/O ERROR  S860784 0982.000
*      READING A FILE FROM DISC.                                S860784 0983.000
*                                                                       0984.000
*                                                                       0985.000
WRITDATA EQU       $                                                    0986.000
         PUSH                      SAVE REGISTERS                       0987.000
         LI        R4,IOERRTRY     INIT I/O ERROR RETRY         S860784 0988.000
*                                                                       0989.000
* THE LFC DSC IS USED TO READ THE DISC FILE BLOCKS, AND THE             0990.000
* LFC OUT IS USED TO WRITE TO TAPE.                                     0991.000
* THE BUFFER TAPBUFF IS THE COMMON LINK                                 0992.000
*                                                                       0993.000
* READ DISC BLOCKS                                                      0994.000
*                                                                       0995.000
WRIT1    READS     DISCFCB,TAPBUFF,IOBUFFSZ                             0996.000
         BCT       1,WRIT2         BRANCH IF EOF/EOM                    0997.000
         BCT       2,WRIT3         BRANCH IF DISC READ ERROR            0998.000
*                                                                       0999.000
* O.K. SO WRITE THE BLOCKS OUT TO TAPE, R7 CONTAINS #BLOCKS ALREADY     1000.000
* AND R6 CONTAINS THE ADDRESS OF THE BUFFER TAPBUFF ALREADY             1001.000
*                                                                       1002.000
WRIT1.1  WRITES    TAPFCB                                               1003.000
         BCT       1,SAVE36        BRANCH TO ERROR IF EOF/EOM           1004.000
         BCT       2,SAVE35        BRANCH TO ERROR IF I/O PROBLEM       1005.000
*                                                                       1006.000
*        IF THIS IS A MULTIVOLUME TAPE, WE NEED TO SEE IF WE    S881599 1007.000
*        HAVE REACHED THE POINT AT WHICH WE NEED TO DISMOUNT    S881599 1008.000
*        THE OLD TAPE AND MOUNT A NEW ONE.  IF SO, WE WILL      S881599 1009.000
*!       WRITE A MESSAGE TO THE SLO INDICATING THAT A NES881599 S881599A1010.000
*!       TAPE VOLUME HAS BEEN MOUNTED.                  S881599 S881599A1011.000
*        SET A FLAG TO INDICATE THAT AFTER THE NEXT WRITE THE   S881599A1012.000
*        NEW TAPE WILL HAVE BEEN MOUNTED, SO WE SHOULD OUTPUT   S881599A1013.000
*        THE 'NEW TAPE MOUNTED' MESSAGE TO THE SLO.             S881599A1014.000
*                                                               S881599 1015.000
         TBM       MULTIVOL,FLAGBIT2  MULTIVOLUME TAPE?         S881599 1016.000
         BNS       WRIT1.5         NO - CONTINUE                S881599 1017.000
         TBM       31,FCB.SFLG,X2  UNIT EXCEPTION?              S881599 1018.000
*        BNS       WRIT1.5         NO - CONTINUE        S881599 S881599A1019.000
         BNS       WRIT1.3         NO - CHECK LAST WRITE        S881599A1020.000
         LW        R2,FCB.FATA,X2  GET FAT ADDRESS              S881599A1021.000
         TBM       3,DFT.ACF,X2    EOT?                         S881599A1022.000
         BNS       WRIT1.5         NO - CONTINUE                S881599A1023.000
         SBM       CHANGTAP,FLAGBIT2  OUTPUT SLO MSG NEXT TIME  S881599A1024.000
         BU        WRIT1.5         GET NEXT DATA                S881599A1025.000
WRIT1.3  CEQU      $                                            S881599A1026.000
         ZBM       CHANGTAP,FLAGBIT2  EOT AT LAST WRITE?        S881599A1027.000
         BNS       WRIT1.5         NO - CONTINUE                S881599A1028.000
         LW        R2,FCB.FATA,X2  GET FAT ADDRESS              S881599 1029.000
*        TBM       3,DFT.ACF,X2    EOT?                 S881599 S881599A1030.000
*        BNS       WRIT1.5         NO - CONTINUE        S881599 S881599A1031.000
         LA        R3,MV.BLK       OUTPUT BLOCK                 S881599 1032.000
         LB        R6,MTF.VOL,X2   GET VOLUME NUMBER            S881599 1033.000
*        ADI       R6,1            INCREMENT TO NEXT VOLS881599 S881599A1034.000
         STW       R6,0,X3         STORE IN MESSAGE             S881599 1035.000
         LA        R2,MVMSG        MULTIVOLUME MESSAGE          S881599 1036.000
         BL        FORMATOT        OUTPUT MESSAGE TO SLO        S881599 1037.000
WRIT1.5  CEQU      $                                            S881599 1038.000
         BU        WRIT1           LOOP FOR NEXT DATA                   1039.000
*                                                                       1040.000
*                                                                       1041.000
* EOF/EOM WAS FOUND ON THE DISC FILE. THE SAVE OF THE FILE              1042.000
* HAS BEEN COMPLETED SO RETURN TO THE CALLER.                           1043.000
*                                                                       1044.000
WRIT2    LW        R4,IOERRCNT     WAS THERE ANY I/O ERRORS?            1045.000
         BZ        WRIT2.1         NO, BRANCH                           1046.000
         LW        R2,PROTADDR     GET PROTOTYPE ADDRESS                1047.000
         BL        ERRDISC         DISPLAY DISC I/O ERROR MESSAGE       1048.000
         ZMW       IOERRCNT        RESET IO ERROR COUNT                 1049.000
WRIT2.1  BL        X.DALC          DE-ALLOCATE FILE                     1050.000
         BNS       WRIT2.5         GO FOR NO ERROR(S)                   1051.000
         LA        R6,GEN.M006     ERROR MESSAGE                        1052.000
*  R7 HAS MODULE #/ERROR # RETURNED FROM SERVICE SUBROUTINE             1053.000
         BL        FUPABORT        ABORT ROUTINE                        1054.000
         SPACE     2                                                    1055.000
WRIT2.5  EQU       $                                                    1056.000
         POP                       RESTORE REGISTERS                    1057.000
         TRSW      R0                                                   1058.000
*                                                                       1059.000
* AN ERROR WAS DETECTED WHEN READING THE DISC FILE.                     1060.000
* LOG THE ERROR (UNRECOVERABLE I/O ERROR - FILE NOT SAVED)              1061.000
* AND RETURN TO THE CALLER.                                             1062.000
*                                                                       1063.000
WRIT3    EQU       $                                                    1064.000
         SPACE                                                          1065.000
*  R2 CONTAINS FCB ADDRESS                                              1066.000
         TBM       4,FCB.SFLG,R2   WAS THE A BAD ERROR?                 1067.000
         BS        WRIT3.1         YES, BRANCH                          1068.000
         ABM       31,IOERRCNT     INCREAMENT I/O ERROR COUNT           1069.000
         BIB       R4,WRIT1.1      BRANCH UNTIL RETRY COUNT 0   S860784 1070.000
*!       BU        WRIT1.1         GO ON                        S860784 1071.000
WRIT3.1  LA        R6,GEN.M007     I/O ERROR MESSAGE                    1072.000
         BL        ERRORIO         WRITE ERROR MESSAGE                  1073.000
         LW        R7,FUPERR1      ERROR CODE                           1074.000
         LW        R2,2W,R1        GET PROTOTYPE ADDRESS                1075.000
         BL        ERROR           LOG THE ERROR                        1076.000
         BL        RWRDTR          RE-WRIT THE RDTR TO INDICATE S860784 1077.000
*                                  FILE DATA NOT SAVED.         S860784 1078.000
         SBM       1,0W,X1         SET CC1 - ERROR ON FILE READ S860784 1079.000
         BU        WRIT2                                                1080.000
         TITLE     REWRITE RDTR TO INDICATE FILE DATA NOT SAVED S860784 1081.000
*                                                               S860784 1082.000
* RWRDTR  WILL PERFORM THE FOLLOWING:                           S860784 1083.000
*        (1)  BACK ONE FILE ON TAPE                             S860784 1084.000
*        (2)  FORWARD ONE RECORD ON TAPE (PASSED THE EOF)       S860784 1085.000
*        (3)  SET B.RDTRFI OF RDTR BUFFER                       S860784 1086.000
*        (4)  REWRITE THE RDTR TO TAPE                          S860784 1087.000
*        (4)  WRITE AN EOF MARKER                               S860784 1088.000
*                                                               EQIC360 1089.000
* IF USING A QIC CARTRIDGE TAPE DRIVE, IT WILL                  EQIC360 1090.000
*        (1)  WRITE A LOGICAL EOF ON TAPE                       EQIC360 1091.000
*                                                               S860784 1092.000
RWRDTR   EQU       $                                            S860784 1093.000
         PUSH                      PUSH REGISTERS INTO STACK    S860784 1094.000
         LA        R2,TAPFCB       GET TAP FCB ADDRESS          S860784 1095.000
         LI        R4,1            SET R4 TO MEAN ONE REC(&FIL) S860784 1096.000
         LA        R3,DOBLOCK      DEFAULT OPTION BLOCK ADDR    EQIC360 1097.000
         TBM       OPT.B.SE,OPT.FLGS,X3 SOFT EOF?               EQIC360 1098.000
         BS        SCSI10          IF SO, DIFFERENT EOF         EQIC360 1099.000
         BL        M.BCKF          DO A BACK FILE TO TAPE       S860784 1100.000
         BCT       CC2,SAVE35      BRANCH IF I/O ERROR          S860784 1101.000
         BL        M.FWDR          DO A FORWARD PASSED EOF      S860784 1102.000
         BCT       CC2,SAVE35      BRANCH IF I/O ERROR          S860784 1103.000
         LA        R3,RDTR.BUF     GET RDTR BUFFER ADDRESS      S860784 1104.000
         SBM       B.RDTRFI,REC.PERR,X3  SET NO FILE DATA       S860784 1105.000
         WRITES    TAPFCB,RDTR.BUF,RDTR.SIZ                     S860784 1106.000
         BCT       CC2,SAVE35      BRANCH IF I/O ERROR          S860784 1107.000
         BL        M.WEOF          WRITE EOF TO TAPE            S860784 1108.000
         BCT       CC2,SAVE35      BRANCH IF I/O ERROR          EQIC360 1109.000
         BU        SCSI11          RETURN                       EQIC360 1110.000
SCSI10   CEQU      $                                            EQIC360 1111.000
         BL        M.WEOFL         WRITE EOF TO TAPE            EQIC360 1112.000
         BCT       CC2,SAVE35      BRANCH IF I/O ERROR          S860784 1113.000
SCSI11   CEQU      $                                            EQIC360 1114.000
         POP                       POP REGISTERS                S860784 1115.000
         TRSW      R0              RETURN TO CALLER             S860784 1116.000
         TITLE     UPDATE RD TO CONTAIN THE SAVE DATE                   1117.000
*                                                                       1118.000
* THIS ROUTINE UPDATES THE RD (ON THE DISC) TO CONTAIN THE SAVE DATE OF 1119.000
* THE FILE IF THE CURRENT USER IS THE SYSTEM ADMINISTRATOR.             1120.000
*                                                                       1121.000
* INPUTS:                                                               1122.000
*        NONE                                                           1123.000
*                                                                       1124.000
* OUTPUTS:                                                              1125.000
*        CC1 IS SET IF ERRORS ON THE REWRITE                            1126.000
*        R7 = ERROR STATUS IF ERRORS OCCUR                              1127.000
*                                                                       1128.000
MODIFYRD EQU       $                                                    1129.000
         ANMW      R0,ADR.MASK     CLEAR CC'S                           1130.000
         PUSH                      SAVE REGISTERS                       1131.000
         TESTSAM                   SYSTEM ADMINISTRATOR??               1132.000
         BCF       1,MODIFY1       BRANCH IF NOT SAM                    1133.000
         SPACE                                                          1134.000
*                                                                       1135.000
* DO "MODIFY DESCRIPTOR" TO CHANGE THE SAVE DATE IN THE RESOURCE        1136.000
* DESCRIPTOR                                                            1137.000
*                                                                       1138.000
         LW        R3,PROTADDR     PROTOTYPE ADDRESS                    1139.000
         ADI       R3,PROFVN.O     RID ADDRESS                          1140.000
         LA        R7,RD2.BUF      BUFFER TO HOLD RD RETURNED FROM SERV.1141.000
         BL        MODRD0          MODIFY DESCRIPTOR  --  GETS RD ...   1142.000
*  EVEN THOUGH ALREADY HAVE IT (WITH THE UPDATED SAVE DATE) !!!         1143.000
         BS        MODIFY2         GO FOR CAN'T GET                     1144.000
         SPACE                                                          1145.000
         LA        R7,RD1.BUF      ADDRESS OF RD BUFFER                 1146.000
         ZBM       B.DFLT,FLAGBITS IS THIS THE SYSTEM IMAGE?   83-0179  1147.000
         BNS       MOD.1           BRANCH IF NOT               83-0179  1148.000
         XCR       R7,R3           PUT ADDRESS IN INDEX REG    83-0179  1149.000
         SBM       RD.DEFI,RD.SFLGS,X3 MARK AS SYS IMAGE       83-0179  1150.000
         XCR       R3,R7           SWITCH REGS BACK            83-0179  1151.000
MOD.1    BL        MODRD1          REWRITE DESCRIPTOR                   1152.000
         BCT       1,MODIFY2       BRANCH IF NOT SUCCESSFUL             1153.000
*                                                                       1154.000
MODIFY1  POP                       RESTORE REGISTERS                    1155.000
         TRSW      R0                                                   1156.000
*                                                                       1157.000
* AN ERROR OCCURRED WHEN ATTEMPTING TO REWRITE THE DESCRIPTOR           1158.000
* SET CC1 AND RETURN TO THE CALLER WITH THE ERROR CODE IN R7            1159.000
*                                                                       1160.000
MODIFY2  SBM       CC1,0W,R1       SET CC1                              1161.000
         STW       R7,7W,R1        RETURN R7                            1162.000
         BU        MODIFY1         COMMON EXIT                          1163.000
         TITLE     WRITE RECORD TO IO2                                  1164.000
*                                                                       1165.000
* THIS ROUTINE ADDS A RECORD TO IO2BUFF, SPILLING THE CURRENT           1166.000
* CONTENTS TO DISC IF THE BUFFER BECOMES FULL.                          1167.000
*                                                                       1168.000
* INPUTS:                                                               1169.000
*        R2 = ADDRESS OF START OF RECORD TO BE WRITTEN                  1170.000
*        R7 = SIZE OF RECORD TO BE WRITTEN                              1171.000
*                                                                       1172.000
* OUTPUTS:                                                              1173.000
*        NONE                                                           1174.000
*                                                                       1175.000
WRITEIO2 EQU       $                                                    1176.000
         PUSH                      SAVE REGISTERS                       1177.000
*                                                                       1178.000
* SEE IF THERE IS ROOM IN THE CURRENT BUFFER                            1179.000
*                                                                       1180.000
         LW        R3,NEXTIO2      NEXT FREE SLOT                       1181.000
         CAMW      R3,LASTIO2      OVER LAST POSSIBLE SLOT?             1182.000
         BLE       WRITE1          BRANCH IF ROOM FOR ENTRY             1183.000
*                                                                       1184.000
* MUST SPILL THE CURRENT BUFFER TO A TEMPORARY DISC FILE                1185.000
* AND REINITIALISE BUFFER POINTERS.                                     1186.000
*                                                                       1187.000
         BL        SPILLIO2        SPILL TO DISC                        1188.000
*                                                                       1189.000
* R7 CONTAINS THE RECORD LENGTH ALREADY                                 1190.000
*                                                                       1191.000
         BL        INITIO2         REINITIALISE POINTERS                1192.000
         LW        R3,NEXTIO2      FIRST FREE SLOT                      1193.000
*                                                                       1194.000
* NOW ADD THE NEW ENTRY TO THE DIRECTORY BUFFER.                        1195.000
*                                                                       1196.000
* R2 CONTAINS THE ADDRESS OF THE ENTRY                                  1197.000
* R3 CONTAINS THE ADDRESS OF THE DESTINATION                            1198.000
* R4 CONTAINS THE LENGTH OF THE RECORD                                  1199.000
*                                                                       1200.000
WRITE1   TRR       R7,R4           SIZE OF RECORD TO BE COPIED          1201.000
         BL        COPYSTRG        DO THE COPY                          1202.000
*                                                                       1203.000
* BUMP THE LOCATION NEXTIO2 TO POINT TO THE NEXT FREE ENTRY             1204.000
*                                                                       1205.000
         ARMW      R4,NEXTIO2      UPDATE POINTER TO NEXT FREE SLOT     1206.000
         POP                       RESTORE REGISTERS                    1207.000
         TRSW      R0                                                   1208.000
         TITLE     READ FILE IO2 IF ENTRY NOT IN BUFFER                 1209.000
*                                                                       1210.000
* THIS ROUTINE CHECKS IF THE CURRENT ENTRY IS IN IO2BUFF.               1211.000
* IF IT IS NOT THEN THE FILE IO2 IS READ AND THE BUFFER                 1212.000
* POINTERS RESET TO BEGINNING OF BUFFER.                                1213.000
*                                                                       1214.000
* INPUTS:                                                               1215.000
*        R7 = SIZE OF CURRENT IO2BUFF ENTRY                             1216.000
*                                                                       1217.000
* OUTPUTS:                                                              1218.000
*        NONE                                                           1219.000
*                                                                       1220.000
READIO2  EQU       $                                                    1221.000
         PUSH                      SAVE REGISTERS                       1222.000
         LW        R2,NEXTIO2      CURRENT POINTER                      1223.000
         CAMW      R2,LASTIO2      IN CURRENT BUFFER??                  1224.000
         BLE       READ1           BRANCH IF IN BUFFER                  1225.000
*                                                                       1226.000
         READS     IO2FCB,IO2BUFF,IOBUFFSZ                              1227.000
         BCT       1,SAVE36        BRANCH TO ERROR IF EOF/EOM           1228.000
         BCT       2,SAVE35.1      BRANCH TO ERROR IF I/O       S860212 1229.000
*                                                                       1230.000
*  R7 -- SIZE OF CURRENT IO2BUFF ENTRY DESTROYED BY I/O CALL.           1231.000
*  RELOAD IT FROM THE STACK                                             1232.000
*                                                                       1233.000
         LW        R7,7W,X1                                             1234.000
         BL        INITIO2         REINITIALISE POINTERS                1235.000
READ1    POP                       RESTORE REGISTERS                    1236.000
         TRSW      R0                                                   1237.000
         TITLE     SPILL IO2BUFF TO FILE                                1238.000
*                                                                       1239.000
* THIS ROUTINE IS USED TO WRITE THE BUFFER IO2BUFF TO FILE              1240.000
* WHEN IT BECOMES FULL.                                                 1241.000
*                                                                       1242.000
SPILLIO2 PUSH                      SAVE REGISTERS                       1243.000
         SBM       B.SPILL,FLAGWORD                                     1244.000
         BS        SPILL1          BRANCH IF NOT THE FIRST SPILL        1245.000
         SPACE                                                          1246.000
         SBM       IO2.F,FLAGBITS  IS SCRATCH FILE #2 ALLOCATED ???     1247.000
         BS        WIO2.030        GO FOR FILE ALREADY ALLOCATED        1248.000
*                                                                       1249.000
*  ALLOCATE & OPEN THE TEMPORARY FILE                                   1250.000
*                                                                       1251.000
***  NOTE:  MUST ALLOCATE THE TEMPORARY FILE WITH READ & UPDATE ACCESS  1252.000
*  SINCE THE SORT CODE USES THE COMPATIBILITY INTERFACE ... AND THE     1253.000
*  INTERFACE ASSIGNS READ ACCESS FOR READ & UPDATE ACCESS FOR READ/WRITE1254.000
*                                                                       1255.000
         SPACE                                                          1256.000
WIO2.005 EQU       $                                                    1257.000
         SPACE                                                          1258.000
         LW        R7,IO2Z         LOGICAL FILE CODE G-STRING           1259.000
         BL        BUILDRR2        BUILD AN RRS ENTRY OF TYPE 2         1260.000
         LA        R2,RRS.BUF      BUFFER CONTAINING RRS ENTRY          1261.000
         ZBM       RR.OPEN,RR.OPTS,X2   NO AUTOMATIC OPEN               1262.000
         SBM       RR.READ,RR.ACCS,X2   ALSO WANT READ ACCESS           1263.000
         BL        X.ALOC          ALLOCATE THE FILE                    1264.000
         BNS       WIO2.020        GO FOR NO ERROR(S)                   1265.000
*                                                                       1266.000
*  ERROR OCCURED - CHECK ERROR CODE RETURNED TO SEE IF TEMPORARY FILE   1267.000
*  IS ALREADY ALLOCATED BY THIS TASK.                                   1268.000
*                                                                       1269.000
         TRR       R7,R6           DITTO                                1270.000
         SLL       R6,8            MASK MODULE NUMBER                   1271.000
         SRL       R6,8                                                 1272.000
         CI        R6,REMM14       RESOURCE ALREADY ALLOCATED ???       1273.000
         BEQ       WIO2.010        GO FOR RES. ALREADY ALLOCATED        1274.000
*                                                                       1275.000
*  SOME OTHER ERROR HAS OCCURED - ABORT                                 1276.000
*  R7 CONTAINS MODULE #/ERROR # COMBO AS RETURNED FROM SUBROUTINE       1277.000
*                                                                       1278.000
         LA        R6,GEN.M002     ERROR MESSAGE                        1279.000
         BL        FUPABORT        ABORT ROUTINE - ENTRY POINT          1280.000
         SPACE     2                                                    1281.000
WIO2.010 EQU       $                                                    1282.000
         LA        R2,IO2FCB       FCB ADDRESS                          1283.000
         LW        R2,FCB.FATA,X2  FAT ADDRESS FROM FCB                 1284.000
         TBM       RR.READ,0B,X2   WAS READ ACCESS SPECIFIED AT         1285.000
*  ALLOCATION TIME ???                                                  1286.000
         BS        WIO2.030        GO FOR HAVE READ ACCESS              1287.000
*                                                                       1288.000
*  DON'T HAVE REQUIRED READ ACCESS, MUST DEALLOCATE FILE & REALLOCATE   1289.000
*                                                                       1290.000
         LA        R5,IO2FCB       FCB ADDRESS                          1291.000
         BL        X.DALC          DEALLOCATE FILE                      1292.000
         BNS       WIO2.005        GO FOR NO ERROR(S)                   1293.000
         LA        R6,GEN.M006     ERROR MESSAGE                        1294.000
*  R7 HAS MODULE #/ERROR # RETURNED FROM SERVICE SUBROUTINE             1295.000
         BL        FUPABORT        ABORT ROUTINE                        1296.000
         SPACE     2                                                    1297.000
WIO2.020 EQU       $                                                    1298.000
         LH        R7,CNP.ACC5     UPDATE ACCESS                        1299.000
         LA        R5,IO2FCB       FCB ADDRESS                          1300.000
         BL        X.OPEN          OPEN FILE WITH UPDATE ACCESS         1301.000
         BNS       WIO2.040        GO FOR NO ERROR(S)                   1302.000
*  OPEN FAILED  --  ISSUE ERROR MESSAGE & ABORT                         1303.000
         LA        R6,GEN.M002     ERROR MESSAGE                        1304.000
*  R7 ALREADY CONTAINS MODULE #/ERROR # COMBO AS RETURNED FROM SERVICE  1305.000
*  SUBROUTINE                                                           1306.000
         BL        FUPABORT        ABORT ROUTINE - ENTRY POINT          1307.000
         SPACE     2                                                    1308.000
WIO2.030 EQU       $                                                    1309.000
         LA        R2,IO2FCB       FCB ADDRESS                          1310.000
         BL        M.RWND          REWIND THE FILE IF IT WAS ALREADY    1311.000
*                                  ALLOCATED                            1312.000
         BCT       CC2,SAVE35.1    GO FOR I/O ERROR(S)          S860212 1313.000
WIO2.040 EQU       $                                                    1314.000
         SPACE                                                          1315.000
SPILL1   WRITES    IO2FCB,IO2BUFF,IOBUFFSZ                              1316.000
         BCT       1,SAVE36        BRANCH TO ERROR IF EOF/EOM           1317.000
         BCT       2,SAVE35.1      BRANCH TO ERROR IF I/O       S860212 1318.000
         POP                       RESTORE REGISTERS                    1319.000
         TRSW      R0                                                   1320.000
         TITLE     REWIND IO2 FILE                                      1321.000
*                                                                       1322.000
* THIS ROUTINE IS USED WHEN WRITING TO THE SCRATCH FILE IO2             1323.000
* HAS BEEN COMPLETED, AND IT IS REQUIRED TO REWIND IT.                  1324.000
*                                                                       1325.000
* INPUTS:                                                               1326.000
*        R7 = RECORD SIZE                                               1327.000
*                                                                       1328.000
* OUTPUTS:                                                              1329.000
*        NONE                                                           1330.000
*                                                                       1331.000
REWNDIO2 EQU       $                                                    1332.000
         PUSH                      SAVE REGISTERS                       1333.000
*                                                                       1334.000
* IF THE FILE WAS NEVER USED, JUST RESET THE BUFFER POINTERS.           1335.000
*                                                                       1336.000
* IF THE FILE WAS USED, THEN REWIND THE FILE, READ THE FIRST            1337.000
* BUFFER FULL, AND RESET THE BUFFER POINTERS.                           1338.000
*                                                                       1339.000
         TBM       B.SPILL,FLAGWORD     ANY SPILAGE AT ALL??            1340.000
         BNS       REWND1          BRANCH IF NO SPILLAGE                1341.000
*                                                                       1342.000
         TRR       R7,R4           SAVE OVER THE READ                   1343.000
*                                                                       1344.000
         LA        R2,IO2FCB                                            1345.000
         BL        M.RWND          REWIND THE FILE                      1346.000
         BCT       CC2,SAVE35.1    GO FOR I/O ERROR(S)          S860212 1347.000
*                                                                       1348.000
         READS     ,IO2BUFF,IOBUFFSZ    READ FIRST BUFFER FULL          1349.000
         BCT       1,SAVE36        BRANCH TO ERROR IF EOF/EOM           1350.000
         BCT       1,SAVE35.1      BRANCH TO ERROR IF I/O       S860212 1351.000
         TRR       R4,R7           SET UP RECORD SIZE AGAIN             1352.000
*                                                                       1353.000
REWND1   BL        INITIO2         REINITIALISE BUFFER POINTERS         1354.000
*                                  R7 CONTAINS RECORD SIZE ALREADY      1355.000
         POP                       RESTORE REGISTERS                    1356.000
         TRSW      R0                                                   1357.000
         TITLE     OPEN SAVE TAPE -- LFC "TAP"                          1358.000
*++                                                                     1359.000
*                                                                       1360.000
*  OPENTAP - MAKE SURE LFC "TAP" WAS ASSIGNED, IT IS UNBLOCKED, AND     1361.000
*            HAVE WRITE ACCESS.                                         1362.000
*                                                                       1363.000
*--                                                                     1364.000
         SPACE                                                          1365.000
OPENTAP  EQU       $                                            EQIC360A1366.000
         SPACE                                                          1367.000
         PUSH                      SAVE REGS                            1368.000
*                                                                       1369.000
*  SEE IF TAPE IS ASSIGNED AND UNBLOCKED MODE WAS SPECIFIED             1370.000
*                                                                       1371.000
         LW        R7,TAPZ         LFC G-STRING                         1372.000
         BL        X.RINQ          RESOURCE INQUIRY SET-UP ROUTINE      1373.000
*                                                                       1374.000
*  R5 = 0 FOR UNASSIGNED ELSE ALLOCATION INDEX                          1375.000
*  R7 = CNP STATUS                                                      1376.000
*  "INQ.BUF" = BUFFER HOLDING RETURNED INQUIRY INFORMATION              1377.000
*                                                                       1378.000
         BNS       CON.003         GO FOR INQUIRY ACCEPTED & COMPLETE   1379.000
*                                                                       1380.000
*  LOGICAL FILE CODE "TAP" MUST NOT BE ASSIGNED -- HAVE TO ABORT        1381.000
*                                                                       1382.000
         LA        R7,GEN.M012     ERROR MESSAGE                        1383.000
         BL        FUPABRT3        ENTRY POINT IN ABORT ROUTINE         1384.000
         SPACE     2                                                    1385.000
CON.003  EQU       $               LFC ASSINGED, NOW CHECK FOR UNBLOCKED1386.000
         SPACE                                                          1387.000
*                                                                       1388.000
*  CHECK FAT TO SEE IF TAPE WAS ASSIGNED AS UNBLOCKED                   1389.000
*                                                                       1390.000
         LA        R2,INQ.BUF      BUFFER FILLED BY INQUIRY SERVICE     1391.000
         LW        R3,1W,X2        FAT ADDRESS FOR LFC "TAP"            1392.000
*!       TBM       0,DFT.FLGS,X3   BLOCKING BUFFER PRESENT BIT ! 32B01  1393.000
*!       BNS       CON.006         BRANCH FOR UNBLOCKED        ! 32B01  1394.000
*                                                                       1395.000
*  TAPE WAS ASSIGNED AS BLOCKED (SYSTEM DEFAULT) -- MUST ABORT          1396.000
*                                                                       1397.000
*!       LA        R7,GEN.M011     ERROR MESSAGE               ! 32B01  1398.000
*!       BL        FUPABRT3        ENTRY POINT IN ABORT ROUTINE! 32B01  1399.000
         SPACE     2                                                    1400.000
CON.006  EQU       $                                                    1401.000
         SPACE                                                          1402.000
         TBM       1,DFT.ACF,X3    MULTIVOLUME TAPE?            S881599 1403.000
         BNS       CON.007         NO - CONTINUE                S881599 1404.000
         SBM       MULTIVOL,FLAGBIT2 INDICATE MULTIVOLUME TAPE  S881599 1405.000
         SBM       CHANGTAP,FLAGBIT2 OUTPUT MSG FOR 1ST TAPE    S881599A1406.000
CON.007  CEQU      $                                            S881599 1407.000
         TBM       0,DFT.STB,X3    IS DEVICE OPEN ???                   1408.000
         BNS       CON.008         GO FOR NOT OPEN                      1409.000
*                                                                       1410.000
*  FILE IS OPEN -- NOW SEE IF CURRENT ACCESS MODE ALLOWS WRITE          1411.000
*                                                                       1412.000
         LB        R4,DFT.CACM,X3  CURRENT ACCESS MODE FROM FAT         1413.000
         CI        R4,WRITE.M      IS IT WRITE ACCESS ???       Q067-32C1414.000
         BEQ       CON.010         GO FOR WRITE ACCESS          Q067-32C1415.000
         CI        R4,UPDATE.M     IS IT UPDATE ACCESS ???              1416.000
         BEQ       CON.010         GO FOR UPDATE ACCESS                 1417.000
*                                                                       1418.000
*  DON'T HAVE DESIRED (WRITE) ACCESS, SO CLOSE & RE-OPEN                1419.000
*                                                                       1420.000
         LH        R7,CNP.ACCD     CNP OPTION FIELD VALUE               1421.000
         LA        R5,TAPFCB       FCB ADDRESS                          1422.000
         BL        X.CLOSE         CLOSE THE DEVICE                     1423.000
         BNS       CON.008         GO FOR NO ERRORS                     1424.000
*  CLOSE FAILED -- SO ABORT                                             1425.000
         LA        R6,GEN.M022     ERROR MESSAGE                        1426.000
*  R7 CONTAINS MODULE #/ERROR # COMBO RETURN FROM SERVICE               1427.000
         BL        FUPABORT        ABORT MODULE -- ENTRY POINT          1428.000
         SPACE     2                                                    1429.000
CON.008  EQU       $                                                    1430.000
         LW        R3,2W,X2        GET UDT ADDR                 EQIC360A1431.000
         STW       R3,UDTADDR      STORE FOR FUTURE REFERENCE   EQIC360A1432.000
*                                                                       1433.000
*        OPEN THE SAVE TAPE                                             1434.000
*                                                                       1435.000
         LA        R5,TAPFCB       FCB ADDR                             1436.000
         LH        R7,CNP.ACC8     UPDATE ACC., IMPL.SHAR., UBL.! 32B01 1437.000
         BL        X.OPEN          BUILD CNP & ISSUE "OPEN" SERVICE CALL1438.000
         BNS       CON.010         BRANCH FOR SUCCESSFUL OPEN           1439.000
*                                                                       1440.000
*        OPEN FAILED  --  ISSUE ERROR MESSAGE & TERMINATE THIS COMMAND  1441.000
*                                                                       1442.000
         LA        R6,GEN.M001     ERROR MESSAGE                        1443.000
*        R7 ALREADY CONTAINS MODULE #/ERROR #  --  AS                   1444.000
*        RETURNED FROM SERVICE ROUTINE                                  1445.000
         BL        FUPABORT        ABORT ROUTINE                        1446.000
         SPACE     2                                                    1447.000
CON.010  EQU       $                                                    1448.000
         LW        R7,TAPZ         LFC TAP                      EQIC360A1449.000
         BL        X.RINQ          M.INQUIRY SETUP AND CALL     EQIC360A1450.000
         BNS       CON.030         NO ERROR - CONTINUE          EQIC360A1451.000
         LA        R7,GEN.M012     ERROR MESSAGE                EQIC360A1452.000
         BL        FUPABRT3        ABORT ROUTINE                EQIC360A1453.000
CON.030  CEQU      $                                            EQIC360A1454.000
         LA        R2,INQ.BUF      GET BUFFER ADDRESS           EQIC360A1455.000
         LW        R3,2W,X2        GET UDT ADDRESS              EQIC360A1456.000
         CAMW      R3,UDTADDR      SAME AS BEFORE OPEN?         EQIC360A1457.000
         BEQ       CON.060         YES - NO CHANGES             EQIC360A1458.000
         LA        R2,DOBLOCK      DEFAULT OPTION BLOCK ADDRESS EQIC360A1459.000
         TBM       UDT.SEOF,UDT.OPT,X3  SOFT EOF MANAGEMENT?    EQIC360A1460.000
         BNS       CON.050         NO - RESET SEOF FLAG         EQIC360A1461.000
         SBM       OPT.B.SE,OPT.FLGS,X2 SOFT EOF MODE           EQIC360A1462.000
         BU        CON.060         AND EXIT                     EQIC360A1463.000
CON.050  CEQU      $                                            EQIC360A1464.000
         ZBM       OPT.B.SE,OPT.FLGS,X2  NO SEOF MODE           EQIC360A1465.000
CON.060  CEQU      $                                            EQIC360A1466.000
         SPACE                                                          1467.000
         POP                       RESTORE REGS                         1468.000
         TRSW      R0              RETURN                               1469.000
         TITLE     SAVE COMMAND STATE TABLES & ACTION ROUTINES          1470.000
*                                                                       1471.000
* A.CMD    - ACTION WHEN VALID SAVE COMMAND IS PARSED                   1472.000
*                                                                       1473.000
         SPACE                                                          1474.000
A.CMD    EQU       $                                                    1475.000
         SBM       SORT.F,FLAGBITS INDICATE SORTING IS MANDATORY        1476.000
         LA        R7,C.SAVE       GET ADDRESS OF COMMAND PROCESSOR     1477.000
         STW       R7,COMDADDR     SAVE FOR DISPATCHER                  1478.000
         SBM       SAVEFLAG,FLAGBITS INDICATE SAVE COMMAND      EQIC360 1479.000
         TRSW      R0              RETURN TO PARSER                     1480.000
         SPACE                                                          1481.000
         BOUND     1W              ALIGN                                1482.000
         SPACE                                                          1483.000
*++                                                                     1484.000
* S.SAVCMD - STATE TABLES FOR SAVE COMMAND                              1485.000
*                                                                       1486.000
* COMMAND SYNTAX:                                                       1487.000
*                                                                       1488.000
*  SAVE  GLOBAL_OPTIONS  [PATH=]  PATHNAME  LOCAL_OPTIONS ,             1489.000
*        [PATH=] PATHNAME  LOCAL_OPTIONS  [ , . . . ]                   1490.000
*                                                                       1491.000
* OPTIONS:                                                              1492.000
*                                                                       1493.000
*        ***  ALL OPTIONS CAN BE SPECIFIED GLOBALLY OR LOCALLY ***      1494.000
*                                                                       1495.000
*        CREATED=TIME                                                   1496.000
*        CHANGED=TIME                                                   1497.000
*        SAVED=TIME                                                     1498.000
*        RESTORED=TIME                                                  1499.000
*        CONFIRM=BOOL                                                   1500.000
*        SAVN=BOOL                                                      1501.000
*        BRIEF=BOOL                                                     1502.000
*                                                                       1503.000
*                                                                       1504.000
*  NOTE:                                                                1505.000
*        LOGICAL FILE CODE "TAP" IS ASSUMED TO BE EXTERNALLY            1506.000
*        ASSIGNED BEFORE ACTIVATION OF VOLMGR !!!                       1507.000
*                                                                       1508.000
*--                                                                     1509.000
         SPACE                                                          1510.000
S.SAVCMD    STATE                     STATE TABLE FOR SAVE COMMAND      1511.000
           TRAN    NOBLNK,A.GLOBAL      POSITION OPTION BLOCK FOR       1512.000
*                                       GLOBAL OPTIONS                  1513.000
S.10     STATE                                                          1514.000
           TRAN    EOS,,PERR006         ERROR -- MUST HAVE AT LEAST ONE 1515.000
*                                       PATHNAME                        1516.000
           TRAN    TSTEXP,,S.20,SS.KWSYN    IS IT A KEYWORD ???         1517.000
           TRAN    NOBLNK,,S.30              NOT A KEYWORD -- MUST BE AN1518.000
*                                            ACTUAL PATHNAME            1519.000
S.20     STATE                                                          1520.000
           TRAN    SUBEXP,,S.30,SS.INP,NOB.M      IS IT "PATH=" KEYWORD 1521.000
           TRAN    SUBEXP,,S.10,SS.OPT,NOB.M      CHECK FOR LEGAL GLOBAL1522.000
*                                                 OPTION; IE., 'BOOT='  1523.000
*                                                 KEYWORDS              1524.000
           ERRVAL  INVKEY                         INVALID KEYWORD       1525.000
S.30     STATE                                                          1526.000
           TRAN    EOS,,PERR006              ERROR -- MUST HAVE AT LEAST1527.000
*                                            ONE PATHNAME               1528.000
           TRAN    NOBLNK,A.LOCAL            POSITION TO 1ST LOCAL      1529.000
*                                            OPTION BLOCK               1530.000
         STATE                                                          1531.000
           TRAN    SUBEXP,A.LOCAL,S.40,SS.SL00   GET PATHNAME & LOCAL OP1532.000
S.40       TRAN    EOS,A.CMD,EXIT            EXIT PARSE -- SUCCESSFUL   1533.000
*                                            ALSO PLUG ENTRY ADDRESS    1534.000
*                                            SYNTAX VIOLATION           1535.000
         STATE                                                          1536.000
         SPACE     3                                                    1537.000
SS.SL00  STATE                               INPUT FILE LIST            1538.000
           TRAN    SUBEXP,,,SS.PATNM,NOB.M                              1539.000
SS.SL10  STATE                                                          1540.000
           TRAN    TSTEXP,,,SS.KWSYN         LOOK FOR AN OPTION KEYWORD 1541.000
           TRAN    LAMBDA,,SS.SL20           MUST NOT BE ANY            1542.000
         STATE                                                          1543.000
           TRAN    SUBEXP,,SS.SL10,SS.OPT,NOB.M GET A LOCAL OPTION      1544.000
SS.SL20  STATE                                                          1545.000
           TRAN    COMMA,A.LOCAL,SS.SL30,,NOB.M   GET MORE IF IN LIST   1546.000
           TRAN    NOBLNK,,EXIT              EXIT THIS SUBEXPRESSION    1547.000
SS.SL30  STATE                                                          1548.000
           TRAN    SUBEXP,,SS.SL00,SS.INP,NOB.M+LMB.M   "PATH=" KEYWORD 1549.000
         STATE                                                          1550.000
         SPACE     5                                                    1551.000
SS.OPT   STATE                     OPTIONS APPLICABLE FOR THIS COMMAND  1552.000
           TRAN    KEYWD,,,K.OPTS,NOB.M                                 1553.000
           TRAN    NOBLNK,,SS.TIMOP     COVERS THE 4 TIME OPTIONS       1554.000
         STATE                                                          1555.000
         SPACE     5                                                    1556.000
K.OPTS   EQU       $                         SAVE OPTIONS               1557.000
         KEYWRD    CONFIRM,,SS.CONF,3   CONFIRM-BOOL OPT. !32B01 ECKW-341558.000
         KEYWRD    BRIEF,,SS.BRIE,3     BRIEF - BOOL OPT  !32B01 ECKW-341559.000
         KEYWRD    SAVN,,SS.SAVN,3      SAVN -- A BOOLEAN OPTION ECKW-341560.000
*                                       SAVN=T MEANS SAVE NOSAVE FILES  1561.000
         DATAW     0                         END OF LIST                1562.000
         SPACE     2                                                    1563.000
         TITLE     SAVE INCREMENTAL STATE TABLES & ACTION ROUTINES      1564.000
*++                                                                     1565.000
* S.SAVINC - STATE TABLES FOR SAVE INCREMENTAL COMMAND                  1566.000
*                                                                       1567.000
* COMMAND SYNTAX:                                                       1568.000
*                                                                       1569.000
*  SAVE INCREMENTAL                                                     1570.000
*                                                                       1571.000
*                                                                       1572.000
* OPTIONS:                                                              1573.000
*                                                                       1574.000
*        NONE                                                           1575.000
*                                                                       1576.000
*  NOTE:                                                                1577.000
*        LOGICAL FILE CODE "TAP" IS ASSUMED TO BE EXTERNALLY            1578.000
*        ASSIGNED BEFORE ACTIVATION OF VOLMGR !!!                       1579.000
*                                                                       1580.000
*--                                                                     1581.000
         SPACE                                                          1582.000
S.SAVINC STATE                        STATE TABLE FOR SAVE INCREMENTAL  1583.000
           TRAN    EOS,,PERR006         ERROR -- MUST HAVE AT LEAST ONE 1584.000
*                                       PATHNAME                        1585.000
           TRAN    TSTEXP,,SI.20,SS.KWSYN    IS IT A KEYWORD ???        1586.000
           TRAN    NOBLNK,,SI.30              NOT A KEYWORD -- MUST BE A1587.000
*                                            ACTUAL PATHNAME            1588.000
SI.20     STATE                                                         1589.000
           TRAN    SUBEXP,,SI.30,SS.INP,NOB.M      IS IT "PATH=" KEYWOR 1590.000
           ERRVAL  INVKEY                         INVALID KEYWORD       1591.000
SI.30     STATE                                                         1592.000
           TRAN    EOS,,PERR006              ERROR -- MUST HAVE AT LEAST1593.000
*                                            ONE PATHNAME               1594.000
           TRAN    NOBLNK,AS.SAVI1            POSITION TO 1ST LOCAL     1595.000
*                                            OPTION BLOCK               1596.000
         STATE                                                          1597.000
           TRAN    SUBEXP,,SI.40,SSI.SL00           GET PATHNAME & LOCAL1598.000
SI.40       TRAN    EOS,A.CMD,EXIT            EXIT PARSE -- SUCCESSFUL  1599.000
*                                            ALSO PLUG ENTRY ADDRESS    1600.000
*                                            SYNTAX VIOLATION           1601.000
         STATE                                                          1602.000
         SPACE     3                                                    1603.000
SSI.SL00  STATE                               INPUT FILE LIST           1604.000
           TRAN    SUBEXP,AS.SAVI2,,SS.PATNM,NOB.M                      1605.000
         STATE                                                          1606.000
           TRAN    COMMA,,,,NOB.M           GET MORE IF IN LIST         1607.000
           TRAN    NOBLNK,,EXIT              EXIT THIS SUBEXPRESSION    1608.000
         STATE                                                          1609.000
           TRAN    SUBEXP,,SSI.SL00,SS.INP,NOB.M+LMB.M   "PATH=" KEYWORD1610.000
         STATE                                                          1611.000
         SPACE     5                                                    1612.000
AS.SAVI1 EQU       $               INITIALIZE CURRENT OPTION BLOCK ADDR.1613.000
         SBM       NOOPT.F,FLAGBITS     NO OPTION PROCESSING NECESSARY  1614.000
         LA        R4,LOBLOCK      LOCAL OPTION BLOCK ADDRESS           1615.000
         STW       R4,COBADDR      MAKE CURRENT OPTION BLOCK ADDRESS    1616.000
         TRSW      R0              RETURN                               1617.000
         SPACE     5                                                    1618.000
AS.SAVI2 EQU       $                                                    1619.000
         LW        R3,COBADDR      CURRENT OPTION BLOCK ADDRESS         1620.000
         SBM       OPT.B.IN,OPT.FLGS,X3 INDICATE INCREMENTAL SAVE       1621.000
         SBM       OPT.B.BR,OPT.FLGS,X3 INDICATE BRIEF LOG              1622.000
         ADI       R3,OPT.LEN      POSITION TO NEXT LOCAL OPTION BLOCK  1623.000
         STW       R3,COBADDR      NEW CURRENT OPTION BLOCK ADDRESS     1624.000
         TRSW      R0              RETURN                               1625.000
         SPACE     2                                                    1626.000
END      END                                                            1627.000
