$CONTROL MAP,CODE,USLINIT                                               00010000
<< PVSYS -- MODULE 81 >>                                       <<01000>>00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00016000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00018000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00020000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00022000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00024000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00026000
$SET X0=OFF <<IF ON THEN MONITORING CODE COMPILED>>                     00028000
$SET X1=OFF <<IF ON THEN BUG CATCHING CODE COMPILED>>                   00030000
$SET X2=OFF <<IF ON THEN DUP MOUNT CHECK CODE COMPILED>>                00032000
$CONTROL PRIVILEGED                                                     00034000
                                                               <<04278>>00036000
<< Change all references to the now defunct 7935 to 7933.    >><<04278>>00038000
                                                                        00040000
$TITLE "PVSYS - GLOBAL DECLARATIONS"                                    00042000
                                                                        00044000
BEGIN                                                                   00046000
                                                                        00048000
<<************************* PVSYS (81) *************************>>      00050000
                                                                        00052000
LOGICAL STAT=Q-1;                                                       00054000
INTEGER DELTAP = Q-2;                                          <<MONIT>>00056000
INTEGER X=X;                                                            00058000
INTEGER S0=S-0,S1=S-1,S2=S-2,S3=S-3,S4=S-4,S5=S-5;                      00060000
INTEGER QM0=Q-0,QM5=Q-5;                                                00062000
LOGICAL LS0=S-0;                                                        00064000
DOUBLE DS1=S-1,DS3=S-3,DS6=S-6;                                         00066000
LOGICAL POINTER PS0 = S-0;                                              00068000
BYTE POINTER BPS0 = S-0;                                                00070000
                                                                        00072000
<< ** DEVLIST ARRAY **                                                  00074000
   THE DEVLIST ARRAY IS AN ARRAY OF LOGICAL DEVICES WHICH HAVE BEEN     00076000
   ASSIGNED TO HOLD A MOUNTED VOLUME SET. WHILE THE CONTENTS OF THE     00078000
   ARRAY VARY DURING THE SEQUENCE OF PROCEDURES CALLED TO MOUNT OR      00080000
   DISMOUNT A VOLUME SET, THE FORMAT IS FIXED. THE INITIAL CONTENTS     00082000
   ARE DETERMINED FROM THE VOLUME SET DEFINITION.                       00084000
                                                                        00086000
   FORMAT -                                                             00088000
                                                                        00090000
      DEVLIST( 0):                                                      00092000
          ( 0:8) - UNUSED                                               00094000
          ( 8:8) - VMASK, A LOGICAL BIT MASK INDICATING WHICH VOLUMES   00096000
                   OF THE SET ARE TO BE MOUNTED. IF A VOLUME CLASS IS   00098000
                   BEING MOUNTED THEN VMASK MAY REPRESENT ONLY A SUBSET 00100000
                   OF THE TOTAL VOLUMES IN THE SET. IF A VOLUME SET IS  00102000
      DEVLIST( 1):                                                      00104000
          ( 0:8) - THE NUMBER OF DRIVES OBTAINED FOR THE MOUNT.         00106000
          ( 8:8) - THE NUMBER OF DRIVES REQUIRED FOR THE MOUNT.         00108000
      DEVLIST( 2): VOLUME 1 INFORMATION (MASTER VOLUME)                 00110000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00112000
                   (SEE FOLLOWING DEFINITION).                          00114000
          ( 1:7) - SUBTYPE OF THE DRIVE REQUIRED OR THE VTAB INDEX      00116000
                   OF THE DRIVE ASSIGNED TO THIS VOLUME. IF BIT         00118000
                   (0:1) IS SET, THE FIELD REPRESENTS THE SUBTYPE       00120000
                   OF THE DRIVE REQUIRED.                               00122000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00124000
      DEVLIST( 3): VOLUME 2 INFORMATION (MAY BE ZERO)                   00126000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00128000
          ( 1:7) - SUBTYPE/VTAB INDEX.                                  00130000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00132000
                   VOLUME.                                              00134000
      DEVLIST( 4): VOLUME 3 INFORMATION (MAY BE ZERO)                   00136000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00138000
          ( 1:7) - SUBTYPE/VTAB INDEX.                                  00140000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00142000
                   VOLUME.                                              00144000
      DEVLIST( 5): VOLUME 4 INFORMATION (MAY BE ZERO)                   00146000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00148000
          ( 1:7) - SUBTYPE/VTAB INDEX.                                  00150000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00152000
                   VOLUME.                                              00154000
      DEVLIST( 6): VOLUME 5 INFORMATION (MAY BE ZERO)                   00156000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00158000
          ( 1:7) - SUBTYPE/VTAB INDEX.                                  00160000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00162000
                   VOLUME.                                              00164000
      DEVLIST( 7): VOLUME 6 INFORMATION (MAY BE ZERO)                   00166000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00168000
          ( 1:7) - SUBTYPE/VTAB INDEX.          .                       00170000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00172000
                   VOLUME.                                              00174000
      DEVLIST( 8): VOLUME 7 INFORMATION (MAY BE ZERO)                   00176000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00178000
          ( 1:7) - SUBTYPE/VTAB INDEX.                                  00180000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00182000
                   VOLUME.                                              00184000
      DEVLIST( 9): VOLUME 8 INFORMATION (MAY BE ZERO)                   00186000
          ( 0:1) - BIT IDENTIFYING THE CONTENTS OF BITS (1:7).          00188000
          ( 1:7) - SUBTYPE/VTAB INDEX.                                  00190000
          ( 8:8) - THE LOGICAL DEVICE WHICH HAS BEEN ASSIGNED TO THE    00192000
                   VOLUME.                                              00194000
   A VOLUME INFORMATION WILL BE ZERO ONLY WHEN A VOLUME CLASS IS        00196000
   BEING MOUNTED AND THE VOLUME IS NOT A MEMBER OF THE CLASS. A         00198000
   ZERO ENTRY WILL NOT OCCUR WHEN A VOLUME SET IS BEING MOUNTED         00200000
   UNLESS THE SET HAS LESS THAN THE MAXIMUM NUMBER OF MEMBERS.          00202000
>>                                                                      00204000
                                                                        00206000
EQUATE  << MOUNT/DISMOUNT REQUEST TYPES >>                              00208000
     USERREQ1 = 0,  << :MOUNT/:DISMOUNT WITH (UN)BINDING >>             00210000
     USERREQ2 = 1,  << :MOUNT/:DISMOUNT WITH NO (UN)BINDING >>          00212000
     SYSREQ1  = 2,  << SYSTEM MOUNT/DISMOUNT WITH (UN)BINDING >>        00214000
     SYSREQ2  = 3,  << CONDITIONAL SYSTEM MOUNT >>                      00216000
     SYSREQ3  = -3, << CONDITIONAL SYSTEM MOUNT WITH BINDING>>          00218000
     SYSREQ4  = -2, << SYSTEM MOUNT WITH NO (UN)BINDING>>               00220000
     OPREQ    = 4,                                                      00222000
     BYEREQ   = 5;  << DISMOUNT DUE TO :BYE>>                           00224000
                                                                        00226000
LOGICAL POINTER                                                         00228000
     PCB  = 3,                                                          00230000
     LPDT = 8;                                                          00232000
EQUATE                                                         <<00776>>00234000
     FPNTRW = 5,                                               <<00776>>00236000
     PTYPEW = 9,                                               <<00776>>00238000
     JSMTYP = 2,                                               <<00776>>00240000
     LPDT1  =  1; <<SECOND WORD OF LPDT>>                               00242000
DEFINE                                                         <<00776>>00244000
     FPNTRF = (0:8) #,                                         <<00776>>00246000
     PTYPEF = (6:3) #;                                         <<00776>>00248000
                                                                        00250000
ARRAY MVTAB(*) = DB+0;                                                  00252000
                                                                        00254000
EQUATE                                                                  00256000
       VDREFCNT    =  54,                                               00258000
       MAXVOLNUM   =  8,  <<MAX. VOLUMES PER VOLUME SET>>               00260000
       DEVLISTSIZE = MAXVOLNUM + 2;                                     00262000
                                                                        00264000
                                                                        00266000
EQUATE  << VOLUME SET DEFINITION (VSDEFN) >>                            00268000
     VDMISC     =  4,  <<MVTAB INDEX>>                                  00270000
     VDINFO     =  5;  <<NUM. VOLS., VOL. MASK>>                        00272000
                                                                        00274000
EQUATE  << VOLUME LABEL INFORMATION >>                                  00276000
     LDEVINFO     =  6,                                                 00278000
     LGENINDEX    =  7,                                                 00280000
     LSYSID1      =  8,                                                 00282000
     LSYSID2      =  9,                                                 00284000
     LVNAMELOC'   = 10,                                                 00286000
     LINITDATE    = 14,                                                 00288000
     LDIRBASE     = 15,                                                 00290000
     LDIRSIZE     = 16,                                                 00292000
     LVSACCNTLOC' = 17,                                                 00294000
     LSYSIDLOC    = 16,  <<BYTES>>                                      00296000
     LVNAMELOC    = 20,  <<BYTES>>                                      00298000
     LVDIRINFO    = 30,                                                 00300000
     LVSACCNTLOC  = 34,  <<BYTES>>                                      00302000
     LVSGROUPLOC  = 42,  <<BYTES>>                                      00304000
     LVOLDIR      = 25,                                                 00306000
     LVOLDIRLOC   = 50,  <<BYTES>>                                      00308000
     LVSNAMELOC   = 50;  <<BYTES>>                                      00310000
                                                                        00312000
EQUATE  << DATA SEGMENTS/SIRS >>                                        00314000
     DIRSIR    = 8,                                                     00316000
     LDTDST    = 14,                                                    00318000
     LDTSIR    = 10,                                                    00320000
     LPDTDST   = 13,                                                    00322000
     LPDTSIR   =  9,                                                    00324000
     VTABDST   = 29,                                                    00326000
     VTABSIR   = 22,                                                    00328000
     JMATDST   = 25,                                                    00330000
     JMATSIR   = 15,                                                    00332000
     MVTABDST  = 53,                                                    00334000
     MVTABSIR  = 27,                                                    00336000
     PVUSERDST = 54,                                                    00338000
     PVUSERSIR = 29;                                                    00340000
                                                                        00342000
EQUATE  << TABLE/ENTRY SIZES >>                                         00344000
     VDCENTSIZE   = 56,  <<CLASS DEFINITION ENTRY>>                     00346000
     VDSENTSIZE   = 56,  <<(MAXVOLNUM+1)*VDVENTSIZE>>                   00348000
     VDVENTSIZE   =  6,                                                 00350000
     VDVENTSIZEB  = 12,                                                 00352000
     ldt'entry'size = 5,                                       <<03504>>00354000
     MVTABENTSIZE = 21;                                                 00356000
EQUATE  << NAME SEGMENT SIZES >>                                        00358000
     NAMENTSIZE         =   9,  <<NAME ENTRY SIZE (WORDS)>>             00360000
     MAXNAMESEGLN'INIT  = 4096, <<MAX NAME SEGMENT LENGTH>>             00362000
     NAMESEGLN'INIT     = 128,  <<INITIAL NAME SEGMENT LENGTH>>         00364000
     NAMESEGLN'INCR     = 128;  <<EXPANSION INCREMENT>>                 00366000
                                                                        00368000
EQUATE  << CONDITION CODES >>                                           00370000
     CCG = 0,                                                           00372000
     CCL = 1,                                                           00374000
     CCE = 2;                                                           00376000
                                                               <<03511>>00380000
EQUATE       << Attachio parameter values >>                   <<03511>>00382000
  LOCK     = 16,       << Function code to lock drive >>       <<03511>>00384000
  UNLOCK   = 17,       << Function code to unlock drive >>     <<03511>>00386000
  BLOCKEDIO= 1;        << Wait I/O >>                          <<03511>>00388000
                                                               <<03511>>00390000
  DEFINE  D7905R     = ( TYPE=0 LAND STYPE= 4 )#,              <<03511>>00392000
          D7905F     = ( TYPE=0 LAND STYPE= 5 )#,              <<03511>>00394000
          D7920      = ( TYPE=0 LAND STYPE= 8 )#,              <<03511>>00396000
          D7925      = ( TYPE=0 LAND STYPE= 9 )#,              <<03511>>00398000
          D7906R     = ( TYPE=0 LAND STYPE=10 )#,              <<03511>>00400000
          D7906F     = ( TYPE=0 LAND STYPE=11 )#,              <<03511>>00402000
          FLOPPY     = ( TYPE=2 )#,                            <<03511>>00404000
          D7933      = ( TYPE=3 LAND STYPE= 8 )#,              <<04278>>00406000
          LINUS      = ( TYPE=3 LAND STYPE=0 )#,               <<03511>>00408000
          REMVBLE    = D7920 OR D7925 OR D7905R OR D7906R      <<03511>>00410000
                        OR FLOPPY OR D7933 OR LINUS#,          <<04278>>00412000
          MHDISC     = ( (TYPE=0 LOR TYPE=2 LOR TYPE=3) ) #;   <<03511>>00414000
                                                               <<03511>>00416000
EQUATE                                                                  00418000
     R            =    0,  <<READ I/O REQUEST>>                         00420000
     W            =    1,  <<WRITE I/O REQUEST>>                        00422000
     F            =    8,  <<FORMAT TRACK I/O REQUEST>>                 00424000
     IN           =    9,  <<INITIALIZE TRACK I/O REQUEST>>             00426000
     WL           =   11,  <<WRITE LABEL (SECTOR 0) REQUEST>>           00428000
     RFS          =   10,  <<READ FULL SECTOR I/O REQUEST>>             00430000
     ADD          =    0,  <<MVTABLE - ADD ENTRY>>                      00432000
     REMOVE       =    1,  <<MVTABLE - REMOVE ENTRY>>                   00434000
     PRESERVE     =    2,  <<MVTABLE - PRESERVE ENTRY>>                 00436000
     SYSLDEV      =    1,  <<SYSTEM DISC LOGICAL DEVICE>>               00438000
     PVPMOUNT     =   12,  <<LOG REC TYPE - PHYSICAL MOUNT>>            00440000
     PVLMOUNT     =   13;  <<LOG REC TYPE - LOGICAL MOUNT >>            00442000
                                                                        00444000
EQUATE  << PVUSER SIZES >>                                              00446000
     PVUHDSIZE     =  5,  <<TABLE HEADING SIZE>>                        00448000
     PVEHDSIZE     =  4,  <<ENTRY HEADING SIZE>>                        00450000
     PVENTSIZE     =  7,  <<USER SUB-ENTRY SIZE>>                       00452000
     PVSEGLN'INCR  = 128, <<EXPANSION INCREMENT>>              <<01106>>00454000
     PVEDEFEXTN    = 35,  <<DEFAULT ENTRY EXTENSION SIZE>>              00456000
     PVEDEFSIZE    = PVEHDSIZE + PVEDEFEXTN;                            00458000
     <<NOTE:                                                            00460000
          WHENEVER A USER-LIST SUB-ENTRY, OF A USERTABLE                00462000
          ENTRY FOR A VOLUME SET, IS CREATED OR INCREASED               00464000
          IN SIZE, THE NUMBER OF USERS WHICH CAN THEN BE                00466000
          ACCOMODATED BY THE NEW ENTRY OR EXTENSION IS 5                00468000
          (NUMUSERS). ALSO, EACH USER IS ASSIGNED 4 WORDS               00470000
          (PVENTSIZE). THUS, THE LAST TWO OF THE ABOVE                  00472000
          EQUATES ARE COMPUTED AS FOLLOWS:                              00474000
                                                                        00476000
          PVEDEFEXTN (USER SUB-ENTRY EXTENSION SIZE) =                  00478000
               (NUMUSERS * PVENTSIZE),                                  00480000
                                                                        00482000
          PVEDEFSIZE (USER SUB-ENTRY DEFAULT SIZE) =                    00484000
               (PVEHDSIZE + (NUMUSERS * PVENTSIZE)).                    00486000
     >>                                                                 00488000
                                                                        00490000
DEFINE  << PVUSER ARRAY INFORMATION >>                                  00492000
     PVUSIZE       = PVUSER#,                                           00494000
     PVUCOUNT      = PVUSER(1).(8:8)#,                                  00496000
     PVUMASK       = PVUSER(2)#,                                        00498000
     MAXPVSEGLN'INIT = PVUSER(3)#,  <<MAX TABLE SIZE>>         <<01601>>00500000
     PVUAVAIL      = PVUSER(4)#;                                        00502000
                                                                        00504000
DEFINE  << PVUSER ENTRY INFOMATION >>                                   00506000
     PVEOPMASK     = PVUENT(0).(0:8)#,                                  00508000
     PVEMVTABX     = PVUENT(0).(8:8)#,                                  00510000
     PVEMAXCOUNT   = PVUENT(1).(0:8)#,                                  00512000
     PVEACTCOUNT   = PVUENT(1).(8:8)#,                                  00514000
     PVESIZE       = PVUENT(2)#,                               <<01197>>00516000
     PVEFLAGS      = PVUENT(3)#,                               <<01197>>00518000
       PVEOPMOUNT  = PVEFLAGS.(15:1)#;                         <<01197>>00520000
                                                                        00522000
DEFINE  << SYSTEM GLOBAL CELLS >>                                       00524000
     SYSDB        = %1000#,                                             00526000
     VMOUNTINFO   = ABSOLUTE(SYSDB+%365)#;                              00528000
                                                                        00530000
DEFINE  << LPDT FIELDS FOR PRIVATE VOLUMES >>                           00532000
      DRSTATE    = ( 0:2)#,  <<DEVICE RECOGNITION>>                     00534000
     NSDF       = ( 4:1)#,  <<CONTROL-Y FIELD>>                         00536000
     MNTF       = ( 5:1)#,                                              00538000
     RESF       = ( 6:1)#,                                              00540000
     SDLF       = (10:1)#,  <<SER/FORN DISC ON-LINE>>          <<01115>>00542000
     FORS       = (11:1)#;  << 1=>FOREIGN, 0=>SERIAL >>        <<01115>>00544000
                                                                        00546000
DEFINE  << PARTIAL FIELDS >>                                            00548000
     MVF        = ( 1:1)#,  <<MASTER VOLUME (VOLUME LABEL)>>            00550000
     DOWNF      = ( 8:8)#,  <<MVTAB ENTRY - DOWN PENDING MASK>>         00552000
     LDEVF      = ( 0:8)#,  <<VTAB/MVTAB ENTRY LDEV FIELD>>             00554000
     HEADF      = ( 3:5)#,  <<HEAD FIELD OF SECTOR PREAMBLE>>           00556000
     INUSE      = ( 0:1)#,  <<MVTAB ENTRY IN USE>>                      00558000
     HVOLF      = ( 0:4)#,  <<MVTAB ENTRY HVOL FIELD>>                  00560000
     NVOLF      = ( 4:4)#,  <<MVTAB ENTRY NVOL FIELD>>                  00562000
     USECNT     = ( 8:8)#,  <<MVTAB ENTRY - USE COUNT>>                 00564000
     NUMVOL     = ( 0:4)#,  <<VS DEFN ENTRY - VOLS IN VS>>              00566000
     INITALLOCF = ( 1:1)#,  <<VS DEFN ENTRY - ALLOCATION FLAG>>         00568000
     MVTABXF    = ( 8:8)#,                                              00570000
     VOLMASK    = ( 8:8)#,  <<VC DEFN ENTRY - VOLS IN CLASS>>           00572000
     QSTATUS    = ( 8:5)#,                                              00574000
     GSTATUS    = (13:3)#,                                              00576000
     TSTATUS    = ( 8:8)#,                                              00578000
     SCRATCHF   = ( 0:1)#,  <<SCRATCH VOLUME (VOLUME LABEL)>>           00580000
     SERIALF    = ( 2:1)#,  <<SERIAL  VOLUME (VOLUME LABEL)>>           00582000
     ENTSIZEF   = ( 8:8)#,  <<SIZE FIELD - SYSTEM TABLES>>              00584000
     VTENTNUM   = ( 0:8)#,                                              00586000
     VTENTSIZE  = ( 8:8)#,                                              00588000
     MVTENTSIZE = ( 0:8)#;                                              00590000
                                                                        00592000
DEFINE  << USER TABLE MOUNT AND BIND FIELDS >>                          00594000
     UBNDF   = ( 0:8)#,  << USER BIND  COUNT >>                         00596000
     UCNTF   = ( 8:8)#,  << USER MOUNT COUNT >>                         00598000
     SBNDF   = ( 0:8)#,  << SYSTEM BIND COUNT >>                        00600000
     SCNTF   = ( 8:8)#;  << SYSTEM MOUNT COUNT >>                       00602000
DEFINE  << VMOUNT PARTIAL FIELDS >>                                     00604000
     ONF    = (15:1)#,                                                  00606000
     ALLF   = (14:1)#,                                                  00608000
     AUTOF  = (13:1)#;                                                  00610000
                                                                        00612000
                                                               <<03504>>00614000
EQUATE ldtx'dfs'error'word = 3;  << Free space error word >>   <<03504>>00616000
                                                               <<03504>>00618000
DEFINE CC=STAT.(6:2)#;                                                  00620000
DEFINE DUPLICATE = ASSEMBLE(DUP)#;                                      00622000
DEFINE DELETE = ASSEMBLE(DEL)#;                                         00624000
DEFINE DELETEDBL = ASSEMBLE(DDEL)#;                                     00626000
DEFINE HARDHALT = ASSEMBLE(HALT 0;BR*-1)#;                              00628000
DEFINE ENABLE = ASSEMBLE(SED 0)#;                                       00630000
                                                                        00632000
EQUATE PVERRMSGSET = 15;                                                00634000
                                                                        00636000
EQUATE  << PRIVATE VOLUME ERRORS (INDICES INTO PVERRMSGSET) >>          00638000
     OKEXIT       =   0,                                                00640000
     VMOUNTOFF    =  20,                                                00642000
     OPREJECT     =  21,                                                00644000
     NOTAVAIL     =  22,                                                00646000
     SYSTEMUSE    =  23,                                                00648000
     NODGROUP     =  24,                                                00650000
     NODACCNT     =  25,                                                00652000
     NOTMOUNTED   =  26,                                                00654000
     NODVSET      =  27,                                                00656000
     NOHVSET      =  28,                                                00658000
     NOHGROUP     =  29,                                                00660000
     NOHACCNT     =  30,                                                00662000
     NOVGROUP     =  31,                                                00664000
     NOVACCNT     =  32,                                                00666000
     DUPMOUNT     =  33,                                                00668000
     NOTVALDUSER  =  34,                                                00670000
     DOWNSET      =  35,                                                00672000
     DOWNVOL      =  36,                                                00674000
     DIFFCLASS    =  37,                                                00676000
     USERERR1     =  38,                                                00678000
     USERERR2     =  39,                                                00680000
     DISCERR      =  40,                                                00682000
     WRONGEN      =  41,                                                00684000
     DUPBIND      =  42,                                                00686000
     INVNAME      =  43,                                                00688000
     OPCAN'WAIT   =  44,                                                00690000
     STACKOVF     =  44,                                       <<01000>>00692000
                                                                        00694000
     MVTABERR     =  50,    << PVERR 50 >>                              00696000
     PVUSERERR    =  51,                                                00698000
     DIRECERR     =  52,                                                00700000
     DSEGERR      =  53,                                                00702000
     PVSEGERR     =  54,                                       <<01106>>00704000
     NOROOM       =  55,                                       <<01106>>00706000
                                                                        00708000
     DEVERR1      =  60,  <<DEVICE OUT OF RANGE>>                       00710000
     DEVERR2      =  61,  <<DEVICE NOT CONFIGURED>>                     00712000
     DEVERR3      =  62,  <<DEVICE IS NOT A DISC>>                      00714000
     DEVERR4      =  63,  <<DEVICE IS NOT REMOVABLE>>                   00716000
     DEVERR5      =  64,  <<DEVICE NOT IN USER DOMAIN>>                 00718000
     DEVERR6      =  65,  <<DEVICE IS NOT ON-LINE>>                     00720000
     DEVERR7      =  66,  <<DEVICE IS RESERVED BY SYSTEM>>     <<01601>>00722000
     DEVERR10     =  73;  <<DEVICE IS READ-ONLY>>              <<01601>>00724000
                                                                        00726000
EQUATE                                                         <<DEBUG>>00728000
     PCBB= 3,                                                  <<DEBUG>>00730000
     PCBSZ=16,                                                          00732000
     CPCB = 4;                                                 <<00776>>00734000
DEFINE                                                         <<DEBUG>>00736000
    ABS = ABSOLUTE #,                                          <<DEBUG>>00738000
     CURRPIN = (ABS (CPCB)-ABS (PCBB))/PCBSZ #,                <<00776>>00740000
    XDSF = (1:10) #;                                           <<DEBUG>>00742000
PROCEDURE SUDDENDEATH (SDNUMBER);                              <<DEBUG>>00744000
    VALUE SDNUMBER; INTEGER SDNUMBER;                          <<DEBUG>>00746000
    OPTION EXTERNAL;                                           <<DEBUG>>00748000
LOGICAL PROCEDURE GETSIR(N);                                            00750000
VALUE N; LOGICAL N;                                                     00752000
OPTION EXTERNAL;                                                        00754000
                                                                        00756000
PROCEDURE RELSIR(N,B);                                                  00758000
VALUE N,B; LOGICAL N,B;                                                 00760000
OPTION EXTERNAL;                                                        00762000
                                                                        00764000
INTEGER PROCEDURE GETDATASEG(MSIZE,VMSIZE);                             00766000
VALUE MSIZE,VMSIZE;                                                     00768000
INTEGER MSIZE,VMSIZE;                                                   00770000
OPTION EXTERNAL;                                                        00772000
INTEGER PROCEDURE ALTDSEGSIZE (EN,SIZE);                                00774000
    VALUE   EN,SIZE;                                                    00776000
    INTEGER EN,SIZE;                                                    00778000
    OPTION  EXTERNAL;                                                   00780000
PROCEDURE RELDATASEG(EN);                                               00782000
VALUE EN;                                                               00784000
INTEGER EN;                                                             00786000
OPTION EXTERNAL;                                                        00788000
                                                                        00790000
LOGICAL PROCEDURE SETSYSDB;                                             00792000
OPTION EXTERNAL;                                                        00794000
                                                                        00796000
PROCEDURE RESETDB(D);                                                   00798000
VALUE D; LOGICAL D;                                                     00800000
OPTION EXTERNAL;                                                        00802000
                                                                        00804000
INTEGER PROCEDURE EXCHANGEDB(D);                                        00806000
VALUE D; LOGICAL D;                                                     00808000
OPTION EXTERNAL;                                                        00810000
                                                                        00812000
INTRINSIC PRINT,ASCII,BINARY,DASCII,MYCOMMAND,ZSIZE;           <<01000>>00814000
                                                                        00816000
PROCEDURE LOG13(MINFO,UINFO,UNAME,ULEN,VNAME,VLEN,DEVLIST,DLEN,         00818000
   RECTYPE);                                                            00820000
VALUE MINFO,UINFO,ULEN,VLEN,DLEN,RECTYPE;                               00822000
LOGICAL MINFO,UINFO;                                                    00824000
INTEGER ULEN,VLEN,DLEN,RECTYPE;                                         00826000
ARRAY UNAME,VNAME,DEVLIST;                                              00828000
OPTION EXTERNAL;                                                        00830000
                                                                        00832000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,PARM1,PARM2,                  00834000
   PARM3,PARM4,PARM5,DEST,REPLY,OFFSET,DST,IOTYPE);                     00836000
VALUE SETNO,MSGNO,MASK,PARM1,PARM2,PARM3,PARM4,PARM5,                   00838000
   DEST,REPLY,OFFSET,DST,IOTYPE;                                        00840000
INTEGER SETNO,MSGNO,DEST,DST;                                           00842000
LOGICAL MASK,PARM1,PARM2,PARM3,PARM4,PARM5,REPLY,OFFSET,                00844000
   IOTYPE;                                                              00846000
OPTION VARIABLE,EXTERNAL;                                               00848000
                                                                        00850000
DOUBLE PROCEDURE ATTACHIO(P1,P2,P3,P4,P5,P6,P7,P8,P9);                  00852000
VALUE      P1,P2,P3,P4,P5,P6,P7,P8,P9;                                  00854000
INTEGER    P1,P2,P3,P4,P5,P6,P7,P8,P9;                                  00856000
OPTION EXTERNAL;                                                        00858000
                                                                        00860000
DOUBLE PROCEDURE REQSTATUS(LDN);                                        00862000
VALUE LDN; INTEGER LDN;                                                 00864000
OPTION EXTERNAL;                                                        00866000
                                                                        00868000
INTEGER PROCEDURE DISCTYPE(LDEV, VLAB);                        <<01115>>00870000
VALUE LDEV;                                                    <<01115>>00872000
INTEGER LDEV;                                                  <<01115>>00874000
ARRAY VLAB;                                                    <<01115>>00876000
OPTION FORWARD;                                                <<01115>>00878000
                                                               <<01115>>00880000
DOUBLE PROCEDURE DIRECFIND (TYPE,LINKAGE'INDEXP,ANAME,                  00882000
                            GUNAME,FNAME,PRETURN);                      00884000
VALUE TYPE,LINKAGE'INDEXP;                                              00886000
LOGICAL TYPE;                                                           00888000
DOUBLE  LINKAGE'INDEXP;                                                 00890000
ARRAY ANAME,GUNAME,FNAME,PRETURN;                                       00892000
OPTION EXTERNAL;                                                        00894000
                                                                        00896000
DOUBLE PROCEDURE DIRECSCAN (TYPE,LINKAGE'INDEXP,ANAME,GUNAME,           00898000
                            FNAME,RECIP,PARMS,MVTABX);                  00900000
VALUE TYPE,LINKAGE'INDEXP,MVTABX;                                       00902000
INTEGER TYPE,MVTABX;                                                    00904000
DOUBLE  LINKAGE'INDEXP;                                                 00906000
ARRAY ANAME,GUNAME,FNAME,PARMS;                                         00908000
INTEGER PROCEDURE RECIP;                                                00910000
OPTION EXTERNAL,VARIABLE;                                               00912000
DOUBLE PROCEDURE DIRECBIND (TYPE,LINKAGE'INDEXP,ANAME,                  00914000
                            GNAME,GFIPNTR,MVTABX);                      00916000
VALUE TYPE,LINKAGE'INDEXP,MVTABX;                                       00918000
INTEGER TYPE,GFIPNTR,MVTABX;                                            00920000
DOUBLE  LINKAGE'INDEXP;                                                 00922000
ARRAY ANAME,GNAME;                                                      00924000
OPTION VARIABLE,EXTERNAL;                                               00926000
DOUBLE PROCEDURE DIRECUNBIND (TYPE,LINKAGE'INDEXP,ANAME,                00928000
                              GNAME,MVTABX);                            00930000
VALUE TYPE,LINKAGE'INDEXP,MVTABX;                                       00932000
INTEGER TYPE,MVTABX;                                                    00934000
DOUBLE  LINKAGE'INDEXP;                                                 00936000
ARRAY ANAME,GNAME;                                                      00938000
OPTION VARIABLE,EXTERNAL;                                               00940000
                                                                        00942000
PROCEDURE DELAY (TIME);                                                 00944000
    VALUE TIME;  DOUBLE TIME;                                           00946000
    OPTION EXTERNAL;                                                    00948000
                                                                        00950000
PROCEDURE DEBUG;                                                        00952000
OPTION EXTERNAL;                                                        00954000
                                                                        00956000
PROCEDURE GETMVTABENTRY(MVTABX,MVTABENT);                               00958000
VALUE MVTABX;                                                           00960000
INTEGER MVTABX;                                                         00962000
ARRAY MVTABENT;                                                         00964000
OPTION FORWARD;                                                         00966000
                                                                        00968000
INTEGER PROCEDURE USERTABLE(FUNCT,PININFO,MVTABX,RETINFO,RETSIZE);      00970000
VALUE FUNCT,PININFO,MVTABX,RETSIZE;                                     00972000
INTEGER FUNCT,PININFO,MVTABX,RETSIZE;                                   00974000
ARRAY RETINFO;                                                          00976000
OPTION VARIABLE,FORWARD;                                                00978000
                                                                        00980000
PROCEDURE MMSTAT (EVENTNUM,P1,P2,P3);                          <<MONIT>>00982000
    VALUE   EVENTNUM,P1,P2,P3;                                 <<MONIT>>00984000
    INTEGER EVENTNUM,P1,P2,P3;                                 <<MONIT>>00986000
    OPTION  EXTERNAL;                                          <<MONIT>>00988000
                                                               <<MONIT>>00990000
                                                               <<03504>>00992000
<< Procedures for disc free space data segment management >>   <<03504>>00994000
                                                               <<03504>>00996000
LOGICAL PROCEDURE Allocate'Dfs'Data'Seg (ldev);                <<03504>>00998000
   VALUE ldev;                                                 <<03504>>01000000
   INTEGER ldev;                                               <<03504>>01002000
   OPTION EXTERNAL;                                            <<03504>>01004000
                                                               <<03504>>01006000
LOGICAL PROCEDURE Deallocate'Dfs'Data'Seg (ldev);              <<03504>>01008000
   VALUE ldev;                                                 <<03504>>01010000
   INTEGER ldev;                                               <<03504>>01012000
   OPTION EXTERNAL;                                            <<03504>>01014000
                                                               <<03504>>01016000
PROCEDURE Send'Process'Dfs'Error (ldev, error'status,          <<03504>>01018000
                             type'of'error);                   <<03504>>01020000
   VALUE ldev, error'status, type'of'error;                    <<03504>>01022000
   INTEGER ldev, type'of'error;                                <<03504>>01024000
   LOGICAL error'status;                                       <<03504>>01026000
   OPTION EXTERNAL;                                            <<03504>>01028000
                                                               <<03504>>01030000
PROCEDURE Delete'Dfs'Data'Seg (ldev);                          <<03504>>01032000
   VALUE ldev;                                                 <<03504>>01034000
   INTEGER ldev;                                               <<03504>>01036000
   OPTION EXTERNAL;                                            <<03504>>01038000
                                                               <<03504>>01040000
                                                               <<03511>>01042000
                                                               <<03511>>01044000
                                                               <<03511>>01046000
INTEGER PROCEDURE LDEVTOTYPE (LDEV);                           <<03511>>01048000
   VALUE LDEV;                                                 <<03511>>01050000
   INTEGER LDEV;                                               <<03511>>01052000
   OPTION EXTERNAL;                                            <<03511>>01054000
                                                               <<03511>>01056000
                                                               <<03511>>01058000
                                                               <<03511>>01060000
INTEGER PROCEDURE LDEVTOSUBTYPE (LDEV);                        <<03511>>01062000
   VALUE LDEV;                                                 <<03511>>01064000
   INTEGER LDEV;                                               <<03511>>01066000
   OPTION EXTERNAL;                                            <<03511>>01068000
                                                               <<03511>>01070000
                                                               <<03511>>01072000
                                                               <<03511>>01074000
$PAGE "PVSYS - DISC UTILITIES"                                          01076000
$CONTROL SEGMENT = PVSYSM                                               01078000
                                                                        01080000
INTEGER PROCEDURE GETSUBTYPE(LDN);                                      01082000
VALUE LDN; INTEGER LDN;                                                 01084000
OPTION PRIVILEGED,UNCALLABLE;                                           01086000
BEGIN                                                                   01088000
     GETSUBTYPE:=LPDT((LDN & LSL(1))+1).(12:4);                         01090000
END  << GETSUBTYPE >>;                                                  01092000
                                                                        01094000
                                                                        01096000
$CONTROL SEGMENT = PVSYSM                                               01098000
PROCEDURE DISCERROR(LDN,FNCT,IOSTAT,ADDR);                              01100000
VALUE LDN,FNCT,IOSTAT,ADDR;                                             01102000
INTEGER LDN,FNCT;                                                       01104000
LOGICAL IOSTAT;                                                         01106000
DOUBLE ADDR;                                                            01108000
OPTION PRIVILEGED,UNCALLABLE;                                           01110000
BEGIN                                                                   01112000
     INTEGER LEN,LOC;                                                   01114000
     ARRAY WMSG (0:35);                                        <<03511>>01116000
     BYTE ARRAY MSG(*)=WMSG;                                   <<03511>>01118000
     BYTE ARRAY TEMP(0:13);                                             01120000
                                                                        01122000
     MOVE MSG:=" DISC ",2;                                              01124000
     CASE * FNCT OF                                                     01126000
     BEGIN                                                              01128000
          MOVE * :="READ",2;                                            01130000
          MOVE * :="WRITE",2;                                           01132000
     END;                                                               01134000
     MOVE * :=" ERROR ON LDEV# ",2;                                     01136000
     LOC:=TOS-@MSG;                                                     01138000
     LOC:=LOC+ASCII(LDN,10,MSG(LOC));                                   01140000
     MOVE MSG(LOC):=", STATUS=%",2;                                     01142000
     LEN:=ASCII(IOSTAT.TSTATUS,8,TEMP);                                 01144000
     MOVE * :=TEMP(6-LEN),(LEN),2;                                      01146000
     MOVE * :=", ADDRESS=%",2;                                          01148000
     LEN:=DASCII(ADDR,8,TEMP);                                          01150000
     MOVE * :=TEMP(11-LEN),(LEN),2;                                     01152000
     LEN:=TOS-@MSG;                                                     01154000
     PRINT(WMSG,-LEN,0);                                       <<03511>>01156000
END << DISCERROR >>;                                                    01158000
                                                                        01160000
$CONTROL SEGMENT = PVSYSM                                               01162000
PROCEDURE DISCIO(LDN,FUNCT,BUF,ADDR,WC,ERRINFO);                        01164000
VALUE LDN,FUNCT,ADDR,WC;                                                01166000
INTEGER LDN,FUNCT,WC;                                                   01168000
LOGICAL ERRINFO;                                                        01170000
DOUBLE ADDR;                                                            01172000
ARRAY BUF;                                                              01174000
OPTION VARIABLE;                                                        01176000
OPTION PRIVILEGED,UNCALLABLE;                                           01178000
BEGIN                                                                   01180000
     <<ERRINFO:                                                         01182000
          INPUT - FLAGS FOR ERROR HANDLING                              01184000
                  (15:1) = 0 - OMIT DISC ERROR MESSAGE                  01186000
                           1 - PRINT DISC ERROR MESSAGE.                01188000
                  (14:1) = 0 - DON'T RETURN ERROR STATUS                01190000
                         = 1 - RETURN ERROR TO CALLER.                  01192000
     >>                                                                 01194000
     LOGICAL PMAP = Q-4;                                                01196000
     LOGICAL IOSTAT,ERRFLAGS;                                           01198000
     INTEGER                                                            01200000
          ADDR1 = ADDR,                                                 01202000
          ADDR2 = ADDR+1;                                               01204000
     INTEGER POINTER BUFP = BUF;                                        01206000
                                                                        01208000
     CC:=CCE;                                                           01210000
     ERRFLAGS:=IF PMAP THEN ERRINFO ELSE 1;                             01212000
     IF LPDT(LDN&LSL(1)+LPDT1).DRSTATE=1 AND                   <<01115>>01214000
        LPDT(LDN&LSL(1)+LPDT1).FORS=0  THEN <<SDISC>>          <<01115>>01216000
        TOS:=ATTACHIO(LDN,0,0,@BUFP,FUNCT,WC,ADDR1,ADDR2,%41)           01218000
     ELSE                                                               01220000
        TOS:=ATTACHIO(LDN,0,0,@BUFP,FUNCT,WC,ADDR1,ADDR2,1);            01222000
     DELETE;                                                            01224000
     IOSTAT:=TOS;                                                       01226000
     IF IOSTAT.GSTATUS <> 1 THEN  <<UNSUCESSFUL I/O>>                   01228000
     BEGIN                                                              01230000
          CC:=CCL;                                                      01232000
          IF ERRFLAGS THEN DISCERROR(LDN,FUNCT,IOSTAT,ADDR);            01234000
          IF ERRFLAGS.(14:1) THEN ERRINFO:=IOSTAT;                      01236000
     END;                                                               01238000
END << DISCIO >>;                                                       01240000
                                                                        01242000
$PAGE "PVSYS - PV USER/CONSOLE COMMAND PROCEDURES"                      01244000
                                                                        01246000
$CONTROL SEGMENT = PVSYSM                                               01248000
                                                                        01250000
PROCEDURE GETVSDEFN(VSID,VSDEFN,VSDEF,PVERR);                           01252000
LOGICAL VSDEF;                                                          01254000
INTEGER PVERR;                                                          01256000
ARRAY VSID,VSDEFN;                                                      01258000
OPTION VARIABLE;                                                        01260000
OPTION PRIVILEGED,UNCALLABLE;                                           01262000
BEGIN                                                                   01264000
     LOGICAL PMAP = Q-4;                                                01266000
     LOGICAL CLASSINFO,VSETDEF:=TRUE;                                   01268000
     DOUBLE DIRESULT;                                                   01270000
     INTEGER                                                            01272000
          DIRESULT1 = DIRESULT,                                         01274000
          DIRESULT2 = DIRESULT+1;                                       01276000
     BYTE ARRAY VSIDB(*) = VSID;                                        01278000
     BYTE ARRAY VSDEFNB(*) = VSDEFN;                                    01280000
     DEFINE CLASSENTRY = VSDEFN(4).(0:1)#;                              01282000
                                                                        01284000
     CC:=CCE;  <<ASSUME VOLUME DEFINITION WILL BE FOUND>>               01286000
     IF VSIDB = "* " THEN  <<MOUNT HOME VOLUME SET>>                    01288000
     BEGIN                                                              01290000
          DIRESULT:=DIRECFIND (%10,0D,VSID(8),VSID(4),                  01292000
                               VSID,VSDEFN);                            01294000
          IF <> THEN                                                    01296000
          BEGIN                                                         01298000
               PVERR:=IF DIRESULT2 = 2 THEN (DIRESULT1+NOHVSET)         01300000
                      ELSE DIRECERR;                                    01302000
               RETURN;                                                  01304000
          END;                                                          01306000
          IF VSDEFNB(68) <> "  " THEN                                   01308000
          BEGIN                                                         01310000
               MOVE VSIDB:=VSDEFNB(68),(8),2;                           01312000
               MOVE * :=VSDEFNB(60),(8),2;                              01314000
               MOVE * :=VSDEFNB(52),(8);                                01316000
          END ELSE                                                      01318000
          BEGIN                                                         01320000
               CC:=CCG;                                                 01322000
               IF PMAP THEN PVERR:=NOHVSET;                             01324000
               RETURN;                                                  01326000
          END;                                                          01328000
     END;                                                               01330000
     DIRESULT:=DIRECFIND(%40,0D,VSID(8),VSID(4),VSID,VSDEFN);           01332000
     IF <> THEN                                                         01334000
     BEGIN                                                              01336000
          CC:=CCL;                                                      01338000
          IF PMAP THEN                                                  01340000
          PVERR:=IF DIRESULT2 = 2 THEN (SYSTEMUSE+DIRESULT1) ELSE       01342000
                 DIRECERR;                                              01344000
          RETURN;                                                       01346000
     END;                                                               01348000
     IF CLASSENTRY THEN  <<RETRIEVE MASTER ENTRY>>                      01350000
     BEGIN                                                              01352000
          VSETDEF:=FALSE;  <<VOL CLASS DEFINITION>>                     01354000
          MOVE VSID:=VSDEFN(14),(4),2;  <<SET NAME>>                    01356000
          MOVE   * :=VSDEFN(10),(4),2;  <<GROUP NAME>>                  01358000
          MOVE   * :=VSDEFN( 6),(4);    <<ACCOUNT NAME>>                01360000
          CLASSINFO:=VSDEFN(VDINFO);  <<MASK/NUMBER OF VOLUMES>>        01362000
          DIRESULT:=DIRECFIND (%40,0D,VSDEFN(6),VSDEFN(10),             01364000
                               VSDEFN(14),VSDEFN);                      01366000
          IF <> THEN                                                    01368000
          BEGIN                                                         01370000
               CC:=CCL;                                                 01372000
               IF PMAP THEN                                             01374000
               PVERR:=IF DIRESULT2 = 2 THEN (SYSTEMUSE+DIRESULT1) ELSE  01376000
                      DIRECERR;                                         01378000
               RETURN;                                                  01380000
          END ELSE                                                      01382000
          VSDEFN(VDINFO):=CLASSINFO;                                    01384000
     END;                                                               01386000
     IF PMAP.(14:1) THEN VSDEF:=VSETDEF;  <<TYPE OF DEFINITION>>        01388000
END << GETVSDEFN >>;                                                    01390000
                                                                        01392000
$CONTROL SEGMENT = PVCOMSEG                                             01394000
PROCEDURE CHECKDISC(LDN,STAT);                                          01396000
VALUE LDN;                                                              01398000
INTEGER LDN;                                                            01400000
LOGICAL STAT;                                                           01402000
OPTION PRIVILEGED,UNCALLABLE;                                           01404000
BEGIN                                                                   01406000
     INTEGER DST,TYPE,STYPE,ENTNUM,ENTSIZE,DEVINFO;            <<00078>>01408000
     LOGICAL MASK:=0;  <<ASSUME VALID PV DEVICE>>                       01410000
     DOUBLE RSTATUS;                                                    01412000
     INTEGER                                                            01414000
          RSTATUS1 = RSTATUS,                                           01416000
          RSTATUS2 = RSTATUS+1;                                         01418000
     INTEGER ARRAY LDT(*) = DB+0;                                       01420000
     EQUATE LDT2=2; <<THIRD WORD OF LDT ENTRY>>                <<00078>>01422000
     DEFINE  <<PARTIAL FIELDS>>                                         01426000
          NREADYF  = (14:1)#,  <<NOT-READY BIT OF DRIVE STATUS>>        01428000
          DEVTYPEF = (10:6)#;                                           01430000
     DEFINE                                                             01432000
          DEVNOTINRANGE = NOT (SYSLDEV<=LDN<=ENTNUM)#,                  01434000
          DEVNOTCONFIG  = ((LPDT(LDN&LSL(1)).(0:1) = 1)                 01436000
                          LOR (LPDT(LDN&LSL(1))=0))#,                   01438000
          DISCDEVICE  = (0<= LDT(LDN*ENTSIZE+2).DEVTYPEF <=3)#,<<03511>>01440000
          SYSDOMAIN     = (LPDT(LDN&LSL(1)+1).NSDF = 0)#,               01444000
          RESERVED      = (LPDT(LDN&LSL(1)+1).RESF = 1)#,               01446000
          DOWNDEV       = (LDT((LDN*ENTSIZE)+3).(2:1) = 0)#,            01448000
          DOWNPND       = (LDT((LDN*ENTSIZE)+3).(4:1) = 1)#,            01450000
          MOUNTED       = (LPDT(LDN&LSL(1)+1).MNTF = 1)#,               01452000
          SERIAL        =(((LPDT(LDN&LSL(1)+LPDT1).DRSTATE=1) LOR<<FDF>>01454000
                           (LPDT(LDN&LSL(1)+LPDT1).SDLF=1 )) LAND<<FDF>>01456000
                           (LPDT(LDN&LSL(1)+LPDT1).FORS=0)) #, <<01115>>01458000
          FOREIGN       =((LPDT(LDN&LSL(1)+LPDT1).SDLF=1) LAND <<01115>>01460000
                          (LPDT(LDN&LSL(1)+LPDT1).FORS=1))#;   <<01115>>01462000
                                                                        01464000
     LOGICAL SUBROUTINE OFFLINE;                                        01466000
     BEGIN                                                              01468000
          IF MASK.(11:1) THEN RETURN;  <<DRIVER ISN'T IOMDISC1>>        01472000
          EXCHANGEDB(DST);  <<DB BACK TO ENTRY COND. >>        <<03677>>01474000
          RSTATUS:=REQSTATUS(LDN);                                      01476000
          OFFLINE := IF <> THEN 1 ELSE RSTATUS2.NREADYF;       <<03677>>01478000
          DST:=EXCHANGEDB(LDTDST);                                      01480000
     END <<OFFLINE>>;                                                   01482000
                                                                        01484000
     DST:=EXCHANGEDB(LDTDST);                                           01486000
     ENTNUM:=LDT.(0:8);                                                 01488000
     ENTSIZE:=LDT.(8:8);                                                01490000
     STYPE:=GETSUBTYPE(LDN);                                            01492000
     TYPE:=LDT(LDN*ENTSIZE+LDT2).DEVTYPEF;                     <<00078>>01494000
     IF DEVNOTINRANGE THEN MASK.(15:1):=1 ELSE                          01496000
     IF DEVNOTCONFIG THEN MASK.(14:1):=1 ELSE                           01498000
     IF NOT DISCDEVICE THEN MASK.(13:1):=1 ELSE                         01500000
     BEGIN                                                              01502000
          MASK.(12:1) := (IF MHDISC  THEN 0 ELSE 1);           <<03511>>01504000
          MASK.(11:1) := (IF REMVBLE  THEN 0 ELSE 1);          <<03511>>01506000
          IF SYSDOMAIN THEN MASK.(10:1):=1;                             01508000
          IF NOT DOWNDEV THEN  <<CHECK IF ON-LINE>>            <<03677>>01510000
          IF OFFLINE THEN MASK.( 9:1):=1;                               01512000
          IF (SERIAL) AND NOT DOWNDEV THEN MASK.( 8:1):=1;              01514000
          IF RESERVED THEN MASK.(7:1):=1;                               01516000
          IF DOWNDEV THEN MASK.(6:1):=1;                                01518000
          IF DOWNPND THEN MASK.(5:1):=1;                                01520000
          IF MOUNTED THEN MASK.(4:1):=1;                                01522000
          IF (FOREIGN) AND NOT DOWNDEV THEN MASK.(3:1):=1;     <<01115>>01524000
     END;                                                               01526000
     EXCHANGEDB(DST);                                                   01528000
     STAT:=MASK;                                                        01530000
END << CHECKDISC >>;                                                    01532000
$CONTROL SEGMENT=PVCOMSEG                                               01534000
$PAGE                                                                   01536000
PROCEDURE Print'Dfs'Problems (ldev);                           <<03504>>01538000
   VALUE ldev;                                                          01540000
   INTEGER ldev;                                                        01542000
                                                                        01544000
<<==============================================================        01546000
                                                                        01548000
      This procedure checks to see if disc free space al-               01550000
   location is disabled on the specified ldev, and if it is             01552000
   prints the reason on $STDLIST.                                       01554000
                                                                        01556000
   Parameters:                                                          01558000
      ldev - Logical device number.                                     01560000
                                                                        01562000
   Assumptions on entry:                                                01564000
      DB is at the stack.                                               01566000
                                                                        01568000
   Exit conditions:                                                     01570000
      DB is unchanged.                                                  01572000
                                                                        01574000
   Globals:                                                             01576000
                                                                        01578000
      Input:                                                            01580000
         LDTX dfs'error'word                                            01582000
                                                                        01584000
      Equates:                                                          01586000
         ldtdst                                                         01588000
         ldt'entry'size                                                 01590000
         dfs'error'word                                                 01592000
         disc'label'read'error {INCLDFS2}                               01594000
         dmsg'read'disc'label'error {INCLDFS2}                          01596000
         disc'label'write'error {INCLDFS2}                              01598000
         dmsg'write'disc'label'error {INCLDFS2}                         01600000
         dtt'read'error {INCLDFS2}                                      01602000
         dmsg'dtt'read'error {INCLDFS2}                                 01604000
         old'dfs'error {INCLDFS2}                                       01606000
         dmsg'old'dfs'msg {INCLDFS2}                                    01608000
         get'dst'error {INCLDFS2}                                       01610000
         dmsg'get'dfs'error {INCLDFS2}                                  01612000
         dt'read'error {INCLDFS2}                                       01614000
         dmsg'dt'read'error {INCLDFS2}                                  01616000
         dt'write'error {INCLDFS2}                                      01618000
         dmsg'dt'write'error {INCLDFS2}                                 01620000
         get'vm'error {INCLDFS2}                                        01622000
         dmsg'get'vm'error {INCLDFS2}                                   01624000
         map'damaged'error {INCLDFS2}                                   01626000
         space'already'free'error {INCLDFS2}                            01628000
         dmsg'space'already'free'error {INCLDFS2}                       01630000
         space'not'free'error {INCLDFS2}                                01632000
         dmsg'space'not'free'error {INCLDFS2}                           01634000
         dmsg'unexpected'dfs'error {INCLDFS2}                           01636000
         vinit'error {INCLDFS2}                                         01638000
         dmsg'vinit'error {INCLDFS2}                                    01640000
         dfs'msg'set'num {INCLDFS2}                                     01642000
                                                                        01644000
      Defines:                                                          01646000
         error'type {INCLDFS2}                                          01648000
                                                                        01650000
   Externals:                                                           01652000
      Genmsg                                                            01654000
                                                                        01656000
   Intrinsics:                                                          01658000
      None.                                                             01660000
                                                                        01662000
   Callers:                                                             01664000
      Dstatcom                                                          01666000
                                                                        01668000
   Fix ID:                                                              01670000
         This procedure was added as part of the new disc               01672000
      free space map changes.  The fix number on the                    01674000
      procedure header applies to the whole procedure.                  01676000
                                                                        01678000
   Changes:                                                             01680000
                                                                        01682000
                                                                        01684000
==============================================================>>        01686000
                                                                        01688000
BEGIN                                                                   01690000
                                                                        01692000
   ARRAY ldt'entry (0:ldt'entry'size-1);                                01694000
   LOGICAL dfs'error;                                                   01696000
   INTEGER error'msg'number;                                            01698000
                                                                        01700000
$INCLUDE INCLDFS2                                                       01702000
                                                                        01704000
   << - - - - - - - - - - >>                                            01706000
                                                                        01708000
   << Check LDTX to see if there is any problems with the >>            01710000
   << disc free space table on this device.               >>            01712000
                                                                        01714000
   TOS := @ldt'entry;      << Target >>                                 01716000
   TOS := ldtdst;         << DST of LDT/LDTX >>                         01718000
   TOS := 0;               << Header offset   >>                        01720000
   TOS := ldt'entry'size;  << Size of header  >>                        01722000
   ASSEMBLE (MFDS 4);      << Get LDT header  >>                        01724000
                                                                        01726000
   TOS := @ldt'entry;      << Target >>                                 01728000
   TOS := ldtdst;          << DST of LDTX >>                            01730000
   TOS := ldt'entry (1) +  << Calc header offset >>                     01732000
          ldt'entry (3) +                                               01734000
          LOGICAL(ldev * ldt'entry'size);                               01736000
   TOS := ldt'entry'size;  << Size of entry >>                          01738000
   ASSEMBLE (MFDS 4);      << Get LDTX entry >>                         01740000
                                                                        01742000
   << Check if free space map is o.k. >>                                01744000
                                                                        01746000
   dfs'error := ldt'entry (ldtx'dfs'error'word).error'type;             01748000
                                                                        01750000
   IF dfs'error THEN                                                    01752000
      RETURN;  << All's o.k. >>                                         01754000
                                                                        01756000
   << Get error msg number according to type of error >>                01758000
                                                                        01760000
   IF dfs'error = disc'label'read'error THEN                            01762000
      error'msg'number := dmsg'read'disc'label'error                    01764000
   ELSE                                                                 01766000
   IF dfs'error = disc'label'write'error THEN                           01768000
      error'msg'number := dmsg'write'disc'label'error                   01770000
   ELSE                                                                 01772000
   IF dfs'error = dtt'read'error THEN                                   01774000
      error'msg'number := dmsg'dtt'read'error                           01776000
   ELSE                                                                 01778000
   IF dfs'error = old'dfs'error THEN                                    01780000
      error'msg'number := dmsg'old'dfs'msg                              01782000
   ELSE                                                                 01784000
   IF dfs'error = get'dst'error THEN                                    01786000
      error'msg'number := dmsg'get'dst'error                            01788000
   ELSE                                                                 01790000
   IF dfs'error = dt'read'error THEN                                    01792000
      error'msg'number := dmsg'dt'read'error                            01794000
   ELSE                                                                 01796000
   IF dfs'error = dt'write'error THEN                                   01798000
      error'msg'number := dmsg'dt'write'error                           01800000
   ELSE                                                                 01802000
   IF dfs'error = get'vm'error THEN                                     01804000
      error'msg'number := dmsg'get'vm'error                             01806000
   ELSE                                                                 01808000
   IF dfs'error = map'damaged'error THEN                                01810000
      error'msg'number := dmsg'map'damaged'error                        01812000
   ELSE                                                                 01814000
   IF dfs'error = space'already'free'error THEN                         01816000
      error'msg'number := dmsg'space'already'free'error                 01818000
   ELSE                                                                 01820000
   IF dfs'error = space'not'free'error THEN                             01822000
      error'msg'number := dmsg'space'not'free'error                     01824000
   ELSE                                                                 01826000
   IF dfs'error = vinit'error THEN                                      01828000
      error'msg'number := dmsg'vinit'error                              01830000
   ELSE                                                                 01832000
      error'msg'number := dmsg'unexpected'dfs'error;                    01834000
                                                                        01836000
   Genmsg (dfs'msg'set'num, error'msg'number, [1/0,3/1,12/0],           01838000
           ldev);                                                       01840000
                                                                        01842000
END;  << Print'Dfs'Problems >>                                          01844000
                                                                        01846000
$CONTROL SEGMENT = PVCOMSEG                                             01848000
INTEGER PROCEDURE DSTATCOM(REQTYPE,LDEV);                               01850000
VALUE REQTYPE,LDEV;                                                     01852000
INTEGER REQTYPE,LDEV;                                                   01854000
OPTION PRIVILEGED,UNCALLABLE;                                           01856000
<<*****************************************************>>      <<00078>>01858000
<<NOTE:                                                >>      <<00078>>01860000
<<     THIS PROCEDURE CANNOT BE CALLED IN SPLIT STACK  >>      <<00078>>01862000
<<     MODE BECAUSE OF THE MFDS TO DETERMINE THE DISC  >>      <<00078>>01864000
<<     TYPE.                                           >>      <<00078>>01866000
<<*****************************************************>>      <<00078>>01868000
BEGIN                                                                   01870000
     INTEGER I,DEV,LEN,LOC,LOWD,HIGHD,STYPE,STATN;                      01872000
     LOGICAL MASK,STATUS,FIRSTIME:=TRUE;                       <<03677>>01874000
     LOGICAL check'dfs'status;  << Flag to indicating the >>   <<03504>>01876000
                                << need to check on disc  >>   <<03504>>01878000
                                << free space problems    >>   <<03504>>01880000
                                << for the current ldev.  >>   <<03504>>01882000
EQUATE LDTSIZE=5;                                              <<00078>>01884000
INTEGER ARRAY LDTHOLD(0:LDTSIZE-1)=Q;                          <<00078>>01886000
DEFINE DEVTYPE=LDTHOLD(2).(10:6)#;                             <<00078>>01888000
     ARRAY VLAB(0:127);  <<VOLUME LABEL BUFFER>>                        01890000
     BYTE ARRAY VLABB(*) = VLAB;                                        01892000
     DEFINE                                                             01894000
          MV      = VLAB(LDEVINFO).MVF#,                                01896000
          SCRATCH = VLAB(LDEVINFO).SCRATCHF#;                           01898000
     BYTE ARRAY NAME(0:9);                                              01900000
     ARRAY  WPBUF(0:32);                                       <<03511>>01902000
     BYTE ARRAY PBUF(*) = WPBUF;     << Print buffer >>        <<03511>>01904000
     BYTE ARRAY HEAD1(*)=PB:=                                           01906000
          "  LDEV-TYPE     STATUS      VOLUME (VOLUME SET-GEN)";        01908000
     BYTE ARRAY HEAD2(*)=PB:=                                           01910000
          " -----------   ---------   -------------------------";       01912000
                                                                        01914000
                                                               <<03511>>01916000
     EQUATE TYPELEN = 8;                                                01918000
     EQUATE NUMDISCSTYPES=14;                                  <<03511>>01920000
     BYTE ARRAY TYPEKEY(*)=PB:=                                         01922000
          "FIXED HD",                                                   01924000
          "7900(L) ",                                                   01926000
          "7900(U) ",                                                   01928000
          "7900    ",                                                   01930000
          "ISS     ",                                                   01932000
          "7905(R) ",                                                   01934000
          "7905(F) ",                                                   01936000
          "7905(T) ",                                                   01938000
          "7905(SD)",                                                   01940000
          "7920    ",                                                   01942000
          "7925    ",                                          <<00078>>01944000
          "7906(R) ",                                          <<00078>>01946000
          "7906(F) ",                                          <<00078>>01948000
          "7906(T) ",                                          <<00078>>01950000
          "7902    ",                                          <<03511>>01952000
          "9110    ",      << Linus >>                         <<03547>>01954000
          "7911    ",                                          <<03511>>01956000
          "7912    ",                                          <<03511>>01958000
        5("        "),                                         <<03511>>01960000
          "7933    ";                                          <<04278>>01962000
     EQUATE STATLEN = 8;                                                01964000
     BYTE ARRAY STATKEY(*)=PB:=                                         01966000
          "SYSTEM  ",                                                   01968000
          "OFF-LINE",                                                   01970000
          "SERIAL  ",                                                   01972000
          "RESERVED",                                                   01974000
          "DOWNED  ",                                                   01976000
          "DOWN-PND",                                                   01978000
          "MOUNTED ",                                                   01980000
          "AVAIL   ",                                          <<03677>>01982000
          "FOREIGN ";                                          <<01115>>01984000
     EQUATE                                                             01986000
          OKEXIT = 0;                                                   01988000
     DEFINE  <<STATUS BITS>>                                            01990000
          SYSDEV   = (10:1)#,                                           01992000
          FIXHD    = (12:1)#,                                           01994000
          OFFLINE  = ( 9:1)#,                                           01996000
          SERIAL   = ( 8:1)#,                                           01998000
          DOWNED   = ( 6:1)#,                                  <<03504>>02000000
          AVAILF   = ( 3:1)#,  << A REAL KLUDGE >>             <<01115>>02002000
          FOREIGN  = ( 3:1)#;                                  <<01115>>02004000
     DEFINE                                                             02006000
          SCRATCHVOL = (DISCTYPE(DEV,VLAB)=3)#,                <<01115>>02008000
          SERIALVOL  = (DISCTYPE(DEV,VLAB)=2)#,                <<01115>>02010000
          SYSTEMVOL  = (DISCTYPE(DEV,VLAB)=0)#,                <<01115>>02012000
          FOREIGNVOL = (DISCTYPE(DEV,VLAB)=4)#;                <<01115>>02014000
     DEFINE                                                             02016000
          PVDISC     = (LDEV= 0 LAND NOT STATUS.SYSDEV)#,               02018000
          THISDISC   = (DEV= LDEV)#,                                    02020000
          ALLDISCS   = (LDEV= -1)#,                                     02022000
          SYSTEMDISC = (STATUS.SYSDEV)#,                                02024000
          VALIDEVICE = ((STATUS LAND %7)= 0)#;                          02026000
                                                                        02028000
     SUBROUTINE PEXIT(EXITYPE);                                         02030000
     VALUE EXITYPE; INTEGER EXITYPE;                                    02032000
     BEGIN                                                              02034000
          CC:=IF EXITYPE = OKEXIT THEN CCE ELSE CCL;                    02036000
          DSTATCOM:=EXITYPE;                                            02038000
          ASSEMBLE(EXIT 2);                                             02040000
     END <<PEXIT>>;                                                     02042000
                                                                        02044000
     PUSH(STATUS);                                                      02046000
     TOS.(2:1):=0;  <<RESET USER TRAPS - AVOID ATTACHIO PROBLEMS>>      02048000
     SET(STATUS);                                                       02050000
                                                                        02052000
     LOWD:=IF LDEV > 0 THEN LDEV ELSE 1;                                02054000
     HIGHD:=IF LDEV > 0 THEN LDEV ELSE LPDT(0).(0:8);                   02056000
     FOR DEV:=LOWD UNTIL HIGHD DO  <<CHECK DEV STATUS>>                 02058000
     BEGIN                                                              02060000
                                                               <<03504>>02062000
          check'dfs'status := FALSE;                           <<03504>>02064000
                                                               <<03504>>02066000
          STATUS:=0;                                                    02068000
          CHECKDISC(DEV,STATUS);                                        02070000
          IF STATUS.FOREIGN THEN STATN:=2                      <<01115>>02072000
           ELSE                                                <<01115>>02074000
            BEGIN                                              <<01115>>02076000
              STATN:=15;  <<BIT POSITION IN STATUS>>           <<01115>>02078000
              IF STATUS.(11:1) THEN STATUS.(10:2):=%2;         <<01115>>02080000
              IF STATUS.( 5:1) THEN STATUS.( 5:2):=%2;         <<01115>>02082000
              MASK:=STATUS;  <<MASK WILL BE SHIFTED>>          <<01115>>02084000
              MASK.AVAILF:=1;  <<ASSUME PV AVAIL>>             <<01115>>02086000
              WHILE NOT MASK DO                                <<01115>>02088000
              BEGIN                                            <<01115>>02090000
                   STATN:=STATN-1;                             <<01115>>02092000
                   MASK:=MASK & LSR(1);                        <<01115>>02094000
              END;                                             <<01115>>02096000
            END;                                               <<01115>>02098000
                                                               <<03511>>02100000
          IF STATN > 10 THEN STATUS.(13:1) := 1;  << Invalid >><<03511>>02102000
                                                               <<03511>>02104000
          IF VALIDEVICE THEN  <<ITS A CONFIGURED DISC>>                 02106000
          IF ALLDISCS OR THISDISC OR PVDISC THEN                        02108000
          BEGIN  <<PRINT DEV STATUS INFO>>                              02110000
               STATN:=10-STATN;  <<INDEX INTO STATKEY>>                 02114000
               IF FIRSTIME THEN  <<PRINT HEADING>>                      02116000
               BEGIN                                                    02118000
                    FIRSTIME:=FALSE;                                    02120000
                    MOVE PBUF:=HEAD1,(51);                              02122000
                    PRINT(WPBUF,-51,0);                        <<03511>>02124000
                    MOVE PBUF:=HEAD2,(52);                              02126000
                    PRINT(WPBUF,-52,0);                        <<03511>>02128000
               END;                                                     02130000
                                                               <<03511>>02132000
               LEN:=25;  <<ASSUME NO VOLUME NAME TO BE PRINTED>>        02134000
                                                               <<03511>>02136000
               WPBUF := "  ";                                  <<03511>>02138000
               MOVE WPBUF(1) := WPBUF, (32);                   <<03511>>02140000
                                                               <<03511>>02142000
               STYPE:=GETSUBTYPE(DEV)+1; <<Index into TYPEKEY>><<03511>>02144000
               TOS:=@LDTHOLD;                                  <<00078>>02146000
               TOS:=LDTDST;                                    <<00078>>02148000
               TOS:=DEV*LDTSIZE;                               <<00078>>02150000
               TOS:=LDTSIZE;                                   <<00078>>02152000
               ASSEMBLE(MFDS 4);                               <<00078>>02154000
                                                               <<03511>>02156000
               << Need to alter STYPE to properly index into >><<03511>>02158000
               << TYPEKEY list.                              >><<03511>>02160000
                                                               <<03511>>02162000
               IF DEVTYPE = 2  THEN STYPE := NUMDISCSTYPES;    <<03511>>02164000
               IF DEVTYPE = 3                                  <<03511>>02166000
                 THEN STYPE := STYPE +NUMDISCSTYPES;           <<03511>>02168000
                                                               <<03511>>02170000
                                                               <<03511>>02172000
               IF STATUS.FIXHD THEN                                     02174000
               BEGIN                                                    02176000
                    STYPE:=0;                                           02178000
                    STATN:=0;  <<FIXED HEAD = SYSTEM DISC>>             02180000
                    STATUS.SYSDEV:=1;  <<MARK AS SYSTEM DISC>>          02182000
               END;                                                     02184000
               ASCII(DEV,-10,PBUF(2));                                  02186000
               MOVE PBUF(3):="-",2;                                     02188000
               MOVE * := TYPEKEY(STYPE*TYPELEN), (TYPELEN);    <<03511>>02190000
                                                               <<03511>>02192000
               << Want to print product number for both kinds ><<03511>>02194000
               << of floppies --  "7902/9895"                 ><<03511>>02196000
                                                               <<03511>>02198000
               IF DEVTYPE = 2 THEN MOVE PBUF(8) := "/9895";    <<03511>>02200000
                                                               <<03511>>02202000
               MOVE PBUF(16):=STATKEY(STATN*STATLEN),(STATLEN);         02204000
               <<To avoid a delay when the device is downed, >><<03677>>02206000
               <<DSTAT will not read a volume label to       >><<03677>>02208000
               <<determent type of media.For example in LINUS>><<03677>>02210000
               <<case when device is downed and VINIT        >><<03677>>02212000
               <<performs a format or verify function a read >><<03677>>02214000
               <<request can be delayed in worst case for    >><<03677>>02216000
               <<about 40 minutes. For a serial disc is      >><<03677>>02218000
               <<unneccessary to read a volume label to      >><<03677>>02220000
               <<check if the media is not SCRATCH.          >><<03677>>02222000
               IF NOT (STATUS.OFFLINE LOR STATUS.SERIAL LOR    <<01115>>02224000
                         STATUS.FOREIGN LOR STATUS.DOWNED) THEN<<03677>>02226000
               BEGIN                                                    02228000
                    MASK:=0;  <<NO ERROR MESSAGE>>                      02230000
                    DISCIO(DEV,R,VLAB,0D,128,MASK);                     02232000
                    IF <> THEN                                          02234000
                    BEGIN                                               02236000
                         LEN := 48;                            <<03677>>02238000
                         MOVE PBUF(28):="* UNREADABLE LABEL *";<<03677>>02240000
                    END ELSE                                   <<03677>>02242000
                    IF SYSTEMDISC THEN  <<SYSTEM VOLUME>>               02244000
                    BEGIN                                               02246000
                         LEN:=36;                                       02248000
                         MOVE PBUF(28):=VLABB(LVNAMELOC),(8);           02250000
                                                               <<03504>>02252000
                         IF NOT status.downed THEN             <<03504>>02254000
                            check'dfs'status := TRUE;          <<03504>>02256000
                                                               <<03504>>02258000
                    END ELSE                                            02260000
                    BEGIN                                               02262000
                         IF SCRATCHVOL THEN                             02264000
                         BEGIN                                          02266000
                              LEN:=38;                                  02268000
                              MOVE PBUF(28):="*SCRATCH*";               02270000
                         END ELSE                                       02272000
                         IF SERIALVOL THEN                              02274000
                         BEGIN                                          02276000
                              LEN:=41;                                  02278000
                              MOVE PBUF(28):="*SERIAL DISC*";           02280000
                         END ELSE                                       02282000
                         IF FOREIGNVOL THEN                    <<01115>>02284000
                         BEGIN                                 <<01115>>02286000
                              LEN:=42;                         <<01115>>02288000
                              MOVE PBUF(28):="*FOREIGN DISC*"; <<01115>>02290000
                         END ELSE                              <<01115>>02292000
                         BEGIN                                          02296000
                              MOVE PBUF(28):=VLABB(LVNAMELOC),(8);      02298000
                              IF SYSTEMVOL THEN                         02300000
                              BEGIN                                     02302000
                                   LEN:=54;                             02304000
                                   MOVE PBUF(36):=" (SYSTEM VOLUME)";   02306000
                              END ELSE                                  02308000
                              BEGIN                                     02310000
                                   I:=-1;                               02312000
                                   LOC:=LVOLDIRLOC;                     02314000
                                   MOVE PBUF(36):=" (",2;               02316000
                                   WHILE (I:=I+1) < 3 DO                02318000
                                   BEGIN                                02320000
                                        MOVE NAME:="         ";         02322000
                                        MOVE NAME:=VLABB(LOC),(8);      02324000
                                        MOVE * := NAME WHILE AN,1;      02326000
                                        IF I < 2 THEN                   02328000
                                           MOVE * :=".",2               02330000
                                        ELSE                            02332000
                                           MOVE * :="-",2;              02334000
                                        LOC:=LOC-8;  <<NEXT NAME>>      02336000
                                   END;                                 02338000
                                   LEN:=TOS-@PBUF;                      02340000
                                   LEN:=LEN+ASCII(VLAB(LGENINDEX),10,   02342000
                                                  PBUF(LEN));           02344000
                                   PBUF(LEN):=")";                      02346000
                                   LEN:=LEN+1;                          02348000
                                                               <<03504>>02350000
                                   IF NOT status.downed THEN   <<03504>>02352000
                                      check'dfs'status := TRUE;<<03504>>02354000
                                                               <<03504>>02356000
                              END;                                      02358000
                         END;                                           02360000
                    END;                                                02362000
               END;                                                     02364000
               IF STATUS.SERIAL LOR STATUS.FOREIGN THEN        <<01115>>02366000
               BEGIN                                                    02368000
                    IF LPDT(DEV&LSL(1)+1).DRSTATE<>1 THEN               02370000
                    BEGIN                                               02372000
                         LEN:=41;                                       02374000
                         MOVE PBUF(28):=                                02376000
                         "*UNALLOCATED*";                               02378000
                    END ELSE                                            02380000
                    IF LPDT(DEV&LSL(1)+1).SDLF<>1 THEN                  02382000
                    BEGIN                                               02384000
                         LEN:=38;                                       02386000
                         MOVE PBUF(28):=                                02388000
                         "*UNLOADED*";                                  02390000
                    END;                                                02392000
               END;                                                     02394000
               PRINT(WPBUF,-LEN,0);                            <<03511>>02396000
                                                               <<03504>>02398000
               IF check'dfs'status THEN                        <<03504>>02400000
                  Print'Dfs'Problems (dev);                    <<03504>>02402000
                                                               <<03504>>02404000
          END ELSE ELSE                                                 02406000
          IF THISDISC THEN PEXIT(60+(15-STATN));                        02408000
     END;                                                               02410000
     PEXIT(OKEXIT);                                                     02412000
END << DSTATCOM >>;                                                     02414000
$CONTROL SEGMENT=PVSYSM                                        <<00776>>02416000
INTEGER PROCEDURE GET'JSMPIN (PIN);                            <<00776>>02418000
    VALUE   PIN;                                               <<00776>>02420000
    INTEGER PIN;                                               <<00776>>02422000
    OPTION PRIVILEGED,UNCALLABLE;                              <<01197>>02424000
    BEGIN                                                      <<00776>>02426000
        COMMENT                                                <<00776>>02428000
            THIS FUNCTION WILL RETURN THE PROCESS ID NUMBER OF <<00776>>02430000
            THE FIRST PROCESS, RELATIVE TO "PIN", THAT IS NOT  <<00776>>02432000
            EITHER A TYPE "USER" OR "USER, SON OF MAIN". THE   <<00776>>02434000
            SCAN STARTS AT PIN AND WORKS BACKWARDS THROUGH THE <<00776>>02436000
            HIERARCHY OF "PIN'S" FAMILY.                       <<00776>>02438000
            ; <<END OF COMMENT>>                               <<00776>>02440000
        INTEGER                                                <<00776>>02442000
            I;  <<TEMP STORAGE>>                               <<00776>>02444000
        WHILE PIN <> 0 <<COMPLETE PCB ENTRY>> AND              <<00786>>02446000
              PCB ((I:=PIN*PCBSZ)+PTYPEW).PTYPEF < JSMTYP DO   <<00786>>02448000
              PIN := PCB (I+FPNTRW).FPNTRF;                    <<00776>>02450000
        GET'JSMPIN := PIN;                                     <<00776>>02452000
    END;<<OF GET'JSMPIN>>                                      <<00776>>02454000
                                                               <<00776>>02456000
                                                                        02458000
                                                                        02460000
$CONTROL SEGMENT = PVCOMSEG                                             02462000
INTEGER PROCEDURE VSUSERCOM(REQTYPE,NUMPARMS,VSNAME);                   02464000
VALUE REQTYPE,NUMPARMS;                                                 02466000
INTEGER REQTYPE,NUMPARMS;                                               02468000
BYTE ARRAY VSNAME;                                                      02470000
OPTION PRIVILEGED,UNCALLABLE;                                           02472000
BEGIN                                                                   02474000
     ARRAY JMAT(*) = DB+0;                                              02476000
     INTEGER JMATSIZE:=0;                                               02478000
     INTEGER I,J,K,LEN,LOC,PIN,UCNT,MVDEV,MVTABX,PARSERR,               02480000
             NAMELEN,NAMELOC;                                           02482000
     INTEGER                                                            02484000
          LOWMVTABX  :=  1,  <<LOWEST VALID MVTAB INDEX>>               02486000
          HIGHMVTABX := 16;  <<HIGHEST VALID MVTAB INDEX>>              02488000
     LOGICAL A,B,SCANJMAT:=TRUE,NONEINUSE:=TRUE;               <<00786>>02490000
     INTEGER ENTADDR,LASTADDR;                                          02492000
     EQUATE INFOSIZE = 255;                                    <<00786>>02494000
     INTEGER ARRAY INFO(0:INFOSIZE-1);                                  02496000
     EQUATE USIZE = 13;  <<USERS ARRAY ENTRY SIZE>>                     02498000
     LOGICAL ZSIZE'CALLED := FALSE; <<SET IF ZREG ALTERED>>    <<01000>>02500000
     INTEGER LASTUSERSIZE := 0; <<CURRENT SPACE FOR USERS>>    <<01000>>02502000
     INTEGER USERSIZE,SREG,ZREG,ORIG'ZREG,SPACENEEDED;         <<01000>>02504000
     INTEGER POINTER USERS;                                    <<01000>>02506000
     BYTE POINTER USERSB;                                      <<01000>>02508000
     EQUATE VSDEFNSIZE = 56;<<VOLUME SET DEFINITION ENTRYSIZE>><<01000>>02510000
     ARRAY VSDEFN(0:VSDEFNSIZE-1);                                      02512000
     ARRAY JMATENT(*) = VSDEFN;                                         02514000
     ARRAY MVTABENT(*) = VSDEFN;                                        02516000
     ARRAY VLAB(*) = VSDEFN;                                            02518000
     BYTE ARRAY VLABB(*) = VLAB;                                        02520000
     BYTE ARRAY VSID(0:23);                                             02522000
     ARRAY WPBUF(0:31);                                        <<03511>>02524000
     BYTE ARRAY                                                         02526000
          NAME(0:9),                                                    02528000
          PBUF(*) = WPBUF;                                     <<03511>>02530000
     BYTE ARRAY HEAD1(*)=PB:=                                           02532000
          " VOLUME SET NAME            JOBNUM   JOB NAME";              02534000
     BYTE ARRAY HEAD2(*)=PB:=                                           02536000
          " ---------------            ------   ----------";            02538000
     EQUATE                                                             02540000
          JOB      =  2;                                                02542000
     EQUATE  <<JMAT LOCATIONS>>                                         02544000
          JOBINFO   =  1,  <<JOB TYPE AND NUMBER>>                      02546000
          UNAMELOC  =  2,  <<LOCATION OF USER NAME (WORDS>>             02548000
          JNAMELOC  = 10,  <<LOCATION OF JOB NAME (WORDS>>     <<00776>>02550000
          MAINPIN   = 22;  <<JMAT MAIN PIN LOC>>                        02552000
     DEFINE  <<JMAT FIELDS>>                                            02554000
          TY        = (0: 2)#,                                          02556000
          JNUMBER   = (2:14)#,                                          02558000
          MAINPINF  = (0: 8)#;                                          02560000
     DEFINE                                                             02562000
          JMATCURSIZE   = JMATENT.(8:8)#,  <<CURRENT SIZE/128>>         02564000
          JOBEXECUTING  = (JMATENT.(0:6) = 2)#,                <<01000>>02566000
          JOBSUSPENDED  = (JMATENT.(0:6) = 4)#,                <<01000>>02568000
          JOBTERMINATING= (JMATENT.(0:6) = 3)#,                <<01000>>02570000
          SNUM          = (JMATENT(9))#,                       <<01000>>02572000
          JNUM          = (JMATENT(11))#;                      <<01000>>02574000
                                                                        02576000
     SUBROUTINE PEXIT(EXITYPE);                                         02578000
     VALUE EXITYPE; INTEGER EXITYPE;                                    02580000
     BEGIN                                                              02582000
          CC:=IF EXITYPE = OKEXIT THEN CCE ELSE CCL;                    02584000
          VSUSERCOM:=EXITYPE;                                           02586000
          IF ZSIZE'CALLED THEN ZSIZE(ORIG'ZREG); <<RESTORE Z>> <<01000>>02588000
          ASSEMBLE(EXIT 3);                                             02590000
     END <<PEXIT>>;                                                     02592000
                                                                        02594000
     SUBROUTINE GETJMATENTRY;                                           02596000
     BEGIN                                                              02598000
          TOS:=@JMATENT;                                                02600000
          TOS:=JMATDST;                                                 02602000
          TOS:=ENTADDR;                                                 02604000
          TOS:=JMATSIZE;                                                02606000
          ASSEMBLE(MFDS 4);                                             02608000
      END << GETABENTRY >>;                                             02610000
                                                               <<01000>>02612000
     SUBROUTINE GETHEADERINFO;                                 <<01000>>02614000
     BEGIN                                                     <<01000>>02616000
          TOS:=@JMATENT;                                       <<01000>>02618000
          TOS:=JMATDST;                                        <<01000>>02620000
          TOS:=0;                                              <<01000>>02622000
          TOS:=12; <<FIRST 12 WORDS OF ZERO ENTRY>>            <<01000>>02624000
          ASSEMBLE(MFDS 4);                                    <<01000>>02626000
          JMATSIZE:=JMATENT(1).(8:8);  <<ENTRY SIZE>>          <<01000>>02628000
          ENTADDR:=JMATENT(2); <<ADDR OF FIRST ENTRY>>         <<01000>>02630000
          LASTADDR:=INTEGER(JMATCURSIZE * 128) - JMATSIZE;     <<01000>>02632000
          USERSIZE:=(JNUM+SNUM)*USIZE; <<SPACE NEEDED FOR USERS<<01000>>02634000
     END <<GETHEADERINFO>>;                                    <<01000>>02636000
                                                               <<01000>>02638000
     LOGICAL SUBROUTINE ENUF'STACKSPACE(SPACENEEDED);          <<01000>>02640000
     VALUE SPACENEEDED;                                        <<01000>>02642000
     INTEGER SPACENEEDED;                                      <<01000>>02644000
         BEGIN                                                 <<01000>>02646000
         << THIS ROUTINE DETERMINES WHETHER    >>              <<01000>>02648000
         << THERE IS ENOUGH STACK SPACE TO EX- >>              <<01000>>02650000
         << PAND USERS ARRAY BY SPACENEEDED.   >>              <<01000>>02652000
         << NOTE SPACENEEDED MAY BE NEGATIVE   >>              <<01000>>02654000
         ENUF'STACKSPACE := TRUE;                              <<01000>>02656000
         IF SPACENEEDED > 0 THEN                               <<01000>>02658000
            BEGIN                                              <<01000>>02660000
            PUSH(S,Z);                                         <<01000>>02662000
            ZREG := TOS;                                       <<01000>>02664000
            SREG := TOS;                                       <<01000>>02666000
            IF ZREG-SREG < SPACENEEDED THEN                    <<01000>>02668000
               BEGIN                                           <<01000>>02670000
               ZSIZE'CALLED := TRUE;                           <<01000>>02672000
               ZSIZE(SREG+SPACENEEDED);                        <<01000>>02674000
               IF > THEN ENUF'STACKSPACE := FALSE;             <<01000>>02676000
               END;                                            <<01000>>02678000
            END;                                               <<01000>>02680000
     END <<ENUF'STACKSPACE>>;                                  <<01000>>02682000
                                                               <<01000>>02684000
                                                                        02686000
     SUBROUTINE PRINTHEAD;                                              02688000
     BEGIN                                                              02690000
          PRINT (WPBUF,0,"1");                                 <<03511>>02692000
          MOVE PBUF:=HEAD1,(45);                                        02694000
          PRINT(WPBUF,-45,0);                                  <<03511>>02696000
          MOVE PBUF:=HEAD2,(47);                                        02698000
          PRINT(WPBUF,-47,0);                                  <<03511>>02700000
     END <<PRINTHEAD>>;                                                 02702000
                                                                        02704000
     SUBROUTINE FILLNAME;                                               02706000
     BEGIN                                                              02708000
          NAME (8) := " ";  <<NON-ALPHA STOPPER>>              <<00776>>02710000
          J:=-1;                                                        02712000
          TOS:=@PBUF(1);                                                02714000
          PBUF:=" "; MOVE PBUF(1):=PBUF,(63);                           02716000
          WHILE (J:=J+1) < 3 DO  <<FORMAT NAME FOR PRINT>>              02718000
          BEGIN                                                         02720000
               MOVE NAME:=VSID(J*8),(8);                                02722000
               MOVE * :=NAME WHILE AN,1;                                02724000
               IF J < 2 THEN                                            02726000
                  MOVE * :=".",2                                        02728000
               ELSE                                                     02730000
                  MOVE * :=" ",2;                                       02732000
          END;                                                          02734000
          NAMELEN:=TOS-@PBUF;                                           02736000
     END <<FILLNAME>>;                                                  02738000
                                                                        02740000
     SUBROUTINE PRINTUSERS;                                             02742000
     BEGIN                                                              02744000
          I:=-1;                                                        02746000
          FILLNAME;                                                     02748000
          NAME(8):=" ";  <<NON-ALPHA STOPPER>>                          02750000
          WHILE (I:=I+1) <= UCNT DO                                     02752000
          BEGIN                                                         02754000
               J:=-1;                                                   02756000
               LOC:=I * USIZE;                                          02758000
               NAMELOC:=(LOC+1) & LSL(1);  <<BYTE POINTER>>             02760000
               PBUF(28):="#";                                           02762000
               PBUF(29):=IF USERS(LOC).TY = JOB THEN "J" ELSE "S";      02764000
               ASCII(USERS(LOC).JNUMBER,10,PBUF(30));                   02766000
               TOS:=@PBUF(37);                                          02768000
               WHILE (J:=J+1) < 3 DO  <<FORMAT JOB NAME>>               02770000
               BEGIN                                                    02772000
                    MOVE NAME:=USERSB(NAMELOC+(J*8)),(8);               02774000
                    IF NAME <> " " THEN  <<NOT NULL NAME>>              02776000
                    BEGIN                                               02778000
                        MOVE * :=NAME WHILE AN,1;                       02780000
                        IF J > 0 THEN                          <<00776>>02782000
                           MOVE * :=".",2                               02784000
                        ELSE                                            02786000
                           MOVE * :=",",2;                              02788000
                    END;                                                02790000
               END;                                                     02792000
               LEN:=TOS-@PBUF-1;                                        02794000
               PRINT(WPBUF,-LEN,0);                            <<03511>>02796000
               MOVE PBUF(1):=PBUF,(63);                                 02798000
          END;                                                          02800000
     END <<PRINTUSERS>>;                                                02802000
                                                                        02804000
     LOGICAL SUBROUTINE MAINPINMATCH;                                   02806000
     BEGIN                                                              02808000
          K:=0;                                                         02810000
          PIN:=JMATENT(MAINPIN).MAINPINF;                               02812000
          WHILE (K:=K+1) <= INFO DO                                     02814000
          IF INFO(K) = PIN THEN  <<PIN MATCH>>                          02816000
          BEGIN                                                         02818000
               MAINPINMATCH:=TRUE;                                      02820000
               MOVE INFO(K):=INFO(K+1),(INFO-K);                        02822000
               INFO:=INFO-1;                                            02824000
               K:=INFO;  <<STOP LOOP>>                                  02826000
          END;                                                          02828000
     END <<MAINPINMATCH>>;                                              02830000
                                                                        02832000
     PUSH(STATUS,Z);                                           <<01000>>02834000
     ORIG'ZREG := TOS; << SAVE Z IN CASE CALL ZSIZE >>         <<01000>>02836000
     TOS.(2:1):=0;  <<RESET USER TRAPS - AVOID ATTACHIO PROBLEMS>>      02838000
     SET(STATUS);                                                       02840000
                                                                        02842000
     IF NUMPARMS <> 0 THEN  <<SPECIFIC VS SPECIFIED>>                   02844000
     BEGIN                                                              02846000
          TOS := @VSNAME & LSR (1);                                     02848000
          GETVSDEFN (*,VSDEFN,I,J);                                     02850000
          IF <> THEN PEXIT(J);  <<DIRECTORY ERROR>>                     02852000
          MVTABX:=VSDEFN(VDMISC).MVTABXF;                               02854000
          LOWMVTABX:=HIGHMVTABX:=MVTABX;                                02856000
          MOVE VSID:=VSNAME,(24); <<FOR NOT-IN-USE MESSAGE>>            02858000
     END;                                                               02860000
     IF (MVTABX:=LOWMVTABX) <> 0 THEN                          <<01000>>02862000
     << NOT UNMOUNTED, SPECIFIC VS >>                          <<01000>>02864000
     WHILE MVTABX <= HIGHMVTABX DO                             <<01000>>02866000
     BEGIN                                                              02868000
          INFO:=0; UCNT:=-1;                                            02870000
          B := GETSIR (PVUSERSIR);                             <<00786>>02872000
          IF (K:=USERTABLE(3,0,MVTABX,INFO,INFOSIZE))<>0       <<01106>>02874000
              THEN BEGIN   << ERROR IN PVUSER TABLE >>         <<01197>>02876000
                       RELSIR (PVUSERSIR,B);                   <<01197>>02878000
                       PEXIT(K);                               <<01197>>02880000
                   END;                                        <<01197>>02882000
          IF INFO <> 0 THEN  <<SOMEONE USING THIS MVTABX>>              02884000
          BEGIN                                                         02886000
               K := 0;                                         <<00776>>02888000
               WHILE (K:=K+1) <= INFO DO                       <<00776>>02890000
               <<REMAP PIN TO PIN'S JSMP PIN>>                 <<00776>>02892000
                INFO (K) := GET'JSMPIN (INFO (K));             <<00776>>02894000
               JMATSIZE := 0; <<FORCE RE-INIT OF VARIABLES>>   <<00776>>02896000
               SCANJMAT:=TRUE;                                          02898000
               A:=GETSIR(JMATSIR);                                      02900000
               GETHEADERINFO;                                  <<01000>>02902000
               COMMENT: GET SPACE FOR USERS ARRAY AND          <<01000>>02904000
                  INITIALIZE USERS POINTERS.;                  <<01000>>02906000
               SPACENEEDED := USERSIZE-LASTUSERSIZE;           <<01000>>02908000
               IF NOT ENUF'STACKSPACE(SPACENEEDED) THEN        <<01000>>02910000
               BEGIN                                           <<01000>>02912000
                    RELSIR(JMATSIR,A);                         <<01000>>02914000
                    RELSIR (PVUSERSIR,B);                      <<00786>>02916000
                    PEXIT(STACKOVF);                           <<01000>>02918000
               END                                             <<01000>>02920000
               ELSE IF SPACENEEDED > 0 THEN                    <<01000>>02922000
               BEGIN                                           <<01000>>02924000
                    << GET SPACE >>                            <<01000>>02926000
                    TOS := SPACENEEDED;                        <<01000>>02928000
                    IF LASTUSERSIZE = 0 THEN                   <<01000>>02930000
                       BEGIN << INITIALIZE POINTERS >>         <<01000>>02932000
                       @USERS := @S0;                          <<01000>>02934000
                       @USERSB := @USERS & LSL(1);             <<01000>>02936000
                       END;                                    <<01000>>02938000
                    ASSEMBLE(ADDS 0);                          <<01000>>02940000
               END;                                            <<01000>>02942000
               LASTUSERSIZE := USERSIZE;                       <<01000>>02944000
               WHILE SCANJMAT DO                                        02946000
               BEGIN                                                    02948000
                    GETJMATENTRY;                                       02950000
                    IF JOBEXECUTING OR JOBSUSPENDED OR         <<01000>>02952000
                       JOBTERMINATING THEN                     <<01000>>02954000
                    IF MAINPINMATCH THEN <<FOUND VOLUME SET USER>>      02956000
                    BEGIN                                               02958000
                         NONEINUSE:=FALSE;  <<AT LEAST ONE USER>>       02960000
                         UCNT:=UCNT+1;                                  02962000
                         LOC:=UCNT*USIZE;                               02964000
                         USERS(LOC):=JMATENT(JOBINFO);                  02966000
                         MOVE USERS (LOC+1) :=                 <<00776>>02968000
                              JMATENT (JNAMELOC),(4),2;        <<00776>>02970000
                         MOVE * := JMATENT (UNAMELOC),(8);     <<00776>>02972000
                    END;                                                02974000
                    ENTADDR:=ENTADDR+JMATSIZE;                          02976000
                    SCANJMAT:=IF INFO = 0 OR (ENTADDR >= LASTADDR)      02978000
                              THEN FALSE ELSE TRUE;                     02980000
               END;                                                     02982000
               RELSIR(JMATSIR,A);                                       02984000
               GETMVTABENTRY(MVTABX,MVTABENT);                          02986000
               IF (MVDEV:=MVTABENT(2).(0:8)) <> 0 THEN                  02988000
               BEGIN                                                    02990000
                    DISCIO(MVDEV,R,VLAB,0D,30);                         02992000
                    IF = THEN                                           02994000
                    BEGIN                                               02996000
                         MOVE VSID:=VLABB(LVOLDIRLOC),(8),2;            02998000
                         MOVE   * :=VLABB(LVSGROUPLOC),(8),2;           03000000
                         MOVE   * :=VLABB(LVSACCNTLOC),(8);             03002000
                         PRINTHEAD;                                     03004000
                         PRINTUSERS;                                    03006000
                    END;                                                03008000
               END;                                                     03010000
          END;                                                          03012000
          RELSIR (PVUSERSIR,B);                                <<00786>>03014000
          MVTABX := MVTABX + 1;                                <<01000>>03016000
     END;                                                               03018000
     IF NONEINUSE THEN  <<PRINT NOT IN USE MESSAGES>>                   03020000
     BEGIN                                                              03022000
          IF NUMPARMS <> 0 THEN  <<SPECIFIC VOLUME SET>>                03024000
          BEGIN                                                         03026000
               FILLNAME;                                                03028000
               MOVE PBUF(NAMELEN):="NOT IN USE ",2;                     03030000
               LEN:=TOS-@PBUF;                                          03032000
          END ELSE                                                      03034000
          BEGIN                                                         03036000
               MOVE PBUF:=" NO VOLUME SETS IN USE ",2;                  03038000
               LEN:=TOS-@PBUF;                                          03040000
          END;                                                          03042000
          PRINT(WPBUF,-LEN,0);                                 <<03511>>03044000
     END;                                                               03046000
     PEXIT(OKEXIT);                                                     03048000
END <<VSUSERCOM>>;                                                      03050000
                                                                        03052000
                                                               <<01115>>03054000
$CONTROL SEGMENT=PVSYSM                                        <<01115>>03056000
   INTEGER PROCEDURE DISCTYPE(LDEV,LABL);                      <<01115>>03058000
                                                               <<01115>>03060000
                                                               <<01115>>03062000
      VALUE LDEV;                                              <<01115>>03064000
      INTEGER LDEV;                                            <<01115>>03066000
      ARRAY LABL;                                              <<01115>>03068000
                                                               <<01115>>03070000
      OPTION PRIVILEGED,UNCALLABLE;                            <<01115>>03072000
                                                               <<01115>>03074000
      BEGIN                                                    <<01115>>03076000
                                                               <<01115>>03078000
         COMMENT                                               <<01115>>03080000
                                                               <<01115>>03082000
            THIS PROCEDURE EXAMINES A DISC LABEL TO DETERMINE  <<01115>>03084000
            WHAT TYPE OF DISC IT BELONGS TO.  THE INPUT PARA-  <<01115>>03086000
            METER IS:                                          <<01115>>03088000
                                                               <<01115>>03090000
            LDEV       --    THE LDN ON WHICH THE DISC IS MOUNTED<<FDF>>03092000
                                                               <<01115>>03094000
                                                               <<01115>>03096000
            THE FUNCTION VALUE INDICATES DISC TYPE AS FOLLOWS: <<01115>>03098000
                                                               <<01115>>03100000
                0  =>  SYSTEM DISC                             <<01115>>03102000
                1  =>  PRIVATE VOLUME                          <<01115>>03104000
                2  =>  SERIAL DISC                             <<01115>>03106000
                3  =>  SCRATCH VOLUME                          <<01115>>03108000
                4  =>  FOREIGN VOLUME                          <<01115>>03110000
            ;                                                  <<01115>>03112000
                                                               <<01115>>03114000
                                                               <<01115>>03116000
                                                               <<01115>>03118000
         LOGICAL POINTER LPDT=8; <<LPDT>>                      <<01115>>03120000
                                                               <<01115>>03122000
         DEFINE   <<RETURNS>>                                  <<01115>>03124000
                                                               <<01115>>03126000
            SYSTEM  = BEGIN DISCTYPE:=0; RETURN END#,          <<01115>>03128000
            PRIVATE = BEGIN DISCTYPE:=1; RETURN END#,          <<01115>>03130000
            SERIAL  = BEGIN DISCTYPE:=2; RETURN END#,          <<01115>>03132000
            SCRATCH = BEGIN DISCTYPE:=3; RETURN END#,          <<01115>>03134000
            FOREIGN = BEGIN DISCTYPE:=4; RETURN END#;          <<01115>>03136000
                                                               <<01115>>03138000
         DEFINE LPDT'SUBTYPE=LPDT(LDEV&LSL(1)+1).(12:4)#,      <<01115>>03140000
                LABL'SUBTYPE=LABL(6).(12:4)#;                  <<01115>>03142000
                                                               <<01115>>03144000
         DEFINE LABL'TYPE=LABL(6).(6:6)#;                      <<01115>>03146000
                                                               <<01115>>03148000
         DEFINE VOL'NAME=BLABL(20)#;                           <<01115>>03150000
         BYTE POINTER BLABL;                                   <<01115>>03152000
         LOGICAL ERRINFO;                                      <<01115>>03154000
         INTEGER I, LPDT'S, LABL'S;                            <<01192>>03156000
         INTEGER LDT0,                                         <<01115>>03158000
                 LDT1,                                         <<01115>>03160000
                 LDT2,                                         <<01115>>03162000
                 LDT3,                                         <<01115>>03164000
                 LDT4;                                         <<01115>>03166000
         EQUATE LDTDST=14,                                     <<01115>>03168000
                LDTSIZE=5;                                     <<01115>>03170000
         DEFINE DEVTYPEF=(10:6)#;                              <<01115>>03172000
                                                               <<01115>>03174000
         LOGICAL SUBROUTINE LDT'TYPE;                          <<01115>>03176000
            BEGIN                                              <<01115>>03178000
                                                               <<01115>>03180000
               TOS:=@LDT0;                                     <<01115>>03182000
               TOS:=LDTDST;                                    <<01115>>03184000
               TOS:=LDEV*LDTSIZE;                              <<01115>>03186000
               TOS:=LDTSIZE;                                   <<01115>>03188000
               ASSEMBLE(MFDS 4); <<TYPE FROM LDT>>             <<01115>>03190000
                                                               <<01115>>03192000
               LDT'TYPE:=LDT2.DEVTYPEF;                        <<01115>>03194000
            END;                                               <<01115>>03196000
                                                               <<01115>>03198000
                                                               <<01115>>03200000
         LOGICAL SUBROUTINE NAME(PTR);                         <<01115>>03202000
            VALUE PTR; BYTE POINTER PTR;                       <<01115>>03204000
            BEGIN                                              <<01115>>03206000
               NAME:=TRUE;                                     <<01115>>03208000
               IF PTR=ALPHA THEN                               <<01115>>03210000
                  BEGIN                                        <<01115>>03212000
                     I:=1;                                     <<01115>>03214000
                     WHILE (I<=7) AND (PTR(I)=ALPHA OR         <<01115>>03216000
                                       PTR(I)=NUMERIC)         <<01115>>03218000
                        DO I:=I+1;                             <<01115>>03220000
                     WHILE (I<=7) DO                           <<01115>>03222000
                        BEGIN                                  <<01115>>03224000
                           IF PTR(I)<>" " THEN NAME:=FALSE;    <<01115>>03226000
                           I:=I+1;                             <<01115>>03228000
                        END;                                   <<01115>>03230000
                  END                                          <<01115>>03232000
                 ELSE NAME:=FALSE;                             <<01115>>03234000
            END;                                               <<01115>>03236000
                                                               <<01115>>03238000
                                                               <<01115>>03240000
         @BLABL:=@LABL&LSL(1);                                 <<01115>>03242000
                                                               <<01115>>03244000
         IF (LPDT'S:=LPDT'SUBTYPE)<>(LABL'S:=LABL'SUBTYPE) AND <<01192>>03246000
            (LPDT'S<>4 OR LABL'S<>10) AND                      <<01192>>03248000
            (LPDT'S<>10 OR LABL'S<>4) THEN FOREIGN;            <<01192>>03250000
         IF (LDT'TYPE<>LABL'TYPE) AND                          <<01444>>03252000
            (LABL'TYPE<>1 OR LDT'TYPE<>2) THEN FOREIGN;        <<01444>>03254000
         IF NOT NAME(VOL'NAME) THEN FOREIGN;                   <<01115>>03256000
         IF BLABL(16) = "3000" THEN SYSTEM;                    <<01115>>03258000
         IF LABL(6).(0:1)=1 THEN                               <<01192>>03260000
            IF (BLABL(16)="3001") OR                           <<01192>>03262000
               (LABL(8)=0) AND (LABL(9)=1)                     <<01192>>03264000
               THEN SCRATCH;                                   <<01192>>03266000
         IF LABL(8)<>0 OR LABL(9)<>0 THEN FOREIGN;             <<01115>>03268000
         IF LABL(6).(0:1) = 1 THEN SCRATCH;                    <<01115>>03270000
         IF LABL(6).(0:3) = 1 THEN                             <<01115>>03272000
            BEGIN                                              <<01115>>03274000
               IF VOL'NAME = "SERDISC" THEN SERIAL             <<01115>>03276000
                                       ELSE FOREIGN            <<01115>>03278000
            END;                                               <<01115>>03280000
         IF (LABL(6).(0:3) = 0 OR LABL(6).(0:3) = 2) AND       <<01115>>03282000
            NAME(BLABL(34)) AND                                <<01115>>03284000
            NAME(BLABL(42)) AND                                <<01115>>03286000
            NAME(BLABL(50))  THEN PRIVATE;                     <<01115>>03288000
         FOREIGN;                                              <<01115>>03290000
      END;                                                     <<01115>>03292000
$PAGE "PVSYS - UTILITY PROCEDURES"                                      03294000
                                                                        03296000
$CONTROL SEGMENT = PVSYSM                                               03298000
                                                                        03300000
INTEGER PROCEDURE PVRECIP(NTRY,LEVEL,INX,SIRS);                         03302000
VALUE LEVEL,INX,SIRS;                                                   03304000
INTEGER LEVEL,INX;                                                      03306000
DOUBLE SIRS;                                                            03308000
INTEGER ARRAY NTRY;                                                     03310000
OPTION PRIVILEGED,UNCALLABLE;                                           03312000
BEGIN                                                                   03314000
     << DB IS AT THE DIRECTORY DATA SEGMENT UPON ENTRY TO               03316000
        THIS PROCEDURE.                                                 03318000
     >>                                                                 03320000
     INTEGER DELTAQ = Q+0;                                              03322000
     ARRAY DDS(*) = DB+0;                                               03324000
     INTEGER ARRAY OWNARY(*) = Q+0;                                     03326000
                                                                        03328000
     EQUATE                                                             03330000
          DADIRTY     = %221,                                           03332000
          DEFNLEVEL   =    4,                                           03334000
          GROUPLEVEL  =    1;                                           03336000
                                                                        03338000
     DEFINE DIRTYF = (15:1)#;                                           03340000
                                                                        03342000
     INX:=INX-DELTAQ;                                                   03344000
     CASE * OWNARY(INX+0) OF                                            03346000
     BEGIN                                                              03348000
         BEGIN  <<0 - DEALLOCATE VSDEFN>>                               03350000
             IF NTRY (VDMISC).MVTABXF = 0 THEN SUDDENDEATH (419);       03352000
             NTRY (VDREFCNT) := NTRY (VDREFCNT)+OWNARY (INX+2);         03354000
             IF NTRY (X) <= 0 THEN                                      03356000
              IF < THEN SUDDENDEATH (419)                               03358000
              ELSE                                                      03360000
               NTRY (VDMISC).MVTABXF := OWNARY (INX+1);                 03362000
             NTRY (VDMISC).INITALLOCF := OWNARY (INX+3);                03364000
         END;                                                           03366000
         BEGIN  <<1 - ALLOCATE VSDEFN>>                                 03368000
             IF NTRY (VDMISC).MVTABXF <> 0 THEN                         03370000
              IF NTRY (VDMISC).MVTABXF <> OWNARY (INX+1) THEN           03372000
               SUDDENDEATH (419);                                       03374000
             NTRY (VDMISC).MVTABXF := OWNARY (INX+1);                   03376000
             NTRY (VDMISC).INITALLOCF := OWNARY (INX+3);                03378000
             NTRY (VDREFCNT):=NTRY (VDREFCNT)+OWNARY (INX+2);           03380000
         END;                                                           03382000
     END  <<CASE>>;                                                     03384000
     DDS(DADIRTY).DIRTYF:=1;                                            03386000
     PVRECIP:=%5;  <<SIRS NOT RELEASED, STOP SCAN>>                     03388000
END << PVRECIP >>;                                                      03390000
                                                                        03392000
$CONTROL SEGMENT = PVSYSM                                               03394000
PROCEDURE GETJITINFO(RTYPE,JINFO,UNAME,GNAME,ANAME);                    03396000
VALUE RTYPE;                                                            03398000
INTEGER RTYPE;                                                          03400000
LOGICAL JINFO;                                                          03402000
ARRAY UNAME,GNAME,ANAME;                                                03404000
OPTION PRIVILEGED,UNCALLABLE;                                           03406000
BEGIN                                                                   03408000
     LOGICAL POINTER PXPNTR;                                            03410000
     EQUATE  << JIT INFO >>                                             03412000
          JITSMP  = 10,                                                 03414000
          JITHAN  = 16,                                                 03416000
          JITLGN  = 24,                                                 03418000
          JITUN   = 28;                                                 03420000
     EQUATE                                                             03422000
          JITWORD  = 6;                                                 03424000
                                                                        03426000
     IF RTYPE = OPREQ THEN RETURN;  <<NO JIT>>                          03428000
     PUSH(DL);                                                          03430000
     @PXPNTR:=TOS-PS0(-1);                                              03432000
     TOS:=@JINFO;                                                       03434000
     TOS:=PXPNTR(JITWORD).(6:10);                                       03436000
     TOS:=JITSMP;  <<WORD LOC OF SESSION MAIN INFO>>                    03438000
     TOS:=1;  <<TRANSFER COUNT - WORDS>>                                03440000
     ASSEMBLE(MFDS 0);                                                  03442000
     S3:=@ANAME;                                                        03444000
     S1:=JITHAN;   <<WORD LOC OF ACCOUNT NAME>>                         03446000
     S0:= 4;  <<RESET TRANSFER COUNT>>                                  03448000
     ASSEMBLE(MFDS 0);                                                  03450000
     S3:=@GNAME;                                                        03452000
     S1:=JITLGN;   <<WORD LOC OF LOGON GROUP NAME>>                     03454000
     S0:=4;  <<RESET TRANSFER COUNT>>                                   03456000
     ASSEMBLE(MFDS 0);                                                  03458000
     S3:=@UNAME;                                                        03460000
     S1:=JITUN;    <<WORD LOC OF USER NAME>>                            03462000
     S0:=4;  <<RESET TRANSFER COUNT>>                                   03464000
     ASSEMBLE(MFDS 4);                                                  03466000
END <<GETJITINFO>>;                                                     03468000
$CONTROL SEGMENT = PVSYSD                                               03470000
PROCEDURE JITBIND(MVTABX,GFIPNTR);                                      03472000
VALUE MVTABX,GFIPNTR;                                                   03474000
INTEGER MVTABX,GFIPNTR;                                                 03476000
OPTION UNCALLABLE,PRIVILEGED;                                           03478000
BEGIN                                                                   03480000
     INTEGER JINFO;                                                     03482000
     LOGICAL POINTER PXPNTR;                                            03484000
     EQUATE  << JIT INFO >>                                             03486000
          JITGIP  = 33,                                                 03488000
          JITGFI  = 55,                                                 03490000
          JITGFI' = 57;                                                 03492000
     EQUATE                                                             03494000
          JITWORD =  6;                                                 03496000
     DEFINE                                                             03498000
         PVF = (0:1) #,  <<ASSIGNED TO NON-SYSTEM HVS FLAG>>   <<01105>>03500000
         MTF = (1:1) #;  <<HVS MOUNTED FLAG>>                  <<01105>>03502000
     PUSH(DL);                                                          03504000
     @PXPNTR:=TOS-PS0(-1);                                              03506000
     <<GET JITGIP>>                                                     03508000
     TOS:=@JINFO;                                                       03510000
     TOS:=PXPNTR(JITWORD).(6:10);                                       03512000
     TOS:=JITGIP;                                                       03514000
     TOS:=1;  <<TRANSFER COUNT>>                                        03516000
     ASSEMBLE(MFDS 4);                                                  03518000
     IF MVTABX <> 0 THEN <<PERFORMING A MOUNT?>>               <<01105>>03520000
     BEGIN                                                     <<01105>>03522000
         IF JINFO.PVF <> 1 THEN <<ASSIGNED DURING THIS LOGON>> <<01105>>03524000
          JINFO.PVF := 1; <<MARK IT ASSIGNED TO NON-SYS HVS>>  <<01105>>03526000
         JINFO.MTF := 1;  <<NOW MARK IT MOUNTED (AND BOUND)>>  <<01105>>03528000
     END ELSE                                                  <<01105>>03530000
         JINFO.MTF := 0;  <<MARK IT DISMOUNTED (AND UNBOUND)>> <<01105>>03532000
     <<PUT JITGIP>>                                                     03534000
     TOS:=PXPNTR(JITWORD).(6:10);                                       03536000
     TOS:=JITGIP;                                                       03538000
     TOS:=@JINFO;                                                       03540000
     TOS:=1;  <<TRANSFER COUNT>>                                        03542000
     ASSEMBLE(MTDS 4);                                                  03544000
     <<PUT ALTERNATE GFIPNTR>>                                          03546000
     TOS:=PXPNTR(JITWORD).(6:10);                                       03548000
     TOS:=JITGFI';  <<ALTERNATE GFIPNTR LOC>>                           03550000
     TOS:=@MVTABX;  <<MOVE MVTABX AND GFIPNTR INTO JITGFI'>>            03552000
     TOS:=2;  <<TRANSFER COUNT>>                                        03554000
     ASSEMBLE(MTDS 4);                                                  03556000
END << JITBIND >>;                                                      03558000
                                                                        03560000
$CONTROL SEGMENT = PVSYSD                                               03562000
PROCEDURE GETABENTRY(TABDST,INDEX,TABENT);                              03564000
VALUE TABDST,INDEX;                                                     03566000
INTEGER TABDST,INDEX;                                                   03568000
ARRAY TABENT;                                                           03570000
OPTION PRIVILEGED,UNCALLABLE;                                           03572000
BEGIN                                                                   03574000
     INTEGER ENTSIZE;                                                   03576000
                                                                        03578000
     <<GET TABLE ENTRY SIZE>>                                           03580000
     TOS:=@ENTSIZE;                                                     03582000
     TOS:=TABDST;                                                       03584000
     TOS:=0;                                                            03586000
     TOS:=1;                                                            03588000
     ASSEMBLE(MFDS 0);                                                  03590000
     ENTSIZE:=ENTSIZE.ENTSIZEF;                                         03592000
     <<GET TABLE ENTRY>>                                                03594000
     S3:=@TABENT;                                                       03596000
     S1:=ENTSIZE*INDEX;                                                 03598000
     S0:=ENTSIZE;                                                       03600000
     ASSEMBLE(MFDS 4);                                                  03602000
END << GETABENTRY >>;                                                   03604000
                                                                        03606000
$CONTROL SEGMENT = PVSYSD                                               03608000
PROCEDURE PUTABENTRY(TABDST,INDEX,TABENT);                              03610000
VALUE TABDST,INDEX;                                                     03612000
INTEGER TABDST,INDEX;                                                   03614000
ARRAY TABENT;                                                           03616000
OPTION PRIVILEGED,UNCALLABLE;                                           03618000
BEGIN                                                                   03620000
     INTEGER ENTSIZE;                                                   03622000
                                                                        03624000
     <<GET TABLE ENTRY SIZE>>                                           03626000
     TOS:=@ENTSIZE;                                                     03628000
     TOS:=TABDST;                                                       03630000
     TOS:=0;                                                            03632000
     TOS:=1;                                                            03634000
     ASSEMBLE(MFDS 4);                                                  03636000
     ENTSIZE:=ENTSIZE.ENTSIZEF;                                         03638000
     <<WRITE TABLE ENTRY>>                                              03640000
     TOS:=TABDST;                                                       03642000
     TOS:=ENTSIZE*INDEX;                                                03644000
     TOS:=@TABENT;                                                      03646000
     TOS:=ENTSIZE;                                                      03648000
     ASSEMBLE(MTDS 4);                                                  03650000
END << PUTABENTRY >>;                                                   03652000
                                                                        03654000
                                                                        03656000
$CONTROL SEGMENT = PVSYSD                                               03658000
PROCEDURE GETMVTABENTRY(MVTABX,MVTABENT);                               03660000
VALUE MVTABX;                                                           03662000
INTEGER MVTABX;                                                         03664000
ARRAY MVTABENT;                                                         03666000
OPTION PRIVILEGED,UNCALLABLE;                                           03668000
BEGIN                                                                   03670000
     INTEGER ENTSIZE;                                                   03672000
                                                                        03674000
     <<GET MVTAB ENTRY SIZE>>                                           03676000
     TOS:=@ENTSIZE;                                                     03678000
     TOS:=MVTABDST;                                                     03680000
     TOS:=0;                                                            03682000
     TOS:=1;                                                            03684000
     ASSEMBLE(MFDS 0);                                                  03686000
     ENTSIZE:=ENTSIZE.MVTENTSIZE;                                       03688000
     S3:=@MVTABENT;                                                     03690000
     S1:=MVTABX * ENTSIZE;                                              03692000
     S0:=ENTSIZE;                                                       03694000
     ASSEMBLE(MFDS 4);                                                  03696000
END << GETMVTABENTRY >>;                                                03698000
                                                                        03700000
$CONTROL SEGMENT = PVSYSD                                               03702000
PROCEDURE PUTMVTABENTRY(MVTABX,MVTABENT);                               03704000
VALUE MVTABX;                                                           03706000
INTEGER MVTABX;                                                         03708000
ARRAY MVTABENT;                                                         03710000
OPTION PRIVILEGED,UNCALLABLE;                                           03712000
BEGIN                                                                   03714000
     INTEGER ENTSIZE;                                                   03716000
                                                                        03718000
     <<GET MVTAB ENTRY SIZE>>                                           03720000
     TOS:=@ENTSIZE;                                                     03722000
     TOS:=MVTABDST;                                                     03724000
     TOS:=0;                                                            03726000
     TOS:=1;                                                            03728000
     ASSEMBLE(MFDS 4);                                                  03730000
     ENTSIZE:=ENTSIZE.MVTENTSIZE;                                       03732000
     TOS:=MVTABDST;                                                     03734000
     TOS:=MVTABX * ENTSIZE;                                             03736000
     TOS:=@MVTABENT;                                                    03738000
     TOS:=ENTSIZE;                                                      03740000
     ASSEMBLE(MTDS 4);                                                  03742000
END << PUTMVTABENTRY >>;                                                03744000
$PAGE                                                          <<03511>>03746000
$CONTROL SEGMENT = PVSYSD                                      <<03547>>03750000
PROCEDURE GET'OR'REL'PACK (LDEV,FUNC);                         <<03547>>03752000
   VALUE LDEV,FUNC;                                            <<03547>>03754000
   INTEGER LDEV,FUNC;                                          <<03547>>03756000
   OPTION INTERNAL;                                            <<03547>>03758000
                                                               <<03547>>03760000
                                                               <<03547>>03762000
BEGIN                                                          <<03547>>03764000
                                                               <<03547>>03766000
COMMENT                                                        <<03547>>03768000
  Will lock or unlock a Command Set '80 (device type=3) drive, <<03547>>03770000
depending on the value of FUNC.  At this time, the only CS'80  <<03547>>03772000
drive available for PV operations is the HP7933.               <<04278>>03774000
                                                               <<03547>>03776000
  PARMS:                                                       <<03547>>03778000
      FUNC = lock - if MVTABLE finds MVTAB = 1 (first time     <<03547>>03780000
                    accessing this ldev).                      <<03547>>03782000
            unlock- if MVTABLE finds MVTAB = 0 (last time      <<03547>>03784000
                    accessing this ldev).                      <<03547>>03786000
                                                               <<03547>>03788000
  RETURNS:                                                     <<03547>>03790000
      CCE - all O.K.                                           <<03547>>03792000
      CCL - Attachio error trying to lock/unlock ldev.         <<03547>>03794000
                                                               <<03547>>03796000
                                                               <<03547>>03798000
DB MUST BE AT STACK !!!!!!!!                                   <<03547>>03800000
                                                               <<03547>>03802000
                                                               <<03547>>03804000
;                                                              <<03547>>03806000
                                                               <<03547>>03808000
                                                               <<03547>>03810000
DEFINE                                                         <<03547>>03812000
   CS'80  =  (TYPE = 3)#;                                      <<03547>>03814000
                                                               <<03547>>03816000
INTEGER                                                        <<03547>>03818000
   LEN,            << Length of message buffer >>              <<03547>>03820000
   TYPE,           << Device type              >>              <<03547>>03822000
   STYPE;          << Device sub-type          >>              <<03547>>03824000
                                                               <<03547>>03826000
CC := CCE;                                                     <<03547>>03828000
                                                               <<03547>>03830000
TYPE := LDEVTOTYPE (LDEV);                                     <<03547>>03832000
IF NOT CS'80 THEN RETURN;     << Only works for cs'80 drives >><<03547>>03834000
                                                               <<03547>>03836000
STYPE := LDEVTOSUBTYPE(LDEV);                                  <<03547>>03838000
IF NOT D7933 THEN RETURN;     << Only 7933 for PV operations >><<04278>>03840000
                                                               <<03547>>03842000
                                                               <<03547>>03844000
TOS := ATTACHIO(LDEV,0,0,0,FUNC,0,0,0,BLOCKEDIO);              <<03547>>03846000
DEL;                                                           <<03547>>03848000
IF S0.(8:8) <> 1 THEN CC := CCL;                               <<03547>>03850000
                                                               <<03547>>03852000
END;        << GET'OR'REL'PACK >>                              <<03547>>03854000
                                                                        03856000
$PAGE "PVSYS - MOUNTED VOLUME TABLE (MVTAB) HANDLER"                    03858000
                                                                        03860000
$CONTROL SEGMENT = PVSYSD                                               03862000
PROCEDURE MVTABLE(FUNCT,MVTABX,DEVLIST,VMASK,USECOUNT);                 03864000
VALUE FUNCT,VMASK;                                                      03866000
      << IF THE FUNCT=PRESERVE (2) THEN ALL WE ARE DOING IS >> <<01500>>03868000
      << SAVING THE ENTRY BY INCREASING THE USER COUNT AND  >> <<01500>>03870000
      << VOL COUNT SO THAT ANOTHER DISMOUNT WILL NOT REMOVE >> <<01500>>03872000
INTEGER FUNCT,MVTABX,USECOUNT;                                          03874000
LOGICAL VMASK;                                                          03876000
ARRAY DEVLIST;                                                          03878000
OPTION VARIABLE;                                                        03880000
OPTION PRIVILEGED,UNCALLABLE;                                           03882000
BEGIN                                                                   03884000
     LOGICAL PMAP = Q-4;                                                03886000
     LOGICAL dfs'status;                                       <<03504>>03888000
     INTEGER V,HVOL,NVOL,ENTNUM,ENTSIZE;                                03890000
     LOGICAL A,B,D,CMASK:=0;                                            03892000
     ARRAY MVTABENT(0:MVTABENTSIZE);                                    03894000
     DOUBLE ARRAY MVTABENTD(*) = MVTABENT(5);                           03896000
     ARRAY VLAB(0:127);                                                 03898000
     ARRAY VTABENT(*) = VLAB;  <<DOUBLE USE OF VLAB AREA>>              03900000
     EQUATE                                                             03902000
          ON       = 2,                                                 03904000
          OFF      = 0,                                                 03906000
          MOUNTCNT = 1;                                                 03908000
                                                                        03910000
     SUBROUTINE LEAVE;                                                  03912000
     BEGIN                                                              03914000
          RELSIR(VTABSIR,A);                                            03916000
          ASSEMBLE(EXIT 6);                                             03918000
     END <<LEAVE>>;                                                     03920000
                                                                        03922000
     SUBROUTINE UPDATEVTAB(VX,MX,VOLX);                                 03924000
     VALUE VX,MX,VOLX;                                                  03926000
     INTEGER VX,MX,VOLX;                                                03928000
     BEGIN                                                              03930000
          GETABENTRY(VTABDST,VX,VTABENT);                               03932000
          VTABENT(13).(4:4):=VOLX;  <<LOCAL VOL. INDEX>>                03934000
          VTABENT(13).(8:8):=MX;    <<MVTAB INDEX     >>                03936000
          PUTABENTRY(VTABDST,VX,VTABENT);                               03938000
     END <<UPDATEVTAB>>;                                                03940000
                                                                        03942000
     INTEGER SUBROUTINE GETMVTABX;                                      03944000
     BEGIN                                                              03946000
          V:=0;                                                         03948000
          D:=EXCHANGEDB(MVTABDST);                                      03950000
          ENTSIZE:=MVTAB.(0:8);                                         03952000
          ENTNUM:=MVTAB.(8:8);                                          03954000
          WHILE (V:=V+1) <= ENTNUM DO  <<RUN THRU TABLE>>               03956000
          IF NOT MVTAB(V*ENTSIZE).INUSE THEN                            03958000
          BEGIN                                                         03960000
               MVTAB(X):=MVTAB(MOUNTCNT)+1;                             03962000
               MVTAB(V*ENTSIZE).INUSE:=TRUE;                            03964000
               GETMVTABX:=V;                                            03966000
               V:=ENTNUM;  <<STOP LOOP>>                                03968000
          END;                                                          03970000
          EXCHANGEDB(D);                                                03972000
     END <<GETMVTABX>>;                                                 03974000
                                                                        03976000
     SUBROUTINE DELMVTABENT(INDEX);                                     03978000
     VALUE INDEX; INTEGER INDEX;                                        03980000
     BEGIN                                                              03982000
          <<DECREMENT NUMBER OF MOUNTED VOLUME SETS>>                   03984000
          GETMVTABENTRY(0,MVTABENT);                                    03986000
          MVTABENT(X):=MVTABENT(MOUNTCNT)-1;                            03988000
          PUTMVTABENTRY(0,MVTABENT);                                    03990000
          <<ZERO ENTRY TO DELETE IT FROM MVTAB>>                        03992000
          MVTABENT:=0; MOVE MVTABENT(1):=MVTABENT,(MVTABENTSIZE-1);     03994000
          PUTMVTABENTRY(INDEX,MVTABENT);                                03996000
     END <<DELMVTABENT>>;                                               03998000
                                                                        04000000
     SUBROUTINE ADDVOLENTRY;                                            04002000
     BEGIN                                                              04004000
          <<I MUST CONTAIN A VOLUME INDEX INTO MVTABENT>>               04006000
                                                                        04008000
          TOS:=DEVLIST(V+2).(0:8) + DEVLIST(V+2)&LSL(8);                04010000
          IF <> THEN  <<VALID MEMBER OF SET>>                           04012000
          BEGIN                                                         04014000
               CMASK:=CMASK LOR (1 & LSL(V));                           04016000
               NVOL:=NVOL+1;                                            04018000
               IF V > HVOL THEN HVOL:=V;                                04020000
               UPDATEVTAB(DEVLIST(V+2).(0:8),MVTABX,V+1);               04022000
               TOS:=1;  <<VOLUME-USE COUNT>>                            04024000
                                                               <<03504>>04026000
               << Allocate disc free space data segment >>     <<03504>>04028000
               << for this ldev.                        >>     <<03504>>04030000
                                                               <<03504>>04032000
               dfs'status := Allocate'Dfs'Data'Seg             <<03504>>04034000
                                (devlist(v+2).(8:8));          <<03504>>04036000
                                                               <<03504>>04038000
               IF NOT dfs'status THEN                          <<03504>>04040000
                  Send'Process'Dfs'Error (devlist(v+2).(8:8),  <<03504>>04042000
                                     dfs'status, 1);           <<03504>>04044000
                                                               <<03504>>04046000
          END ELSE                                                      04048000
          TOS:=0;  <<NULL VOLUME-USE COUNT>>                            04050000
          MVTABENTD(V):=TOS;                                            04052000
     END <<ADDVOLENTRY>>;                                               04054000
                                                                        04056000
     SUBROUTINE DELVOLENTRY(FIXUP);                                     04058000
     VALUE FIXUP; LOGICAL FIXUP;                                        04060000
     BEGIN                                                              04062000
          <<I MUST CONTAIN A VOLUME INDEX INTO MVTABENT>>               04064000
                                                                        04066000
          IF MVTABENTD(V) <> 0D THEN                                    04068000
          BEGIN                                                         04070000
               CMASK:=CMASK LOR (1 & LSL(V));                           04072000
               IF FIXUP THEN  <<NOT DELETING ENTIRE MVTAB ENT>>         04074000
               BEGIN                                                    04076000
                    NVOL:=NVOL-1;                                       04078000
                    IF V = HVOL THEN  <<FIND NEW HVOL>>                 04080000
                    WHILE MVTABENTD(HVOL) = 0D DO HVOL:=HVOL-1;         04082000
               END;                                                     04084000
               UPDATEVTAB(MVTABENT((V&LSL(1))+5).(8:8),0,0);            04086000
                                                               <<03504>>04088000
          << Deallocate disc free space data segment for >>    <<03504>>04090000
          << this ldev, as there are no more users.      >>    <<03504>>04092000
                                                               <<03504>>04094000
          TOS := 0;   << Leave room for return value >>        <<03504>>04096000
          TOS := mvtabentd (v);   << Extract ldev >>           <<03504>>04098000
          DEL;                                                 <<03504>>04100000
          TOS := TOS.(0:8);                                    <<03504>>04102000
          TOS := Deallocate'Dfs'Data'Seg (*);                  <<03504>>04104000
          dfs'status := TOS;                                   <<03504>>04106000
                                                               <<03504>>04108000
          IF NOT dfs'status THEN                               <<03504>>04110000
             BEGIN  << Deallocation error >>                   <<03504>>04112000
                                                               <<03504>>04114000
                TOS := mvtabentd (v);   << Extract ldev >>     <<03504>>04116000
                DEL;                                           <<03504>>04118000
                TOS := TOS.(0:8);                              <<03504>>04120000
                TOS := dfs'status;      << second parm >>      <<03504>>04122000
                TOS := 2;               << type parm   >>      <<03504>>04124000
                Send'Process'Dfs'Error (*, *, *);              <<03504>>04126000
                                                               <<03504>>04128000
             END;   << Deallocation error >>                   <<03504>>04130000
                                                               <<03504>>04132000
          END;                                                          04134000
          MVTABENTD(V):=0D;  <<NULL VOLUME ENTRY>>                      04136000
     END <<DELVOLENTRY>>;                                               04138000
                                                                        04140000
     SUBROUTINE BUILDMVTABENT;                                          04142000
     BEGIN                                                              04144000
          HVOL:=NVOL:=0;                                                04146000
          MVTABENT:=%100000;  <<IN-USE,DISMOUNT/DOWN FIELDS = 0>>       04148000
          MVTABENT(1):=1;  <<USE COUNT>>                                04150000
          MVTABENT(2):=0 CAT DEVLIST(2)(0:8:8);  <<MV LDEV>>            04152000
          GET'OR'REL'PACK (DEVLIST(2).(8:8),LOCK);             <<03584>>04154000
          IF <> THEN LEAVE;                                    <<03584>>04156000
                                                               <<03584>>04158000
          DISCIO(DEVLIST(2).(8:8),R,VLAB,0D,128);  <<MV LABEL>>         04160000
          IF <> THEN                                                    04162000
          BEGIN                                                         04164000
               CC:=CCL;                                                 04166000
               LEAVE;                                                   04168000
          END;                                                          04170000
          MVTABENT(3):=VLAB(LDIRBASE);                                  04172000
          MVTABENT(4):=VLAB(LGENINDEX);                                 04174000
          FOR V:=0 UNTIL (MAXVOLNUM-1) DO ADDVOLENTRY;                  04176000
          MVTABENT(1).HVOLF:=HVOL;  <<HIGHEST VOL. NUM MOUNTED>>        04178000
          MVTABENT(1).NVOLF:=NVOL;  <<NUMBER OF VOLUMES MOUNTED>>       04180000
      <<  Keep SYSACCTINDEX for Private Volume directory in >> <<DE>>   04182000
      <<  first entry of Mounted Volume Table --> word 0,   >> <<DE>>   04184000
      <<  bits 0 thru 8.                                    >> <<DE>>   04186000
          TOS := 0D;             << store for calculations >>  <<DE>>   04188000
          TOS := VLAB (LDIRSIZE);     << Number of sectors >>  <<DE>>   04190000
          MVTABENT(6) := TOS & DCSR(4); << # of 16 bit wds >>  <<DE>>   04192000
          IF TOS <> 0 THEN MVTABENT(6):=MVTABENT(6)+1;         <<DE>>   04194000
          MVTABENT(6) := MVTABENT(6) + 3;                      <<DE>>   04196000
          TOS := MVTABENT(6);                                  <<DE>>   04198000
          MVTABENT(6) := TOS & DCSR(7); << #bitmap sectors >>  <<DE>>   04200000
          IF TOS <> 0 THEN MVTABENT(6):=MVTABENT(6)+1;         <<DE>>   04202000
          IF MVTABENT(6)<3 THEN MVTABENT(6):=3;                <<DE>>   04204000
          MVTABENT(6) := MVTABENT(6) & LSL(8); <<SYSACCTINDEX>><<DE>>   04206000
          MVTABENT(6).(8:8) := 1;  << Volume use count = 1. >>          04208000
     END <<BUILDMVTABENT>>;                                             04210000
                                                                        04212000
     SUBROUTINE FIXVOLINFO;                                             04214000
     BEGIN                                                              04216000
          V:=0;  <<VOLUME POINTER INTO MVTAB ENTRY>>                    04218000
          HVOL:=MVTABENT(1).HVOLF;                                      04220000
          NVOL:=MVTABENT(1).NVOLF;                                      04222000
          WHILE VMASK <> 0 DO                                           04224000
          BEGIN                                                         04226000
               IF VMASK THEN  <<A VOLUME TO PROCESS>>                   04228000
               BEGIN                                                    04230000
                    IF FUNCT = ADD OR FUNCT = PRESERVE THEN             04232000
                    BEGIN                                               04234000
                         IF MVTABENTD(V) = 0D THEN ADDVOLENTRY ELSE     04236000
                         BEGIN                                          04238000
                              <<BUMP VOL USE COUNT>>                    04240000
                              TOS:=MVTABENTD(V);                        04242000
                              TOS:=TOS+1;  <<BUMP VOL USE COUNT>>       04244000
                              IF S0.USECNT = 1  THEN           <<03511>>04246000
                              BEGIN                            <<03511>>04248000
                                GET'OR'REL'PACK(S1.LDEVF,LOCK);<<03511>>04250000
                                IF <> THEN LEAVE;              <<03511>>04252000
                              END;                             <<03511>>04254000
                                                               <<03511>>04256000
                              MVTABENTD(V):=TOS;                        04258000
                         END;                                           04260000
                    END ELSE                                            04262000
                    BEGIN                                               04264000
                         IF MVTABENTD(V) <> 0D THEN <<FIX ENT>>         04266000
                         BEGIN                                          04268000
                              TOS:=MVTABENTD(V);                        04270000
                              TOS:=TOS-1;  <<DECR USE COUNT>>           04272000
                              IF S0.USECNT = 0 THEN                     04274000
                              BEGIN                                     04276000
                              GET'OR'REL'PACK(S1.LDEVF,UNLOCK);<<03511>>04278000
                              IF <> THEN LEAVE;                <<03511>>04280000
                                                               <<03511>>04282000
                                   DELVOLENTRY(TRUE);                   04284000
                                   ASSEMBLE(DDEL);                      04286000
                              END ELSE                                  04288000
                              MVTABENTD(V):=TOS;                        04290000
                         END;                                           04292000
                    END;                                                04294000
               END;                                                     04296000
               V:=V+1;                                                  04298000
               VMASK:=VMASK & LSR(1);                                   04300000
          END;                                                          04302000
          MVTABENT(1).HVOLF:=HVOL;                                      04304000
          MVTABENT(1).NVOLF:=NVOL;                                      04306000
     END <<FIXVOLINFO>>;                                                04308000
                                                                        04310000
$IF X0=ON                                                               04312000
     MMSTAT (-200,FUNCT,MVTABX,DELTAP);                        <<MONIT>>04314000
$IF                                                                     04316000
     CC:=CCE;                                                           04318000
     A:=GETSIR(VTABSIR);                                                04320000
     IF FUNCT = ADD OR FUNCT = PRESERVE THEN  <<ADD OR BUMP USE COUNT>> 04322000
     BEGIN                                                              04324000
          IF MVTABX > 0 THEN  <<LOGICAL MOUNT>>                         04326000
          BEGIN                                                         04328000
               GETMVTABENTRY(MVTABX,MVTABENT);                          04330000
               IF NOT MVTABENT.INUSE THEN                               04332000
               BEGIN                                                    04334000
                    CC:=CCG;                                            04336000
                    LEAVE;                                              04338000
               END;                                                     04340000
               IF FUNCT = PRESERVE THEN                                 04342000
                MVTABENT(1).USECNT:=MVTABENT(1).USECNT+1;               04344000
                IF MVTABENT(1).USECNT = 1 THEN                 <<03584>>04346000
                BEGIN                                          <<03584>>04348000
                   GET'OR'REL'PACK(MVTABENT(2).LDEVF,LOCK);    <<03584>>04350000
                   IF <> THEN LEAVE;                           <<03584>>04352000
                END;                                           <<03584>>04354000
                                                               <<03584>>04356000
               FIXVOLINFO;                                              04358000
          END ELSE                                                      04360000
          BEGIN                                                         04362000
               IF (MVTABX :=                                            04364000
                IF MVTABX < 0 THEN -MVTABX ELSE GETMVTABX) = 0 THEN     04366000
                BEGIN                                                   04368000
                     CC:=CCL;                                           04370000
                     LEAVE;                                             04372000
                END;                                                    04374000
               BUILDMVTABENT;                                           04376000
          END;                                                          04378000
          PUTMVTABENTRY(MVTABX,MVTABENT);                               04380000
     END ELSE  <<REMOVE OR DECREMENT USE COUNT>>                        04382000
     BEGIN                                                              04384000
          GETMVTABENTRY(MVTABX,MVTABENT);                               04386000
          IF NOT MVTABENT.INUSE THEN                                    04388000
          BEGIN                                                         04390000
               CC:=CCG;                                                 04392000
               LEAVE;                                                   04394000
          END;                                                          04396000
          MVTABENT(1).USECNT:=MVTABENT(1).USECNT-1;                     04398000
          IF MVTABENT(1).USECNT = 0 THEN  <<NO MORE USERS>>             04400000
          BEGIN                                                         04402000
               FOR V:=0 UNTIL (MAXVOLNUM-1) DO DELVOLENTRY(FALSE);      04404000
               GET'OR'REL'PACK(MVTABENT(2).LDEVF,UNLOCK);      <<03584>>04406000
               IF <> THEN LEAVE;                               <<03584>>04408000
                                                               <<03584>>04410000
               DELMVTABENT(MVTABX);                                     04412000
          END ELSE                                                      04414000
          BEGIN                                                         04416000
               FIXVOLINFO;                                              04418000
               PUTMVTABENTRY(MVTABX,MVTABENT);                          04420000
          END;                                                          04422000
     END;                                                               04424000
     IF PMAP THEN USECOUNT:=MVTABENT(1).USECNT CAT                      04426000
                            CMASK(0:8:8);                               04428000
     LEAVE;                                                             04430000
END << MVTABLE >>;                                                      04432000
                                                                        04434000
$PAGE "PVSYS - USER TABLE (PVUSER) HANDLER"                             04436000
                                                                        04438000
$CONTROL SEGMENT = PVSYSD                                               04440000
INTEGER PROCEDURE USERTABLE(FUNCT,PININFO,MVTABX,RETINFO,RETSIZE);      04442000
VALUE FUNCT,PININFO,MVTABX,RETSIZE;                                     04444000
INTEGER FUNCT,PININFO,MVTABX,RETSIZE;                                   04446000
ARRAY RETINFO;                                                          04448000
OPTION VARIABLE;                                                        04450000
OPTION PRIVILEGED,UNCALLABLE;                                           04452000
BEGIN                                                                   04454000
                                                                        04456000
     << A USER ENTRY IN THE USER HAS THE FOLLOWING FORMAT               04458000
        [PINENT REFERS TO ONE OF THE USER ENTRIES WHICH                 04460000
         BEGIN AT PVUENT(PVEHDSIZE)]:                                   04462000
                                                                        04464000
        PINENT (0).( 0:8)  - VOLUME MEMBER MASK                         04466000
                  .( 8:8)  - USER SESSION-MAIN PIN.                     04468000
        PINENT (1)         - USER BIND COUNT                   < RVPV > 04470000
        PINENT (2)         - USER MOUNT COUNT.                 < RVPV > 04472000
        PINENT (3)         - SYSTEM BIND COUNT                 < RVPV > 04474000
        PINENT (4)         - SYSTEM MOUNT COUNT.               < RVPV > 04476000
        PINENT (5)         - BIND NAME COUNT                   < RVPV > 04478000
        PINENT (6)         - DST OF BIND NAME SEGMENT.         < RVPV > 04480000
     >>                                                                 04482000
                                                               <<01197>>04484000
 <<---------------------------------------------------------->><<01197>>04486000
 << USERTABLE ENTRY HEADERS FOR EACH MOUNTED VOLUME CURRENT->> <<01197>>04488000
 <<LY USE THE LAST WORD (BIT 15) TO RECORD OPERATOR LOGICAL  >><<01197>>04490000
 <<MOUNTS (BIT ON) AND DISMOUNTS (BIT ZERO).  THIS SHOULD BE >><<01197>>04492000
 <<CHANGED TO INCLUDE A USER SUB-ENTRY AS ANY OTHER USER TO  >><<01197>>04494000
 <<THE TABLE FOR EACH OPERATOR MOUNT BY PROCESS PIN NUMBER.  >><<01197>>04496000
 <<---------------------------------------------------------->><<01197>>04498000
                                                               <<01197>>04500000
     LOGICAL PMAP = Q-4;  <<OPTIONAL PRAMETERS MAP>>                    04502000
     DOUBLE NAMEINFOQ;                                                  04504000
     INTEGER UC,UB,SC,SB;  <<MOUNT AND BIND INCREMENTS>>                04506000
     INTEGER I,J,CNT,DST,PIN,INCR,SIZE,ESIZE,INDEX,PINLOC,PVCOUNT,      04508000
             MAXCOUNT,ACTUSERS,MAXUSERS;                                04510000
     LOGICAL A,MASK,UMASK,                                              04512000
             NAMEINFOQ1 = NAMEINFOQ,                                    04514000
             NAMEINFOQ2 = NAMEINFOQ1+1;                                 04516000
     INTEGER ARRAY PVUSER(*) = DB+0;                                    04518000
     INTEGER POINTER PVUENT;                                            04520000
     EQUATE BYEMASK = %17;                                              04522000
     EQUATE                                                             04524000
          ADDPIN    = 0,                                                04526000
          DELPIN    = 1;                                                04528000
     DEFINE                                                             04530000
          PINF    = (8: 8)#,                                            04532000
          VMASKF  = (0: 8)#;                                            04534000
     DEFINE                                                             04536000
          PVMASK  = LOGICAL(PVUMASK)#,                                  04538000
          OPMOUNT = (PVEOPMASK <> 0)#;                                  04540000
     DEFINE                                                             04542000
          USERBIND = PVUENT (PINLOC+1) #,                               04544000
          USERCOUNT = PVUENT (PINLOC+2) #,                              04546000
          SYSTEMBIND = PVUENT (PINLOC+3) #,                             04548000
          SYSTEMCOUNT = PVUENT (PINLOC+4) #,                            04550000
          NAMEINFO    = PVUENT (PINLOC+5) #,                            04552000
          NAMEINFO1   = PVUENT (PINLOC+5) #,                            04554000
          NAMEINFO2   = PVUENT (PINLOC+6) #;                            04556000
                                                                        04558000
     SUBROUTINE PEXIT (EXITTYPE);                              <<01106>>04560000
     VALUE EXITTYPE;  INTEGER EXITTYPE;                        <<01106>>04562000
     BEGIN                                                     <<01106>>04564000
          IF (EXITTYPE<>OKEXIT) AND (CC=CCE) THEN CC:=CCL;     <<01106>>04566000
          USERTABLE := EXITTYPE;                               <<01106>>04568000
          IF DST >= 0 THEN EXCHANGEDB(DST); <<RESET STACK>>    <<01106>>04570000
          RELSIR(PVUSERSIR,A);                                 <<01106>>04572000
          ASSEMBLE (EXIT 6);                                   <<01197>>04574000
     END <<PEXIT>>;                                            <<01106>>04576000
     SUBROUTINE EXPANDPVUTAB;                                  <<01106>>04578000
     BEGIN << EXPAND SEGMENT LENGTH >>                         <<01106>>04580000
          IF (PVUSIZE + PVSEGLN'INCR) >=                       <<01106>>04582000
              MAXPVSEGLN'INIT THEN PEXIT (NOROOM);             <<01106>>04584000
          I := ALTDSEGSIZE(PVUSERDST,PVSEGLN'INCR);            <<01106>>04586000
          IF <> THEN                                           <<01106>>04588000
              BEGIN << EXPANSION FAILURE >>                    <<01106>>04590000
              TOS := IF CCG THEN NOROOM ELSE PVSEGERR;         <<01106>>04592000
              PEXIT(*);                                        <<01106>>04594000
              END;                                             <<01106>>04596000
          PVUSER (PVUSIZE) := 0;                               <<01106>>04598000
          MOVE PVUSER (PVUSIZE+1) := PVUSER (PVUSIZE),         <<01106>>04600000
               ((I-PVUSIZE)-1);                                <<01106>>04602000
          PVUSIZE := I;  << NEW SEGMENT LENGTH >>              <<01106>>04604000
     END << EXPANDPVUTAB >>;                                   <<01106>>04606000
                                                                        04608000
     LOGICAL SUBROUTINE CHECKPIN;                                       04610000
     BEGIN                                                              04612000
          PINLOC:=-1;  <<ASSUME OP PIN>>                                04614000
          PVCOUNT:=PVUCOUNT;                                            04616000
          @PVUENT:=PVUHDSIZE;                                           04618000
          I:=0;                                                         04620000
          WHILE (I:=I+1) <= PVCOUNT DO                                  04622000
          IF PVEMVTABX = MVTABX THEN                                    04624000
          BEGIN                                                         04626000
               IF PIN <> 0 THEN                                         04628000
               BEGIN                                                    04630000
                    MAXCOUNT:=PVEMAXCOUNT;                              04632000
                    J:=-1;                                              04634000
                    WHILE (J:=J+1) < MAXCOUNT DO                        04636000
                    BEGIN                                               04638000
                         IF PVUENT((J*PVENTSIZE)+PVEHDSIZE).PINF=PIN    04640000
                         THEN                                           04642000
                         BEGIN                                          04644000
                              CHECKPIN:=TRUE;                           04646000
                              PINLOC:=(J*PVENTSIZE)+PVEHDSIZE;          04648000
                              J:=MAXCOUNT;  <<STOP LOOP>>               04650000
                         END;                                           04652000
                    END;                                                04654000
               END ELSE                                                 04656000
               IF OPMOUNT THEN                                          04658000
               BEGIN                                                    04660000
                    CHECKPIN:=TRUE;                                     04662000
                    PVEOPMOUNT:=1;  << LOGICAL MOUNT >>        <<01197>>04664000
                    PINLOC:=0;  <<MARK AS OP ENTRY>>                    04666000
               END;                                                     04668000
               I:=PVCOUNT;  <<STOP LOOP>>                               04670000
          END ELSE                                                      04672000
          @PVUENT:=@PVUENT+PVESIZE;                                     04674000
     END <<CHECKPIN>>;                                                  04676000
                                                                        04678000
     SUBROUTINE ADDENTRY;                                               04680000
     BEGIN                                                              04682000
          INCR := PVEDEFSIZE;                                  <<01106>>04684000
          IF (PVUSIZE-PVUAVAIL) <= PVEDEFSIZE                  <<01106>>04686000
              THEN EXPANDPVUTAB;                               <<01106>>04688000
          @PVUENT:=PVUAVAIL;                                            04690000
          PVUENT:=0; MOVE PVUENT(1):=PVUENT,(INCR-1);                   04692000
          PVUENT:=MVTABX;                                               04694000
          PVEMAXCOUNT := (INCR-PVEHDSIZE)/PVENTSIZE;                    04696000
          PVESIZE:=INCR;                                                04698000
          <<UPDATE GLOBAL TABLE INFORMATION>>                           04700000
          PVUCOUNT:=PVUCOUNT+1;                                         04702000
          PVUAVAIL:=PVUAVAIL+INCR;                                      04704000
          TOS:=PVMASK LOR (1 & LSL(MVTABX));                            04706000
          PVUMASK:=TOS;                                                 04708000
     END  <<ADDENTRY>>;                                                 04710000
                                                                        04712000
     SUBROUTINE DELENTRY;                                               04714000
     BEGIN                                                              04716000
          ESIZE:=PVESIZE;  <<SIZE OF ENTRY TO BE DELETED>>              04718000
          SIZE:=PVUAVAIL-@PVUENT(ESIZE);                                04720000
          <<COMPACT USER TABLE>>                                        04722000
          MOVE PVUENT:=PVUENT(ESIZE),(SIZE);                            04724000
          <<ZERO RESIDUE AFTER COMPACTION>>                             04726000
          PVUENT(SIZE):=0;                                              04728000
          MOVE PVUENT(SIZE+1):=PVUENT(SIZE),(ESIZE-1);                  04730000
          <<UPDATE GLOBAL TABLE INFORMATION>>                           04732000
          PVUCOUNT:=PVUCOUNT-1;                                         04734000
          PVUAVAIL:=PVUAVAIL-ESIZE;                                     04736000
          TOS:=PVMASK LAND NOT (1 & LSL(MVTABX));                       04738000
          PVUMASK:=TOS;                                                 04740000
     END <<DELENTRY>>;                                                  04742000
                                                                        04744000
     SUBROUTINE ADDUSER(MX);                                            04746000
     VALUE MX; INTEGER MX;                                              04748000
     BEGIN                                                              04750000
          IF MX = 0 THEN ADDENTRY;  <<CREATE NEW PVUSER ENTRY>>         04752000
          IF PIN = 0 THEN  <<OPERATOR MOUNT REQUEST>>                   04754000
          BEGIN                                                         04756000
               PVEOPMASK:=PININFO.VMASKF;                               04758000
               PVEOPMOUNT:=1;  << LOGICAL MOUNT >>             <<01197>>04760000
               RETURN;                                                  04762000
          END;                                                          04764000
          IF CHECKPIN THEN  <<PIN ALREADY USING MVTABX>>                04766000
          BEGIN                                                         04768000
               USERBIND:=USERBIND+UB;                                   04770000
               USERCOUNT:=USERCOUNT+UC;                                 04772000
               SYSTEMBIND:=SYSTEMBIND+SB;                               04774000
               SYSTEMCOUNT:=SYSTEMCOUNT+SC;                             04776000
               TOS := NAMEINFOQ;                                        04778000
               NAMEINFO2 := TOS; <<NAMES DST>>                          04780000
               NAMEINFO1 := TOS; <<NAMES COUNT>>                        04782000
               RETURN;                                                  04784000
          END;                                                          04786000
          MAXUSERS:=PVEMAXCOUNT;                                        04788000
          ACTUSERS:=PVEACTCOUNT;                                        04790000
          IF ACTUSERS = MAXUSERS THEN  <<ENTRY IS FULL>>                04792000
          BEGIN                                                         04794000
               INCR := PVEDEFEXTN;                             <<01106>>04796000
               IF (PVUSIZE-PVUAVAIL) <= PVEDEFEXTN             <<01106>>04798000
                   THEN EXPANDPVUTAB;                          <<01106>>04800000
               MOVE PVUSER (PVUAVAIL+INCR-1) :=                         04802000
                    PVUSER (PVUAVAIL-1),                                04804000
                    (-(PVUAVAIL-(@PVUENT+PVESIZE)));                    04806000
               PVUAVAIL:=PVUAVAIL+INCR;                                 04808000
               PVUENT (PVESIZE) := 0;                                   04810000
               MOVE PVUENT (PVESIZE+1) :=                               04812000
                    PVUENT (PVESIZE), (INCR-1);                         04814000
               PVESIZE:=PVESIZE+INCR;                                   04816000
               PVEMAXCOUNT:=PVEMAXCOUNT+(INCR/PVENTSIZE);               04818000
          END;                                                          04820000
          I:=PVEHDSIZE;                                                 04822000
          WHILE PVUENT(I) <> 0 DO I:=I+PVENTSIZE;                       04824000
          PINLOC:=I;  <<FOR BIND/COUNT DEFINES>>                        04826000
          PVUENT(I):=PININFO;  <<VOLUME MASK/USER PIN>>                 04828000
          USERBIND:=UB;  <<INITIAL USER BIND COUNT>>                    04830000
          USERCOUNT:=UC;  <<INITIAL USER MOUNT COUNT>>                  04832000
          SYSTEMBIND:=SB;  <<INITIAL SYSTEM BIND COUNT>>                04834000
          SYSTEMCOUNT:=SC;  <<INITIAL SYSTEM MOUNT COUNT>>              04836000
          TOS := NAMEINFOQ;                                             04838000
          NAMEINFO2 := TOS;  <<NAMES DST>>                              04840000
          NAMEINFO1 := TOS;  <<NAMES COUNT>>                            04842000
          PVEACTCOUNT:=PVEACTCOUNT+1;                                   04844000
     END  <<ADDUSER>>;                                                  04846000
                                                                        04848000
     SUBROUTINE DELUSER(MX);                                            04850000
     VALUE MX; INTEGER MX;                                              04852000
     BEGIN                                                              04854000
          CC:=CCL;                                                      04856000
          IF MX = 0 THEN RETURN;  <<INCORRECT MVTABX>>                  04858000
          IF CHECKPIN THEN  <<PIN IS USING MVTABX>>                     04860000
          BEGIN                                                         04862000
               CC:=CCE;  <<DELETE SUCCESSFUL>>                          04864000
                IF PIN=0 THEN                                  <<01197>>04866000
                   BEGIN                                       <<01197>>04868000
                       PVEOPMOUNT := 0;                        <<01197>>04870000
                       PVEOPMASK  := 0;                        <<01197>>04872000
                   END                                         <<01197>>04874000
                ELSE                                           <<01197>>04876000
               BEGIN                                                    04878000
                    USERCOUNT:=USERCOUNT-UC;                            04880000
                    SYSTEMCOUNT:=SYSTEMCOUNT-SC;                        04882000
                    CNT:=USERCOUNT+SYSTEMCOUNT;                         04884000
                    IF CNT = 0 OR UMASK = BYEMASK THEN                  04886000
                    BEGIN                                               04888000
                         PVUENT(PINLOC):=0;  <<MARK AVAILABLE>>         04890000
                         MOVE PVUENT (PINLOC+1) :=                      04892000
                              PVUENT (PINLOC), (PVENTSIZE-1);           04894000
                         PVEACTCOUNT:=PVEACTCOUNT-1;                    04896000
                    END ELSE                                            04898000
                    BEGIN                                               04900000
                         TOS := NAMEINFOQ;                              04902000
                         NAMEINFO2 := TOS;  <<NAMES DST>>               04904000
                         NAMEINFO1 := TOS;  <<NAMES COUNT>>             04906000
                         USERBIND:=USERBIND-UB;                         04908000
                         SYSTEMBIND:=SYSTEMBIND-SB;                     04910000
                    END;                                                04912000
               END;                                                     04914000
               IF PVEACTCOUNT = 0 AND NOT OPMOUNT THEN DELENTRY;        04916000
          END;                                                          04918000
     END <<DELUSER>>;                                                   04920000
                                                                        04922000
     SUBROUTINE UPDATEPVUSER(FNCT);                                     04924000
     VALUE FNCT; INTEGER FNCT;                                          04926000
     BEGIN                                                              04928000
          IF MVTABX = 0 THEN                                            04930000
          BEGIN                                                         04932000
               CC:=CCL;                                                 04934000
               DEBUG;                                                   04936000
          END;                                                          04938000
          INDEX:=0;                                                     04940000
          UMASK:=RETINFO;  <<SET USE MASK>>                             04942000
          TOS := RETINFO (1);  TOS := RETINFO (2);                      04944000
          NAMEINFOQ := TOS;  <<NAMES SEGMENT INFO>>                     04946000
          DST:=EXCHANGEDB(PVUSERDST);                                   04948000
          PVCOUNT:=PVUCOUNT;                                            04950000
          @PVUENT:=PVUHDSIZE;                                           04952000
          I:=0;                                                         04954000
          WHILE (I:=I+1) <= PVCOUNT DO                                  04956000
          IF PVEMVTABX = MVTABX THEN                                    04958000
          BEGIN                                                         04960000
               INDEX:=MVTABX;                                           04962000
               I:=PVCOUNT;  <<STOP LOOP>>                               04964000
          END ELSE                                                      04966000
          @PVUENT:=@PVUENT+PVESIZE;                                     04968000
          IF INDEX=0 AND FNCT = DELPIN THEN DEBUG;                      04970000
          UC:=IF UMASK.(12:1) THEN 1 ELSE 0;                            04972000
          UB:=IF UMASK.(13:1) THEN 1 ELSE 0;                            04974000
          SC:=IF UMASK.(14:1) THEN 1 ELSE 0;                            04976000
          SB:=IF UMASK.(15:1) THEN 1 ELSE 0;                            04978000
          IF FNCT = ADDPIN THEN                                         04980000
             ADDUSER(INDEX)                                             04982000
          ELSE                                                          04984000
             DELUSER(INDEX);                                            04986000
          IF PVUSIZE = 0 THEN DEBUG;                                    04988000
          EXCHANGEDB(DST);   DST:=-1;                          <<01106>>04990000
     END <<UPDATEPVUSER>>;                                              04992000
                                                                        04994000
     SUBROUTINE RETUSERINFO;                                            04996000
     BEGIN                                                              04998000
          CNT:=0;                                                       05000000
          MVTABX:=0;                                                    05002000
          RETINFO:=0;                                                   05004000
          DST:=EXCHANGEDB(PVUSERDST);                                   05006000
          MASK:=PVUMASK;                                                05008000
          WHILE MASK <> 0 DO                                            05010000
          BEGIN                                                         05012000
               MVTABX:=MVTABX+1;                                        05014000
               IF (MASK:=MASK & LSR(1)) THEN                            05016000
               BEGIN                                                    05018000
                    IF CHECKPIN THEN  <<PIN IS USING MVTABX>>           05020000
                    BEGIN                                               05022000
                         CNT:=CNT+1;                                    05024000
                         TOS:=PVUENT(PINLOC).VMASKF CAT MVTABX(4:12:4); 05026000
                    END;                                                05028000
               END;                                                     05030000
          END;                                                          05032000
          IF PVUSIZE = 0 THEN DEBUG;                                    05034000
          EXCHANGEDB(DST);   DST:=-1;                          <<01106>>05036000
          RETINFO:=CNT;                                                 05038000
          WHILE CNT > RETSIZE DO                                        05040000
          BEGIN                                                         05042000
               CNT:=CNT-1;                                              05044000
               DELETE;                                                  05046000
          END;                                                          05048000
          WHILE CNT > 0 DO                                              05050000
          BEGIN                                                         05052000
               RETINFO(CNT):=TOS;                                       05054000
               CNT:=CNT-1;                                              05056000
          END;                                                          05058000
     END <<RETUSERINFO>>;                                               05060000
                                                                        05062000
     SUBROUTINE RETVSETINFO;                                            05064000
     BEGIN                                                              05066000
          CNT:=0; <<ASSUME NO USERS OF THIS MVTAB INDEX>>               05068000
          IF MVTABX = 0 THEN RETURN;                                    05070000
          DST:=EXCHANGEDB(PVUSERDST);                                   05072000
          IF (PVMASK LAND (1 & LSL(MVTABX))) <> 0 THEN                  05074000
          BEGIN                                                         05076000
               PVCOUNT:=PVUCOUNT;                                       05078000
               @PVUENT:=PVUHDSIZE;                                      05080000
               I:=0;                                                    05082000
               WHILE (I:=I+1) <= PVCOUNT DO                             05084000
               IF PVEMVTABX = MVTABX THEN                               05086000
               BEGIN <<FOUND REQUIRED MVTABX>>                          05088000
                    I := PVCOUNT; <<STOP LOOP>>                         05090000
                    CNT:=0;                                             05092000
                    MAXCOUNT:=PVEMAXCOUNT;                              05094000
                    J:=-1;                                              05096000
                    WHILE (J:=J+1) < MAXCOUNT DO                        05098000
                    IF PVUENT ((J*PVENTSIZE)+PVEHDSIZE) <> 0            05100000
                    THEN                                                05102000
                    BEGIN                                               05104000
                         CNT:=CNT+1;                                    05106000
                         TOS :=                                         05108000
                         PVUENT ((J*PVENTSIZE)+PVEHDSIZE).PINF;         05110000
                    END;                                                05112000
               END ELSE                                                 05114000
               @PVUENT:=@PVUENT+PVESIZE;                                05116000
          END;                                                          05118000
          IF PVUSIZE = 0 THEN DEBUG;                                    05120000
          EXCHANGEDB(DST);   DST:=-1;                          <<01106>>05122000
          RETINFO:=CNT;                                                 05124000
          WHILE CNT > RETSIZE DO                                        05126000
          BEGIN                                                         05128000
               CNT:=CNT-1;                                              05130000
               DELETE;                                                  05132000
          END;                                                          05134000
          WHILE CNT > 0 DO                                              05136000
          BEGIN                                                         05138000
               RETINFO(CNT):=TOS;                                       05140000
               CNT:=CNT-1;                                              05142000
          END;                                                          05144000
     END <<RETVSETINFO>>;                                               05146000
                                                                        05148000
     SUBROUTINE CHECKUSER;                                              05150000
     BEGIN                                                              05152000
          PINLOC:=-1;  <<ASSUME PIN NOT USING VOLUME SET>>              05154000
          CC:=CCG;  <<ASSUME USER NOT USING VOLUME SET>>                05156000
          IF MVTABX = 0 THEN RETURN;                                    05158000
          DST:=EXCHANGEDB(PVUSERDST);                                   05160000
          IF (PVMASK LAND (1 & LSL(MVTABX))) <> 0 THEN                  05162000
          BEGIN                                                         05164000
               IF CHECKPIN THEN  <<FOUND PIN - STACK INFO>>             05166000
               BEGIN                                                    05168000
                    CC:=CCE;                                            05170000
                    IF PMAP.(14:1) THEN  <<RETURN PIN INFO>>            05172000
                    IF PINLOC > 0 THEN  <<PIN <> 0 - NOT OP>>           05174000
                    BEGIN                                               05176000
                         TOS:=PVUENT(PINLOC);  <<VOL MASK/PIN NUMBER>>  05178000
                         TOS:=PVUENT(PINLOC+1);                         05180000
                         TOS:=PVUENT(PINLOC+2);                         05182000
                         TOS:=PVUENT(PINLOC+3);                         05184000
                         TOS := PVUENT (PINLOC+4);                      05186000
                         TOS := PVUENT (PINLOC+5);                      05188000
                         TOS := PVUENT (PINLOC+6);                      05190000
                    END ELSE                                            05192000
                    BEGIN                                               05194000
                         TOS:=PIN CAT PVUENT(0)(0:0:8);                 05196000
                         TOS := 0;<<OP USER BINDS>>                     05198000
                         TOS:=1;  <<OP USER MOUNTS>>                    05200000
                         TOS:=0;  <<OP SYSTEM BINDS>>                   05202000
                         TOS := 0;<<OP SYSTEM MOUNTS>>                  05204000
                         TOS:=0;  <<NAMES COUNT>>                       05206000
                         TOS := 0;<<NAMES DST>>                         05208000
                    END;                                                05210000
               END;                                                     05212000
          END ELSE IF PVEOPMOUNT=1 THEN CC:=CCE <<OP MOUNT>>   <<01197>>05214000
                   ELSE CC:=CCL;      << USER TABLE ERROR >>   <<01197>>05216000
          IF PVUSIZE = 0 THEN DEBUG;                                    05218000
          EXCHANGEDB(DST);   DST:=-1;                          <<01106>>05220000
          IF PMAP.(14:1) THEN  <<RETURN INFO>>                          05222000
          IF PINLOC >= 0 THEN  <<CHECKPIN TRUE - INFO STACKED>>         05224000
          BEGIN                                                         05226000
               RETINFO (6) := TOS;  <<NAMES DST>>                       05228000
               RETINFO (5) := TOS;  <<NAMES COUNT>>                     05230000
               RETINFO (4) := TOS;  <<SYSTEM MOUNTS>>                   05232000
               RETINFO (3) := TOS;  <<SYSTEM BINDS>>                    05234000
               RETINFO (2) := TOS;  <<USER MOUNTS>>                     05236000
               RETINFO (1) := TOS;  <<USER BINDS>>                      05238000
               RETINFO:=TOS;     <<VOL MASK/PIN NUMBER>>                05240000
          END;                                                          05242000
     END <<CHECKUSER>>;                                                 05244000
                                                                        05246000
$IF X0=ON                                                               05248000
     MMSTAT (-201,FUNCT,MVTABX,DELTAP);                        <<MONIT>>05250000
$IF                                                                     05252000
     CC:=CCE;   USERTABLE:=0;                                  <<01106>>05254000
     DST:=-1; <<DST SET TO -1 IF NOEXCHG REQ TO GET BACK>>     <<01106>>05256000
     PIN:=PININFO.PINF;                                                 05258000
     A:=GETSIR(PVUSERSIR);                                              05260000
     CASE * FUNCT OF                                                    05262000
     BEGIN                                                              05264000
          UPDATEPVUSER(ADDPIN);                                         05266000
          UPDATEPVUSER(DELPIN);                                         05268000
          RETUSERINFO;                                                  05270000
          RETVSETINFO;                                                  05272000
          CHECKUSER;                                                    05274000
     END;                                                               05276000
     PEXIT(OKEXIT);                                            <<01106>>05278000
END << USERTABLE>>;                                                     05280000
                                                                        05282000
$PAGE "PVSYS - PHYSICAL MOUNT UTILITIES"                                05284000
                                                                        05286000
$CONTROL SEGMENT = PVSYSM                                               05288000
DOUBLE PROCEDURE VTABINDEX(VID,VSID,LDN,GEN);                           05290000
VALUE LDN;                                                              05292000
BYTE ARRAY VID,VSID;                                                    05294000
INTEGER LDN,GEN;                                                        05296000
OPTION VARIABLE;                                                        05298000
OPTION PRIVILEGED,UNCALLABLE;                                           05300000
BEGIN                                                                   05302000
     <<VID - VOLUME NAME (8 BYTES)                                      05304000
       VSID - VSNAME.VSGROUP.VSACCNT (24 BYTE MAXIMUM)                  05306000
                                                                        05308000
       RETURNS:                                                         05310000
                                                                        05312000
             .........................                                  05314000
             .           .           .                                  05316000
         S-1 .   LDEV    .   VTABX   .                                  05318000
             .           .           .                                  05320000
             .........................                                  05322000
             .S.    .    .           .                                  05324000
         S-0 .C.    . VOL.   MVTABX  .                                  05326000
             .R.    .INDX.           .                                  05328000
             .........................                                  05330000
              0      4    8         15                                  05332000
                                                                        05334000
     >>                                                                 05336000
     LOGICAL PMAP = Q-4;                                                05338000
     INTEGER                                                            05340000
          VTABINDEXS1 = VTABINDEX,                                      05342000
          VTABINDEXS0 = VTABINDEX+1;                                    05344000
     INTEGER LDEV,INDEX,ENTLOC,ENTNUM,ENTSIZE,NAMELOC,                  05346000
             VTABINFO,RETURNLOC;                                        05348000
     LOGICAL A;                                                         05350000
     ARRAY VLAB(0:127);                                                 05352000
     BYTE ARRAY VLABB(*) = VLAB;                                        05354000
     BYTE ARRAY VOLID(0:23);                                            05356000
     INTEGER POINTER VTAB;                                              05358000
     BYTE POINTER VTABB;                                                05360000
                                                                        05362000
     SUBROUTINE GETVTAB;                                                05364000
     BEGIN                                                              05366000
          RETURNLOC:=TOS;  <<SUBROUTINE RETURN LOCATION>>               05368000
          TOS:=@VTABINFO;                                               05370000
          TOS:=VTABDST;                                                 05372000
          TOS:=0;                                                       05374000
          TOS:=1;                                                       05376000
          ASSEMBLE(MFDS 4);                                             05378000
          ENTNUM:=VTABINFO.VTENTNUM;                                    05380000
          ENTSIZE:=VTABINFO.VTENTSIZE;                                  05382000
          PUSH(S);                                                      05384000
          @VTAB:=TOS+1;                                                 05386000
          @VTABB:=@VTAB & LSL(1);                                       05388000
          TOS:=((ENTNUM+1)*ENTSIZE)+1;                                  05390000
          ASSEMBLE(ADDS 0);                                             05392000
          TOS:=@VTAB;                                                   05394000
          TOS:=VTABDST;                                                 05396000
          TOS:=0;                                                       05398000
          TOS:=(ENTNUM+1)*ENTSIZE;                                      05400000
          ASSEMBLE(MFDS 4);                                             05402000
          TOS:=RETURNLOC;  <<ASSURE VALID SUBROUTINE RETURN>>           05404000
     END <<GETVTAB>>;                                                   05406000
                                                                        05408000
     CC:=CCE;  <<ASSUME NO DISC ERRORS>>                                05410000
     LDN:=IF (NOT PMAP LOR LDN=0) THEN -1 ELSE LDN;                     05412000
     MOVE VOLID:=VID,(8),2;                                             05414000
     MOVE * :=VSID(8),(16);                                             05416000
     GETVTAB;                                                           05418000
     FOR INDEX:=1 UNTIL ENTNUM DO                                       05420000
     BEGIN                                                              05422000
          ENTLOC:=INDEX * ENTSIZE;                                      05424000
          NAMELOC:=(ENTLOC) & LSL(1);                                   05426000
          LDEV:=VTAB(ENTLOC+12).(0:8);                                  05428000
          IF LDEV = LDN OR  <<LDEV SEARCH>>                             05430000
          VOLID = VTABB(NAMELOC),(24) THEN                              05432000
          BEGIN                                                         05434000
               DISCIO(LDEV,R,VLAB,0D,128);                              05436000
               IF <> THEN                                               05438000
               BEGIN                                                    05440000
                    CC:=CCL;                                            05442000
                    RETURN;                                             05444000
               END;                                                     05446000
               IF LDEV = LDN OR  <<LDEV SEARCH>>                        05448000
               VSID=VLABB(LVSNAMELOC),(8) THEN  <<FOUND>>               05450000
               IF GEN < 0 OR GEN = INTEGER(VLAB(LGENINDEX)) THEN        05452000
               BEGIN                                                    05454000
                    IF GEN < 0 THEN GEN:=VLAB(LGENINDEX);               05456000
                    VTABINDEXS1:=INDEX CAT LDEV(0:8:8);                 05458000
                    VTABINDEXS0:=VTAB(ENTLOC+13) CAT                    05460000
                                 VTAB(ENTLOC+12)(0:15:1);  <<SCRATCH>>  05462000
                    INDEX:=ENTNUM;  <<STOP LOOP>>                       05464000
               END;                                                     05466000
          END;                                                          05468000
     END;                                                               05470000
END << VTABINDEX >>;                                                    05472000
                                                                        05474000
$CONTROL SEGMENT = PVSYSM                                               05476000
LOGICAL PROCEDURE PMOUNTED(VSID,VSDEFN,DEVLIST,GEN);                    05478000
ARRAY VSID;  <<FULLY QUALIFIED VS IDENTIFIER>>                          05480000
ARRAY VSDEFN,DEVLIST;                                                   05482000
INTEGER GEN;  <<MASTER VOLUME MVTAB AND VTAB INDICES>>                  05484000
OPTION PRIVILEGED,UNCALLABLE;                                           05486000
BEGIN                                                                   05488000
     INTEGER I:=1,CNT:=0,LDEV,GENX,NAMELOC;                             05490000
     LOGICAL A,B,C,MASK;                                                05492000
     ARRAY LDTENT(0:9);                                                 05494000
     BYTE ARRAY VOLID(0:23);                                            05496000
     BYTE ARRAY VSDEFNB(*) = VSDEFN;                                    05498000
     DEFINE                                                             05500000
          OWNED        = (LPDT((LDEV&LSL(1))+1).(0:2) <> 0)#,           05502000
          SERIAL       =((LPDT((LDEV&LSL(1))+LPDT1).SDLF) LAND <<01115>>05504000
                         (LPDT((LDEV&LSL(1))+LPDT1).FORS=0))#, <<01115>>05506000
          MOUNTED      = (LPDT((LDEV&LSL(1))+1).MNTF)#,                 05508000
          RESERVED     = (LPDT((LDEV&LSL(1))+1).RESF)#,                 05510000
          USECOUNT     = (LDTENT(0))#,                                  05512000
          AVAILTOSYS   = (LDTENT(3).(2:3) = %4)#;                       05514000
                                                                        05516000
     MASK:=DEVLIST.VOLMASK;                                             05518000
     NAMELOC:=VDVENTSIZEB;                                              05520000
     A:=GETSIR(VTABSIR);                                                05522000
     WHILE MASK <> 0 DO  <<CHECK FOR VOLUMES IN VTAB>>                  05524000
     BEGIN                                                              05526000
          I:=I+1;  <<ORDINAL VOLUME COUNTER>>                           05528000
          IF MASK THEN  <<THIS ORDINAL VOLUME SHOULD BE CHECKED>>       05530000
          IF DEVLIST(I).(0:1) THEN  <<DRIVE STILL NEEDED>>              05532000
          BEGIN                                                         05534000
               GENX:=GEN;                                               05536000
               MOVE VOLID:=VSDEFNB(NAMELOC),(8);                        05538000
               TOS:=VTABINDEX(VOLID,VSID,DEVLIST(I).(8:8),GENX);        05540000
               IF DS1 <> 0D THEN  <<VTAB ENTRY EXISTS - VOLUME MOUNTED>>05542000
               BEGIN                                                    05544000
                    DELETE;  <<DELETE VOLX/MVTABX>>                     05546000
                    LDEV:=S0.(0:8);                                     05548000
                    C:=GETSIR(LDTSIR);                                  05550000
                    B:=GETSIR(LPDTSIR);                                 05552000
                    GETABENTRY(LDTDST,LDEV,LDTENT);                     05554000
                    IF NOT (RESERVED LOR MOUNTED LOR SERIAL)            05556000
                    AND USECOUNT = 0 AND AVAILTOSYS AND                 05558000
                       NOT OWNED THEN                                   05560000
                    BEGIN                                               05562000
                         IF I = 2 THEN  <<MASTER VOLUME>>               05564000
                         BEGIN                                          05566000
                              IF GEN < 0 THEN GEN:=GENX;                05568000
                         END;                                           05570000
                         DEVLIST(I):=(TOS & LSL(8))+LDEV;               05572000
                    END ELSE                                            05574000
                    DELETE;                                             05576000
                    RELSIR(LPDTSIR,B);                                  05578000
                    RELSIR(LDTSIR,C);                                   05580000
               END ELSE                                                 05582000
               DELETEDBL;                                               05584000
          END;                                                          05586000
          MASK:=MASK & LSR(1);                                          05588000
          NAMELOC:=NAMELOC+VDVENTSIZEB;                                 05590000
     END;                                                               05592000
     RELSIR(VTABSIR,A);                                                 05594000
     FOR I:=2 UNTIL (MAXVOLNUM+1) DO                                    05596000
     IF DEVLIST(I).(8:8) <> 0 THEN CNT:=CNT+1;  <<DRIVE ASSIGNED>>      05598000
     IF CNT = INTEGER(DEVLIST(1).(8:8)) THEN  <<ALL VOLUMES MOUNTED>>   05600000
     BEGIN                                                              05602000
          CC:=CCE;                                                      05604000
          PMOUNTED:=TRUE;                                               05606000
     END;                                                               05608000
     DEVLIST(1).(0:8):=CNT;                                             05610000
     CC:=IF CNT = 0 THEN CCL ELSE CCG;                                  05612000
END << PMOUNTED >>;                                                     05614000
                                                                        05616000
$CONTROL SEGMENT = PVSYSM                                               05618000
LOGICAL PROCEDURE AVAILABLE(SNAME,SNAMELEN,DEVLIST);                    05620000
VALUE SNAMELEN; INTEGER SNAMELEN;                                       05622000
BYTE ARRAY SNAME;                                                       05624000
ARRAY DEVLIST;                                                          05626000
OPTION PRIVILEGED,UNCALLABLE;                                           05628000
BEGIN                                                                   05630000
     INTEGER I,DEV,DST,LEN,LOC,LDEV,ENTNUM,ENTSIZE,LEFTOFF;             05632000
     LOGICAL A,B,MASK,VMASK,REPLY;                                      05634000
     LOGICAL                                                   <<00244>>05636000
         COUNT,                                                <<00244>>05638000
         SUBTYPE,                                              <<00244>>05640000
         MMASK,                                                <<00244>>05642000
         TMASK;                                                <<00244>>05644000
     ARRAY LDTENT(0:9);                                                 05646000
     LOGICAL ARRAY                                             <<00244>>05648000
         DEVLISTQ (0:DEVLISTSIZE) = Q,                         <<00244>>05650000
         DEVS (*) = DEVLISTQ (2);                              <<00244>>05652000
     BYTE ARRAY MSG(0:72);                                              05654000
                                                               <<00244>>05656000
     EQUATE                                                    <<00244>>05658000
         DISCTYPESL = 37;                                      <<03511>>05660000
                                                               <<00244>>05662000
    COMMENT:                                                   <<00244>>05664000
                                                               <<00244>>05666000
    PSUEDO SUBTYPES FOR THE DIFFERENT TYPES OF DISCS           <<00244>>05668000
    DEFINED BELOW ARE DEVELOPED AS FOLLOWS:                    <<00244>>05670000
                                                               <<00244>>05672000
    [PSUEDO SUBTYPE] = ([ACTUAL TYPE] * 16) + [ACTUAL SUBTYPE] <<00244>>05674000
                                                               <<00244>>05676000
    ;                                                          <<00244>>05678000
                                                               <<00244>>05680000
     BYTE ARRAY DISCTYPESX (0:DISCTYPESL-1) = PB :=            <<00244>>05682000
         6, 4,  "7905",                                        <<00244>>05684000
         6, 8,  "7920",                                        <<00244>>05686000
         6, 9,  "7925",                                        <<00244>>05688000
         6, 10, "7906",                                        <<00244>>05690000
         6, 32, "7902",                                        <<00244>>05692000
         6, 56, "7933",                                        <<04278>>05694000
         0;                                                    <<00244>>05696000
     BYTE ARRAY DISCTYPES (0:DISCTYPESL-1);                    <<00244>>05698000
     BYTE POINTER                                              <<00244>>05700000
         BPS0 = S-0,                                           <<00244>>05702000
         DEFN,                                                 <<00244>>05704000
         MSGEND;                                               <<00244>>05706000
     DEFINE                                                             05708000
          SAME'TYPE    = LPDT ((LDEV & LSL (1))+1).(12:4) =    <<00244>>05710000
                         (DEVLISTQ (DEV).(1:7)) / 16 #,        <<00244>>05712000
          OWNED        = (LPDT((LDEV&LSL(1))+1).(0:2) <> 0)#,           05714000
          USECOUNT     = (LDTENT(0))#,                                  05716000
          SAME'SUBTYPE = LDTENT (2).(10:6) =                   <<00244>>05718000
                         DEVLISTQ (DEV).(1:7) MOD 16 #,        <<00244>>05720000
          MOUNTED      = (LPDT((LDEV&LSL(1))+1).MNTF)#,                 05722000
          RESERVED     = (LPDT((LDEV&LSL(1))+1).RESF)#,                 05724000
          AVAILTOSYS   = (LDTENT(3).(2:3) = %4)#,                       05726000
          NONSYSDOMAIN = (LPDT((LDEV&LSL(1))+1).NSDF)#;                 05728000
     DEFINE                                                             05730000
          DRIVES'NEEDED   = DEVLIST(1).(8:8)#,                          05732000
          DRIVES'OBTAINED = DEVLISTQ(1).(0:8)#;                         05734000
                                                                        05736000
     INTEGER SUBROUTINE FINDDISCTYPE (BSUBTYPE);               <<00244>>05738000
         VALUE   BSUBTYPE;                                     <<00244>>05740000
         BYTE    BSUBTYPE;                                     <<00244>>05742000
         BEGIN                                                 <<00244>>05744000
             I := 0;                                           <<00244>>05746000
             WHILE DISCTYPES (I) <> 0 DO                       <<00244>>05748000
             BEGIN                                             <<00244>>05750000
                 IF BSUBTYPE = DISCTYPES (I+1), (1)  THEN      <<00244>>05752000
                 BEGIN                                         <<00244>>05754000
                     FINDDISCTYPE := I+2;                      <<00244>>05756000
                     I := DISCTYPESL - 1;      << End of list ><<03511>>05758000
                 END ELSE I := I + INTEGER (DISCTYPES (I));    <<00244>>05760000
             END;                                              <<00244>>05762000
         END <<OF FINDDISCTYPE>>;                              <<00244>>05764000
                                                               <<00244>>05766000
     VMASK:=DEVLIST;                                                    05768000
     MOVE DEVLISTQ:=DEVLIST,(DEVLISTSIZE);  <<INIT Q-REL ARRAY>>        05770000
     IF DRIVES'NEEDED <> DRIVES'OBTAINED THEN  <<LOOK FOR SOME DRIVES>> 05772000
     BEGIN                                                              05774000
          DEV:=1;                                                       05776000
          LEFTOFF:=2;  <<LDEV POINTER>>                                 05778000
          MASK:=VMASK;                                                  05780000
          ENTNUM:=LPDT(0).(0:8);                                        05782000
          B:=GETSIR(LDTSIR);                                            05784000
          A:=GETSIR(LPDTSIR);                                           05786000
          WHILE MASK <> 0 DO                                            05788000
          BEGIN                                                         05790000
               DEV:=DEV+1;                                              05792000
               IF MASK AND DEVLISTQ(DEV).(8:8) = 0 THEN  <<GET DRIVE>>  05794000
               BEGIN                                                    05796000
                    LDEV:=LEFTOFF-1;                                    05798000
                    WHILE (LDEV:=LDEV+1) < ENTNUM DO                    05800000
                    BEGIN                                               05802000
                         GETABENTRY(LDTDST,LDEV,LDTENT);                05804000
                         IF SAME'TYPE THEN                     <<00244>>05806000
                         IF SAME'SUBTYPE THEN                  <<00244>>05808000
                         IF NONSYSDOMAIN THEN                           05810000
                         IF NOT (RESERVED LOR MOUNTED) THEN             05812000
                         IF USECOUNT = 0 AND AVAILTOSYS THEN            05814000
                         IF NOT OWNED THEN                              05816000
                         BEGIN                                          05818000
                              LEFTOFF:=LDEV+1;  <<POINT TO NEXT DEV>>   05820000
                              LPDT((LDEV & LSL(1))+1).RESF:=1;          05822000
                              DEVLISTQ(1).(0:8):=DEVLISTQ(1).(0:8)+1;   05824000
                              DEVLISTQ(DEV).(8:8):=LDEV;                05826000
                              LDEV:=ENTNUM;  <<STOP LOOP>>              05828000
                         END;                                           05830000
                    END;                                                05832000
               END;                                                     05834000
               MASK:=MASK & LSR(1);                                     05836000
          END;                                                          05838000
          RELSIR(LPDTSIR,A);                                            05840000
          RELSIR(LDTSIR,B);                                             05842000
          IF DRIVES'NEEDED <> DRIVES'OBTAINED THEN  <<MORE NEEDED>>     05844000
          BEGIN                                                         05846000
               MOVE DISCTYPES := DISCTYPESX, (DISCTYPESL);     <<00244>>05848000
               MOVE MSG:="DRIVES FOR ",2;                               05850000
               I:=0;                                                    05852000
               MOVE * :=SNAME,(SNAMELEN),2;                             05854000
               MOVE * :=": ",2;                                         05856000
               DEV:=0;                                         <<00244>>05858000
               MASK:=DEVLIST;                                           05860000
               @MSGEND := TOS; <<SAVE WHERE MESSAGE ENDED>>    <<00244>>05862000
               WHILE MASK <> 0 DO                                       05864000
               BEGIN                                                    05866000
                   IF MASK AND DEVS (DEV).(8:8) = 0 THEN       <<00244>>05868000
                   BEGIN                                       <<00244>>05870000
                       COUNT := 1;                             <<00244>>05872000
                       LEFTOFF := DEV;                         <<00244>>05874000
                       SUBTYPE := DEVS (DEV).(1:7);            <<00244>>05876000
                       TMASK := (1 & LSL (DEV));               <<00244>>05878000
                       MMASK := MASK;                          <<00244>>05880000
                       WHILE (MMASK := MMASK & LSR (1)) <> 0 DO<<00244>>05882000
                       BEGIN <<FIND AND COUNT OTHERS IF SAME>> <<00244>>05884000
                           DEV := DEV+1;                       <<00244>>05886000
                           IF DEVS (DEV).(1:7) = SUBTYPE THEN  <<00244>>05888000
                           BEGIN                               <<00244>>05890000
                               COUNT := COUNT+1;               <<00244>>05892000
                               TMASK:=TMASK LOR (1&LSL(DEV));  <<00244>>05894000
                           END;                                <<00244>>05896000
                       END;                                    <<00244>>05898000
                       DEFN := FINDDISCTYPE (BYTE (SUBTYPE));  <<00244>>05900000
                       TOS := @MSGEND;                         <<00244>>05902000
                       MOVE * := DISCTYPES (DEFN), (4),2;      <<00244>>05904000
                       MOVE * := " (",2;                       <<00244>>05906000
                       ASCII (COUNT,10,BPS0);                  <<00244>>05908000
                       @BPS0 := @BPS0+1;                       <<00244>>05910000
                       MOVE * := "),",2;                       <<00244>>05912000
                       @MSGEND := TOS;                         <<00244>>05914000
                       DEV := LEFTOFF;                         <<00244>>05916000
                       MASK := MASK XOR (TMASK & LSR (DEV));   <<00244>>05918000
                   END;                                        <<00244>>05920000
                   DEV := DEV+1;                               <<00244>>05922000
                   MASK := MASK & LSR (1);                     <<00244>>05924000
               END;                                                     05926000
               TOS := @MSGEND -1;  <<ELIMINATE TRAILING COMMA>><<00244>>05928000
               MOVE *:=" (Y/N)?",2;                                     05930000
               LEN:=TOS-@MSG;                                           05932000
               MSG(LEN):=0;  <<GENMSG STOP>>                            05934000
               GENMSG(-1,@MSG,,,,,,,0,%1,@REPLY);                       05936000
               IF NOT REPLY THEN  <<OPERATOR REJECTED>>                 05938000
               BEGIN                                                    05940000
                    RETURN;                                             05942000
               END;                                                     05944000
          END;                                                          05946000
     END;                                                               05948000
     MOVE DEVLIST:=DEVLISTQ,(DEVLISTSIZE);                              05950000
     AVAILABLE:=TRUE;                                                   05952000
END << AVAILABLE >>;                                                    05954000
                                                                        05956000
$PAGE "PVSYS - MOUNT PROCEDURE"                                         05958000
                                                                        05960000
$CONTROL SEGMENT = PVSYSM                                               05962000
PROCEDURE MOUNT (VSNAME,VSGROUP,VSACCNT,REQTYPE,               <<00211>>05964000
                 GEN,PVINFO,DIFFERENT'PIN);                    <<00211>>05966000
VALUE GEN,DIFFERENT'PIN;                                       <<00211>>05968000
INTEGER REQTYPE,GEN,PVINFO,DIFFERENT'PIN;                      <<00211>>05970000
BYTE ARRAY VSNAME,VSGROUP,VSACCNT;                                      05972000
OPTION VARIABLE;                                                        05974000
OPTION PRIVILEGED,UNCALLABLE;                                           05976000
BEGIN                                                                   05978000
                                                                        05980000
                                                                        05982000
    COMMENT                                                             05984000
                                                                        05986000
        *********************************************************       05988000
        *                                                       *       05990000
        * ATTENTION                                             *       05992000
        *                                                       *       05994000
        *  CALLING CONVENTIONS:                                 *       05996000
        *                                                       *       05998000
        *    1. DB MUST BE AT STACK UPON ENTRY TO "MOUNT".      *       06000000
        *       A. ARRAYS ARE EXPLICTLY DECLARED.               *       06002000
        *                                                       *       06004000
        *    2. PROCESS CANNOT HAVE DIRECTORY SIR LOCKED UPON   *       06006000
        *       ENTRY TO "MOUNT".                              <<00211>>06008000
        *       A. POTENTIAL FOR DEADLOCKS IF THIS RULE IS NOT  *       06010000
        *          OBEYED.                                      *       06012000
        *                                                       *       06014000
        *  NOTE:                                                *       06016000
        *                                                       *       06018000
        *    ORDER OF SIR ACQUISITION IS AS FOLLOWS:            *       06020000
        *                                                       *       06022000
        *       DIRECTORY => MVTABLE => LDT                     *       06024000
        *                                                       *       06026000
        *********************************************************       06028000
                                                                        06030000
                                                                        06032000
    ; <<END OF COMMENT>>                                                06034000
                                                                        06036000
     LOGICAL PMAP = Q-4;  <<OPTIONAL PRAMETERS MAP>>                    06038000
     DOUBLE NAMEINFO;                                                   06040000
     INTEGER GENX:=-1;  <<ASSUME GEN INDEX TO BE IGNORED>>              06042000
     INTEGER I,N,PIN,DEV,DST,LEN,LOC,TYPE,MSGLEN,ENTSIZE,               06044000
             JITINFO,USECOUNT,VTABINDEX,MVTABINDEX,URET,       <<01106>>06046000
             NAMEINFO1 = NAMEINFO,                                      06048000
             NAMEINFO2 = NAMEINFO1+1,                                   06050000
             SETNAMELEN,USERACCTLEN,ENTNUM,OLDDST,DSIR;                 06052000
     LOGICAL A,B,VSDEF,REPLY,VMOUNT,DUPNAME,                            06054000
             PMOUNTREQD;                                                06056000
     LOGICAL MSIR:=3,BIND:=FALSE,MOUNTED:=FALSE,                        06058000
             BINDJIT:=FALSE,ALREADYMOUNTED:=FALSE;                      06060000
     LOGICAL RESOURCES := FALSE;                                        06062000
     DEFINE                                                             06064000
         HAVEDSIR              = RESOURCES.(15:1) #,                    06066000
         HAVEMSIR              = RESOURCES.(14:1) #,                    06068000
         HAVEMVTABNTRY         = RESOURCES.(13:1) #,                    06070000
         MVTABLEUPDATED        = RESOURCES.(12:1) #,                    06072000
         USERTABLEUPDATE       = RESOURCES.(11:1) #,                    06074000
         LOGICALMOUNT          = RESOURCES.(10:1) #;                    06076000
     LOGICAL ATTRIBUTES := FALSE;                                       06078000
     DEFINE                                                             06080000
         FIRSTUSEROFSET        = ATTRIBUTES.(15:1) #,                   06082000
         NEWUSEROFSET          = ATTRIBUTES.(14:1) #,                   06084000
         OLDUSEROFSET          = ATTRIBUTES.(13:1) #;                   06086000
     LOGICAL FIRSTIMETOGS:=TRUE;                                        06088000
     DEFINE                                                             06090000
          FIRSTIMETHRU    = FIRSTIMETOGS.(15:1)#,                       06092000
          FIRSTACCESSMSG  = FIRSTIMETOGS.(14:1)#;                       06094000
                                                                        06096000
     LOGICAL UMASK:=0;                                                  06098000
     DEFINE                                                             06100000
          USERREQ  = UMASK.(12:1)#,                                     06102000
          USERBIND   = UMASK.(13:1)#,                                   06104000
          SYSREQ   = UMASK.(14:1)#,                                     06106000
          SYSBIND    = UMASK.(15:1)#;                                   06108000
     LOGICAL ARRAY UMASK'(-3:4);                                        06110000
     LOGICAL ARRAY UMASK'PB(*)=PB:=                                     06112000
          %03,  <<SYSTEM MOUNT (CONDITIONAL) - BINDING       >>         06114000
          %02,  <<SYSTEM MOUNT - NO BINDING                  >>         06116000
          %00,  <<UNUSED>>                                              06118000
          %14,  <<USER MOUNT - BINDING       >>                         06120000
          %10,  <<USER MOUNT - NO BINDING    >>                         06122000
          %03,  <<SYSTEM MOUNT - BINDING     >>                         06124000
          %02,  <<SYSTEM MOUNT - NO BINDING  >>                         06126000
          %00;  <<OPERATOR MOUNT - NO BINDING>>                         06128000
                                                                        06130000
     LOGICAL CMASK:=0,TMASK:=0,VMASK:=0,MMASK:=0;                       06132000
     INTEGER ARRAY NAMEQ (0:7) = Q;                                     06134000
     BYTE ARRAY NAMEQB(*) = NAMEQ;                                      06136000
     INTEGER ARRAY NAMESEG (*) = DB+0;                                  06138000
     ARRAY RETINFO (0:PVENTSIZE-1) = Q;                                 06140000
     DOUBLE RETINFOD = RETINFO;                                         06142000
     ARRAY                                                              06144000
          VLAB(0:127),                                                  06146000
          LDTENT(*) = VLAB,                                             06148000
          VTABENT(*) = VLAB,                                            06150000
          VSDEFN(0:VDSENTSIZE),                                         06152000
          DEVLIST(0:DEVLISTSIZE),                                       06154000
          MVTABENT(0:MVTABENTSIZE);                                     06156000
     ARRAY DIRPARMS(*) = VLAB;                                          06158000
     ARRAY DIRENT(*) = VLAB;                                            06160000
     BYTE ARRAY DIRENTB(*) = VLAB;                                      06162000
     ARRAY                                                              06164000
         ORIGVSID (0:11);                                               06166000
     ARRAY VSID(0:11);                                                  06168000
     BYTE ARRAY VSIDB(*) = VSID;                                        06170000
     ARRAY UGANAME(0:11);  <<USER/GROUP/ACCOUNT NAME>>                  06172000
     BYTE ARRAY UGANAMEB(*) = UGANAME;                                  06174000
     BYTE ARRAY MSG(0:72);                                              06176000
     BYTE ARRAY SETNAME(0:27);                                          06178000
     BYTE ARRAY USERACCT(0:17);  <<USER/ACCOUNT NAMES>>                 06180000
     DOUBLE ARRAY MVTABENTD(*) = MVTABENT(5);                           06182000
     ARRAY                                                              06184000
         VSNAMEW (*),                                                   06186000
         VSGROUPW (*),                                                  06188000
         VSACCNTW (*);                                                  06190000
                                                                        06192000
     EQUATE                                                             06194000
         MV = 1,                                                        06196000
         MOUNTCNT = 1;                                                  06198000
                                                                        06200000
     DEFINE                                                             06202000
          DOWNMASK = MVTABENT.DOWNF#;                                   06204000
                                                                        06206000
     DEFINE                                                             06208000
          DRIVES'NEEDED   = DEVLIST(1).(8:8)#,                          06210000
          DRIVES'OBTAINED = DEVLIST(1).(0:8)#;                          06212000
                                                                        06214000
     DEFINE                                                             06216000
          VCLASSDEF = NOT VSDEF#,                                       06218000
          AUTOMOUNT = VMOUNT.AUTOF#;                                    06220000
     DEFINE  << NAMEINFO FIELDS >>                                      06222000
          NAMECOUNT      = NAMEINFO1 #,                                 06224000
          NAMEDST        = NAMEINFO2 #,                                 06226000
          MAXNAMESEGLN   = NAMESEG (0) #,                               06228000
          CURRNAMESEGLN  = NAMESEG (1) #;                               06230000
                                                                        06232000
     INTEGER SUBROUTINE ALLOCMVTABX;                                    06234000
         BEGIN                                                          06236000
             OLDDST := EXCHANGEDB (MVTABDST);                           06238000
             ENTSIZE := MVTAB.(0:8);                                    06240000
             ENTNUM := MVTAB.(8:8);                                     06242000
             I := 0;                                                    06244000
             WHILE (I:=I+1) <= ENTNUM DO                                06246000
              IF NOT MVTAB (I*ENTSIZE).INUSE THEN                       06248000
              BEGIN                                                     06250000
                  MVTAB (X).INUSE := TRUE;                              06252000
                  MVTAB (X) := MVTAB (MOUNTCNT) + 1;                    06254000
                  ALLOCMVTABX := I;                                     06256000
                  I := ENTNUM;  <<STOP LOOP>>                           06258000
              END;                                                      06260000
             EXCHANGEDB (OLDDST);                                       06262000
         END;<<OF ALLOCMVTABX>>                                         06264000
                                                                        06266000
     LOGICAL SUBROUTINE DEALLOCMVTABX (MVTABX');                        06268000
         VALUE MVTABX';  INTEGER MVTABX';                               06270000
         BEGIN                                                          06272000
             OLDDST := EXCHANGEDB (MVTABDST);                           06274000
             ENTSIZE := MVTAB.(0:8);                                    06276000
             ENTNUM := MVTAB.(8:8);                                     06278000
             IF NOT MVTAB (MVTABX'*ENTSIZE).INUSE THEN                  06280000
              SUDDENDEATH (419);                                        06282000
             MVTAB (X) := 0;                                            06284000
             MVTAB (X) := MVTAB (MOUNTCNT) - 1;                         06286000
             EXCHANGEDB (OLDDST);                                       06288000
         END;<<OF DEALLOCMVTABX>>                                       06290000
                                                                        06292000
     SUBROUTINE MOVENAME;                                               06294000
     BEGIN                                                              06296000
          N:=-1;                                                        06298000
          WHILE (N:=N+1) < 8 DO                                         06300000
          NAMESEG(LOC+N+1):=NAMEQ(N);                                   06302000
     END <<MOVENAME>>;                                                  06304000
                                                                        06306000
     LOGICAL SUBROUTINE COMPNAME;                                       06308000
     BEGIN                                                              06310000
          N:=-1;                                                        06312000
          COMPNAME:=TRUE;                                               06314000
          WHILE (N:=N+1) < 8 DO                                         06316000
          IF NAMESEG(LOC+N+1) <> NAMEQ(N) THEN                          06318000
          BEGIN                                                         06320000
               COMPNAME:=FALSE;                                         06322000
               N:=8;  <<STOP LOOP>>                                     06324000
          END;                                                          06326000
     END <<COMPNAME>>;                                                  06328000
                                                                        06330000
     SUBROUTINE DELNAME;                                                06332000
     BEGIN                                                              06334000
          I := 0;                                                       06336000
          DUPNAME:=FALSE;                                               06338000
          RETINFO:=UMASK;                                               06340000
          RETINFO (1) := NAMEINFO1;  RETINFO (2) := NAMEINFO2;          06342000
          IF NOT BIND OR NAMECOUNT = 0 THEN RETURN;                     06344000
          MOVE NAMEQB:=VSGROUP,(8),2;                                   06346000
          MOVE   *  :=VSACCNT,(8);                                      06348000
          DST:=EXCHANGEDB(NAMEDST);                                     06350000
          WHILE (I:=I+1) <= INTEGER (NAMECOUNT) DO                      06352000
          BEGIN                                                         06354000
               LOC:= I * NAMENTSIZE;                                    06356000
               IF COMPNAME THEN                                         06358000
               BEGIN                                                    06360000
                    DUPNAME:=TRUE;                                      06362000
                    I:=NAMECOUNT+1;  <<STOP LOOP>>                      06364000
               END;                                                     06366000
          END;                                                          06368000
          IF DUPNAME THEN                                               06370000
          BEGIN                                                         06372000
               IF (NAMESEG(LOC):=NAMESEG(LOC)-1) = 0 THEN               06374000
               BEGIN                                                    06376000
                    IF (NAMECOUNT+1) > 0 THEN  <<MORE NAMES>>           06378000
                    BEGIN                                               06380000
                         <<COMPACT NAME SEGMENT>>                       06382000
                         MOVE NAMESEG(LOC):=NAMESEG(LOC+NAMENTSIZE),    06384000
                              ((NAMECOUNT*NAMENTSIZE)-LOC);             06386000
                         LOC:=NAMECOUNT*NAMENTSIZE;                     06388000
                         NAMESEG(LOC):=0;                               06390000
                         MOVE  <<ZERO OLD AREA>>                        06392000
                         NAMESEG(LOC+1):=NAMESEG(LOC),                  06394000
                                         (NAMENTSIZE-1);                06396000
                    END;                                                06398000
                    NAMECOUNT:=NAMECOUNT-1;                             06400000
               END;                                                     06402000
          END;                                                          06404000
          EXCHANGEDB(DST);                                              06406000
          IF NAMECOUNT = 0 THEN                                         06408000
          BEGIN                                                         06410000
               RELDATASEG(NAMEDST);                                     06412000
               NAMEINFO := 0D;  <<NULL NAMES>>                          06414000
          END;                                                          06416000
          RETINFO (1) := NAMEINFO1;  RETINFO (2) := NAMEINFO2;          06418000
     END <<DELNAME>>;                                                   06420000
     SUBROUTINE RESETLPDT;                                              06422000
     BEGIN                                                              06424000
          I:=1;  <<LOOP VARIABLE THROUGH DEVLIST>>                      06426000
          A:=GETSIR(LPDTSIR);                                           06428000
          WHILE (I:=I+1) <= (DEVLISTSIZE-1) DO                          06430000
          IF (DEV:=DEVLIST(I).(8:8)) <> 0 THEN                          06432000
          BEGIN                                                         06434000
               LPDT((DEV & LSL(1))+1).RESF:=0;                          06436000
               IF (CMASK LAND (1 & LSL(I-2))) <> 0 THEN                 06438000
               LPDT((DEV & LSL(1))+1).MNTF:=1;                          06440000
          END;                                                          06442000
          RELSIR(LPDTSIR,A);                                            06444000
     END <<RESETLPDT>>;                                                 06446000
                                                                        06448000
     SUBROUTINE EXIT'(EXITYPE);                                         06450000
     VALUE EXITYPE; INTEGER EXITYPE;                                    06452000
     BEGIN                                                              06454000
          IF EXITYPE <> OKEXIT THEN                                     06456000
          BEGIN                                                         06458000
              CMASK := 0; <<FOR RESETLPDT>>                             06460000
              IF NOT HAVEMSIR THEN MSIR := GETSIR (MVTABSIR);           06462000
              IF HAVEMVTABNTRY THEN DEALLOCMVTABX (MVTABINDEX);         06464000
              IF MVTABLEUPDATED THEN MVTABLE (REMOVE,MVTABINDEX,        06466000
                                              DEVLIST,VMASK);           06468000
              IF USERTABLEUPDATE THEN                                   06470000
              BEGIN                                                     06472000
                  DELNAME;                                              06474000
                  RETINFO (1) := NAMEINFO1;                             06476000
                  RETINFO (2) := NAMEINFO2;                             06478000
                  IF REQTYPE<>OPREQ THEN                       <<01197>>06480000
                     USERTABLE(1,PIN,MVTABINDEX,RETINFO);      <<01197>>06482000
              END;                                                      06484000
              RELSIR (MVTABSIR,MSIR);                                   06486000
              IF HAVEDSIR THEN RELSIR (DIRSIR,DSIR);                    06488000
              IF LOGICALMOUNT THEN                                      06490000
              BEGIN                                                     06492000
                  DIRPARMS (0) := 0;; <<DEALLOCATE>>                    06494000
                  DIRPARMS (1) := 0;                                    06496000
                  DIRPARMS (2) := -1;                                   06498000
                  DIRPARMS (3) := FALSE;  <<ALWAYS RESET FLAG>>         06500000
                  DIRECSCAN (%40,0D,VSID (8),VSID (4),VSID,             06502000
                             PVRECIP,DIRPARMS);                         06504000
              END;                                                      06506000
              HAVEMSIR := FALSE;                                        06508000
              HAVEDSIR := FALSE;                                        06510000
              HAVEMVTABNTRY := FALSE;                                   06512000
              MVTABLEUPDATED := FALSE;                                  06514000
              USERTABLEUPDATE := FALSE;                                 06516000
          END;                                                          06518000
          IF HAVEMSIR THEN RELSIR (MVTABSIR,MSIR);                      06520000
          IF HAVEDSIR THEN RELSIR (DIRSIR,DSIR);                        06522000
          IF DRIVES'OBTAINED <> 0 THEN RESETLPDT;  <<RESET RESF>>       06524000
          CC:=IF EXITYPE = OKEXIT THEN CCE ELSE                         06526000
              IF EXITYPE = DUPMOUNT THEN CCG ELSE CCL;                  06528000
          IF EXITYPE = OKEXIT THEN  <<SET ACTUALLY MOUNTED>>            06530000
          BEGIN                                                         06532000
               <<NOTIFY OPERATOR OF MOUNT IF NECESSARY>>                06534000
               IF VMOUNT.AUTOF THEN  <<NO REPLY REQUIRED>>              06536000
               IF VMOUNT.ALLF THEN   <<LET OPERATOR KNOW>>              06538000
               IF REQTYPE <> OPREQ AND REQTYPE <> SYSREQ2 AND           06540000
                  REQTYPE <> SYSREQ3 THEN                               06542000
               IF NOT ALREADYMOUNTED THEN  <<FIRST TIME THIS USER>>     06544000
               BEGIN                                                    06546000
                    MOVE MSG:=SETNAME,(SETNAMELEN),2;                   06548000
                    MOVE * :="IN USE BY ",2;                            06550000
                    MOVE * :=USERACCT,(USERACCTLEN),2;                  06552000
                    MSGLEN:=TOS-@MSG;                                   06554000
                    MSG(MSGLEN):=0;  <<GENMSG STOP>>                    06556000
                    GENMSG(-1,@MSG,,,,,,,0);                            06558000
               END;                                                     06560000
               <<ADD LOG ENTRY FOR THE MOUNT>>                          06562000
               TMASK:=VMASK;  <<USE TEMPORARY MASK>>                    06564000
               I:=MVTABENT:=0;                                          06566000
               TOS:=0 CAT REQTYPE(12:13:3);                             06568000
               TOS:=PIN CAT USECOUNT(0:8:8);                            06570000
               WHILE TMASK <> 0 DO  <<LOG VOLUME ACTION>>               06572000
               BEGIN                                                    06574000
                    IF TMASK THEN  <<THIS VOLUME ASSOCIATED WITH USER>> 06576000
                    BEGIN                                               06578000
                         MVTABENT:=MVTABENT+1;                          06580000
                         DEV:=MVTABENT((I&LSL(1))+5).(0:8);             06582000
                         MVTABENT(MVTABENT):=DEV CAT                    06584000
                                             GETSUBTYPE(DEV)(0:8:8);    06586000
                    END;                                                06588000
                    I:=I+1;                                             06590000
                    TMASK:=TMASK & LSR(1);                              06592000
               END;                                                     06594000
               MVTABENT(MVTABENT+1):=0;                                 06596000
               MOVE MVTABENT(MVTABENT+2):=MVTABENT(MVTABENT+1),         06598000
                                          (MAXVOLNUM-MVTABENT);         06600000
               IF VCLASSDEF THEN  <<NEED REQUEST NAME>>                 06602000
               BEGIN                                                    06604000
                    MOVE VSIDB:=VSNAME,(8),2;                           06606000
                    MOVE * :=VSGROUP,(8),2;                             06608000
                    MOVE * :=VSACCNT,(8);                               06610000
               END;                                                     06612000
               LOG13(*,*,UGANAME,12,VSID,12,MVTABENT,MAXVOLNUM+1,       06614000
                     PVLMOUNT);                                         06616000
          END;                                                          06618000
          REQTYPE:=EXITYPE;                                             06620000
          IF PMAP.(14:1) AND  <<RELEVANT EXIT TYPE>>           <<00211>>06622000
          (EXITYPE = OKEXIT LOR EXITYPE = DUPMOUNT) THEN                06624000
          PVINFO:=VMASK CAT MVTABINDEX(4:12:4);                         06626000
          ASSEMBLE (EXIT 8);                                   <<00211>>06628000
     END <<EXIT'>>;                                                     06630000
                                                                        06632000
     SUBROUTINE CHECKVMOUNT;  << =VMOUNT CONSOLE MESSAGE >>             06634000
     BEGIN                                                              06636000
          VMOUNT:=VMOUNTINFO;                                           06638000
          IF NOT VMOUNT.ONF THEN <<REJECT ALL USER MOUNT REQUESTS>>     06640000
          IF REQTYPE <> OPREQ THEN  <<ITS A USER REQUEST>>              06642000
          BEGIN                                                         06644000
               IF VMOUNT.ALLF THEN                                      06646000
               BEGIN                                                    06648000
                    MSG(USERACCTLEN+31):=0;  <<GENMSG STOP>>            06650000
                    MOVE MSG:="MOUNT FOR ",2;                           06652000
                    MOVE * := USERACCT,(USERACCTLEN),2;                 06654000
                    MOVE * :="REJECTED (VMOUNT OFF)";                   06656000
                    GENMSG(-1,@MSG,,,,,,,0);                            06658000
               END;                                                     06660000
               EXIT'(VMOUNTOFF);                                        06662000
          END;                                                          06664000
     END <<CHECKVMOUNT>>;                                               06666000
                                                                        06668000
     SUBROUTINE FORMATNAMES;                                            06670000
     BEGIN                                                              06672000
          MOVE USERACCT := " ";                                         06674000
          MOVE USERACCT (1) := USERACCT, (17);                          06676000
          MOVE USERACCT := UGANAMEB, (8);                               06678000
          MOVE USERACCT := USERACCT WHILE AN, 1;                        06680000
          MOVE * := ".", 2;                                             06682000
          ASSEMBLE (DUP);                                               06684000
          MOVE * := UGANAMEB (16), (8);                                 06686000
          ASSEMBLE (DUP);                                               06688000
          MOVE * := * WHILE AN, 1;                                      06690000
          MOVE * := " ",2;                                              06692000
          USERACCTLEN:=TOS-@USERACCT;                                   06694000
          I:=-1;                                                        06696000
          TOS:=@SETNAME;                                                06698000
          MOVE MSG(8):=" ";  <<STOPPER>>                                06700000
          WHILE (I:=I+1) < 3 DO                                         06702000
          BEGIN                                                         06704000
               MOVE MSG:=VSIDB(I*8),(8);                                06706000
               MOVE * := MSG WHILE AN,1;                                06708000
               IF I < 2 THEN  <<NOT LAST NAME>>                         06710000
                  MOVE * :=".",2                                        06712000
               ELSE                                                     06714000
                  MOVE * :=" ",2;                                       06716000
          END;                                                          06718000
          SETNAMELEN:=TOS-@SETNAME;                                     06720000
     END <<FORMATNAMES>>;                                               06722000
                                                                        06724000
     LOGICAL SUBROUTINE VSETDOWNED;                                     06726000
     BEGIN                                                              06728000
          <<A VOLUME SET IS CONSIDERED DOWNED WHEN THE DEVICE           06730000
            ON WHICH ITS MASTER VOLUME RESIDES HAS BEEN DOWNED          06732000
            BY THE OPERATOR.                                            06734000
          >>                                                            06736000
          DEV:=MVTABENT(5).LDEVF;  <<MASTER VOLUME LDEV>>               06738000
          B := GETSIR (LDTSIR);                                         06740000
          GETABENTRY(LDTDST,DEV,LDTENT);                                06742000
          RELSIR (LDTSIR,B);                                            06744000
          VSETDOWNED:=(LDTENT(3).(2:3) <> %4);                          06746000
     END <<VSETDOWNED>>;                                                06748000
                                                                        06750000
     SUBROUTINE BUILDDEVLIST;                                           06752000
     BEGIN                                                              06754000
          TMASK:=0;  <<SET ALL MASK BITS OFF>>                          06756000
          PMOUNTREQD:=FALSE;  <<ASSUME NO PHYSICAL MOUNTS>>             06758000
          TOS:=VMASK:=VSDEFN(VDINFO).VOLMASK;  <<FULL SET MASK>>        06760000
          DEVLIST:=VMASK;                                               06762000
          IF NEWUSEROFSET OR OLDUSEROFSET THEN                          06764000
          BEGIN  <<SOME MEMBERS ALREADY MOUNTED>>                       06766000
               I:=0;                                                    06768000
               GETMVTABENTRY(MVTABINDEX,MVTABENT);                      06770000
               FOR I:=0 UNTIL INTEGER(MVTABENT(1).HVOLF) DO             06772000
               IF MVTABENTD(I) <> 0D THEN  <<THIS VOL IS MOUNTED>>      06774000
               TMASK:=TMASK LOR (1 & LSL(I));                           06776000
               IF (TMASK LAND DOWNMASK) <> 0 THEN                       06778000
               BEGIN                                                    06780000
                    TOS:=IF DOWNMASK = VMASK THEN DOWNSET ELSE          06782000
                         DOWNVOL;                                       06784000
                    EXIT'(*);                                           06786000
               END;                                                     06788000
               MMASK := TMASK; <<WERE ALREADY MOUNTED>>                 06790000
          END;                                                          06792000
          DEVLIST(1):=VSDEFN(VDINFO).NUMVOL;                            06794000
          FOR I:=2 UNTIL (MAXVOLNUM+1) DO                               06796000
          BEGIN                                                         06798000
               IF VMASK THEN  <<THIS VOLUME SHOULD BE MOUNTED>>         06800000
               IF TMASK THEN  <<VOLUME ALREADY MOUNTED>>                06802000
               BEGIN                                                    06804000
                    DEVLIST(I):=MVTABENT(((I-2)&LSL(1))+5).LDEVF;       06806000
                    DEVLIST:=DEVLIST LAND NOT (1 & LSL(I-2));           06808000
               END ELSE                                                 06810000
               BEGIN                                                    06812000
                    PMOUNTREQD:=TRUE;  <<AT LEAST ONE PHYS. MOUNT>>     06814000
                    DEVLIST(I):=%100000 CAT                             06816000
                                VSDEFN(((I-1)*VDVENTSIZE)+5)(1:1:7);    06818000
               END ELSE DEVLIST(I):=0;  <<VOLUME NEED NOT BE MOUNTED>>  06820000
               VMASK:=VMASK & LSR(1);                                   06822000
               TMASK:=TMASK & LSR(1);                                   06824000
          END;                                                          06826000
          VMASK:=TOS;  <<FULL VOLUME MASK>>                             06828000
     END <<BUILDDEVLIST>>;                                              06830000
                                                                        06832000
     SUBROUTINE ADDNAME;                                                06834000
     BEGIN                                                              06836000
          I := 0;                                                       06838000
          TYPE:=REQTYPE;  << SAVE Q-RELATIVE >>                         06840000
          DUPNAME:=FALSE;                                               06842000
          IF NOT BIND THEN RETURN;                                      06844000
          MOVE NAMEQB:=VSGROUP,(8),2;                                   06846000
          MOVE   *  :=VSACCNT,(8);                                      06848000
          IF NAMECOUNT = 0 THEN                                         06850000
          BEGIN                                                         06852000
               IF (NAMEDST := GETDATASEG (NAMESEGLN'INIT,               06854000
                   MAXNAMESEGLN'INIT)) = 0 THEN                         06856000
               EXIT'(DSEGERR);                                          06858000
          END;                                                          06860000
          DST:=EXCHANGEDB(NAMEDST);                                     06862000
          IF NAMECOUNT = 0 THEN  <<ZERO SEGMENT>>                       06864000
          BEGIN                                                         06866000
               NAMESEG:=0;                                              06868000
               MOVE NAMESEG (1) := NAMESEG,(NAMESEGLN'INIT-1);          06870000
               MAXNAMESEGLN := MAXNAMESEGLN'INIT;                       06872000
               CURRNAMESEGLN := NAMESEGLN'INIT;                         06874000
          END;                                                          06876000
          WHILE (I:=I+1) <= INTEGER (NAMECOUNT) DO                      06878000
          BEGIN                                                         06880000
               LOC:=I * NAMENTSIZE;                                     06882000
               IF COMPNAME THEN                                         06884000
               BEGIN                                                    06886000
                    DUPNAME:=TRUE;                                      06888000
                    I:=NAMECOUNT+1;  <<STOP LOOP>>                      06890000
               END;                                                     06892000
          END;                                                          06894000
          IF DUPNAME THEN                                               06896000
$IF X3=ON                                                               06898000
           IF TYPE = USERREQ1 THEN                                      06900000
           BEGIN                                                        06902000
                EXCHANGEDB(DST);                                        06904000
                EXIT'(DUPBIND);                                         06906000
           END ELSE                                                     06908000
$IF                                                                     06910000
          ELSE                                                          06912000
          BEGIN <<NOT DUPNAME>>                                         06914000
              WHILE (NAMECOUNT+1) >                                     06916000
                    ((CURRNAMESEGLN/NAMENTSIZE)-1) DO                   06918000
              BEGIN <<NEED TO EXPAND SEGMENT>>                          06920000
                  IF (CURRNAMESEGLN+NAMENTSIZE) >=                      06922000
                     MAXNAMESEGLN THEN EXIT' (NOROOM);                  06924000
                  I := ALTDSEGSIZE (NAMEDST,NAMESEGLN'INCR);            06926000
                  IF <> THEN                                            06928000
                  BEGIN  <<FAILURE OF SOME KIND>>                       06930000
                      TOS := IF CCG THEN NOROOM ELSE DSEGERR;           06932000
                      EXCHANGEDB (DST);                                 06934000
                      EXIT' (*);                                        06936000
                  END;                                                  06938000
                  NAMESEG (CURRNAMESEGLN) := 0;                         06940000
                  MOVE NAMESEG (CURRNAMESEGLN+1) :=                     06942000
                       NAMESEG (CURRNAMESEGLN),                         06944000
                       ((I-CURRNAMESEGLN)-1);                           06946000
                  CURRNAMESEGLN := I; <<NEW SEGMENT SIZE>>              06948000
              END;                                                      06950000
              NAMECOUNT:=NAMECOUNT+1;                                   06952000
              NAMESEG (LOC:=NAMECOUNT*NAMENTSIZE) := 0;                 06954000
              MOVENAME;  <<FROM Q-REL.>>                                06956000
          END;                                                          06958000
          NAMESEG(LOC):=NAMESEG(LOC)+1;                                 06960000
          EXCHANGEDB(DST);                                              06962000
     END <<ADDNAME>>;                                                   06964000
                                                                        06966000
                                                                        06968000
                                                                        06970000
     PUSH(STATUS);                                                      06972000
     TOS.(2:1):=0;  <<RESET USER TRAPS - AVOID ATTACHIO PROBLEMS>>      06974000
     SET(STATUS);                                                       06976000
                                                                        06978000
     DEVLIST(1):=0;  << DRIVES'OBTAINED = 0 >>                          06980000
     MOVE UMASK' (-3):=UMASK'PB,(8); <<SET UP USERTABLE MASK>>          06982000
     @VSNAMEW := @VSNAME & LSR (1);                                     06984000
     @VSGROUPW := @VSGROUP & LSR (1);                                   06986000
     @VSACCNTW := @VSACCNT & LSR (1);                                   06988000
     GETJITINFO(REQTYPE,JITINFO,UGANAME,UGANAME(4),UGANAME(8));         06990000
     PIN:=IF REQTYPE = OPREQ THEN 0 ELSE                                06992000
           IF PMAP THEN DIFFERENT'PIN ELSE                     <<00211>>06994000
            CURRPIN;  <<THIS PROCESS' PIN>>                    <<00776>>06996000
     BIND := (REQTYPE = SYSREQ1 LOR REQTYPE = SYSREQ3 LOR               06998000
              REQTYPE = USERREQ1);                                      07000000
     IF VSNAME = "* " THEN  <<MOUNT HOME VOLUME SET>>                   07002000
     BEGIN                                                              07004000
          RETINFOD:=DIRECFIND (%10,0D,VSACCNTW,VSGROUPW,                07006000
                               VSNAMEW,DIRENT);                         07008000
          IF <> THEN                                                    07010000
          BEGIN                                                         07012000
               TOS:=IF RETINFO(1) = 2 THEN (RETINFO+NOHVSET)            07014000
                    ELSE DIRECERR;                                      07016000
               EXIT'(*);                                                07018000
          END;                                                          07020000
          IF DIRENTB(68) <> "  " THEN                                   07022000
          BEGIN                                                         07024000
               MOVE VSIDB:=DIRENTB(68),(8),2;                           07026000
               MOVE * :=DIRENTB(60),(8),2;                              07028000
               MOVE * :=DIRENTB(52),(8);                                07030000
          END ELSE                                                      07032000
          EXIT'(NOHVSET);                                               07034000
          IF UGANAMEB(16) = VSACCNT,(8) THEN                            07036000
          IF UGANAMEB(8) = VSGROUP,(8) THEN                             07038000
          BEGIN                                                         07040000
               BINDJIT:=(REQTYPE=USERREQ1);                             07042000
          END;                                                          07044000
     END ELSE                                                           07046000
     BEGIN                                                              07048000
          MOVE VSIDB:=VSNAME,(8),2;                                     07050000
          MOVE * :=VSGROUP,(8),2;                                       07052000
          MOVE * :=VSACCNT,(8);                                         07054000
     END;                                                               07056000
     MOVE ORIGVSID := VSID, (12); <<PRESERVE IT>>                       07058000
     FORMATNAMES;                                                       07060000
     CHECKVMOUNT;                                                       07062000
     UMASK:=UMASK'(REQTYPE);                                            07064000
     DO BEGIN                                                           07066000
            DSIR := GETSIR (DIRSIR);                                    07068000
            HAVEDSIR := TRUE;                                           07070000
            MSIR := GETSIR (MVTABSIR);                                  07072000
            HAVEMSIR := TRUE;                                           07074000
            GETVSDEFN (VSID,VSDEFN,VSDEF,I);                            07076000
            IF <> THEN EXIT' (I);                                       07078000
            IF VSDEFN (VDMISC).INITALLOCF THEN                          07080000
            BEGIN <<BEING ALLOCATED BY SOMEONE FOR 1ST TIME>>           07082000
                RELSIR (MVTABSIR,MSIR);                                 07084000
                HAVEMSIR := FALSE;                                      07086000
                RELSIR (DIRSIR,DSIR);                                   07088000
                HAVEDSIR := FALSE;                                      07090000
                IF REQTYPE = OPREQ THEN                                 07092000
                BEGIN                                                   07094000
                    MOVE MSG :=                                         07096000
                ("OPERATOR MOUNT REJECTED (OPERATOR CANNOT WAIT)",0);   07098000
                    GENMSG (-1,@MSG,,,,,,,0);                           07100000
                    EXIT' (OPCAN'WAIT);                                 07102000
                END;                                                    07104000
                DELAY (1000D);                                          07106000
                MOVE VSID := ORIGVSID, (12); <<RE-INITIALIZE>>          07108000
            END;                                                        07110000
        END UNTIL NOT VSDEFN (VDMISC).INITALLOCF;                       07112000
     IF (MVTABINDEX := VSDEFN (VDMISC).MVTABXF) = 0 THEN                07114000
     BEGIN <<NEED TO ALLOCATE A MVTAB ENTRY>>                           07116000
         IF (MVTABINDEX:=ALLOCMVTABX)=0 THEN EXIT' (MVTABERR);          07118000
         HAVEMVTABNTRY := TRUE;                                         07120000
         FIRSTUSEROFSET := DIRPARMS (3) := TRUE;                        07122000
         BUILDDEVLIST;                                                  07124000
     END ELSE                                                           07126000
     BEGIN <<VOLUME SET DEFINITION IN-USE>>                             07128000
         NEWUSEROFSET := TRUE;                                          07130000
         OLDUSEROFSET := TRUE;                                          07132000
         BUILDDEVLIST;                                                  07134000
         DIRPARMS (3) := FALSE;                                         07136000
         URET:=USERTABLE(4,PIN,MVTABINDEX,RETINFO);            <<01106>>07138000
         IF <> THEN                                                     07140000
          IF < THEN EXIT' (MVTABERR)                                    07142000
          ELSE                                                          07144000
          BEGIN                                                         07146000
              OLDUSEROFSET := FALSE;                                    07148000
              <<MARK ENTRY AS IN USE TO PREVENT DISMOUNT>>     <<01500>>07150000
              MVTABLE(PRESERVE,MVTABINDEX,DEVLIST,             <<01500>>07152000
                     (VMASK LAND MMASK));                      <<01500>>07154000
              MVTABLEUPDATED := TRUE;                                   07156000
              NAMEINFO := 0D;                                           07158000
          END                                                           07160000
         ELSE                                                           07162000
         BEGIN                                                          07164000
             NEWUSEROFSET := FALSE;                                     07166000
             IF RETINFO.(0:8) <> VMASK THEN EXIT' (DIFFCLASS);          07168000
             TOS := RETINFO (5);                                        07170000
             TOS := RETINFO (6);                                        07172000
             NAMEINFO := TOS;                                           07174000
         END;                                                           07176000
         ADDNAME;                                                       07178000
         RETINFO := UMASK;                                              07180000
         RETINFO (1) := NAMEINFO1;  RETINFO (2) := NAMEINFO2;           07182000
         URET:=USERTABLE(0,(PIN CAT VMASK (0:8:8)),MVTABINDEX, <<01106>>07184000
                      RETINFO);                                <<01106>>07186000
         IF <> THEN                                                     07188000
         BEGIN                                                          07190000
             DELNAME;                                                   07192000
             EXIT' (URET);                                     <<01106>>07194000
         END;                                                           07196000
         USERTABLEUPDATE := TRUE;                                       07198000
     END;                                                               07200000
     IF NOT OLDUSEROFSET THEN                                           07202000
     BEGIN <<UPDATE REF COUNT ONCE PER USER>>                           07204000
         DIRPARMS (0) := 1;  <<ALLOCATE VSDEFN>>                        07206000
         DIRPARMS (1) := MVTABINDEX;                                    07208000
         DIRPARMS (2) := 1; <<INCR VSDEFN REFERENCE COUNT>>             07210000
         DIRECSCAN (%40,0D,VSID (8),VSID (4),VSID,                      07212000
                    PVRECIP,DIRPARMS);                                  07214000
         IF <> THEN EXIT' (DIRECERR);                                   07216000
         LOGICALMOUNT := TRUE;                                          07218000
     END;                                                               07220000
     RELSIR (MVTABSIR,MSIR);                                            07222000
     HAVEMSIR := FALSE;                                                 07224000
     RELSIR (DIRSIR,DSIR);                                              07226000
     HAVEDSIR := FALSE;                                                 07228000
     WHILE NOT MOUNTED DO  <<CHECK FOR CORRECT PHYSICAL MOUNT>>         07230000
     BEGIN                                                              07232000
          IF NOT FIRSTIMETHRU THEN RESETLPDT;                           07234000
          GENX:=IF GEN < 0 THEN GENX ELSE GEN;                          07236000
          MOUNTED:=IF NOT PMOUNTREQD THEN TRUE ELSE                     07238000
                   PMOUNTED(VSID,VSDEFN,DEVLIST,GENX);                  07240000
          IF MOUNTED THEN  <<ENTIRE SET PHYSICALLY MOUNTED>>            07242000
          BEGIN                                                         07244000
               IF NOT FIRSTUSEROFSET THEN                               07246000
               BEGIN                                                    07248000
                    IF VSETDOWNED THEN EXIT'(DOWNSET);                  07250000
                    IF OLDUSEROFSET THEN                                07252000
                    BEGIN <<OLD USER OF SET>>                           07254000
                         ALREADYMOUNTED:=TRUE;                          07256000
                         IF DUPNAME THEN                                07258000
                         BEGIN                                          07260000
                              IF REQTYPE = OPREQ                        07262000
$IF X3=ON                                                               07264000
                              OR (USERREQ1<=REQTYPE<=USERREQ2)          07266000
$IF                                                                     07268000
                              THEN                                      07270000
                              BEGIN                                     07272000
                                   DELNAME;                             07274000
                                   EXIT'(DUPMOUNT);                     07276000
                              END;                                      07278000
                         END;                                           07280000
                         IF REQTYPE = SYSREQ2 OR                        07282000
                            REQTYPE = SYSREQ4 OR                        07284000
                            REQTYPE = USERREQ2 THEN EXIT'(OKEXIT);      07286000
                      << TOS:=REQSTATUS(DEVLIST(2).(0:8));>>   <<01628>>07288000
                      << IF TOS.(9:1) = 1 >>                   <<01628>>07290000
                      <<    THEN EXIT'(DEVERR10); >>           <<01628>>07292000
                         RETINFOD:=DIRECBIND (%10,0D,VSACCNTW,          07294000
                                      VSGROUPW,I,MVTABINDEX);           07296000
                         IF <> THEN                                     07298000
                         BEGIN                                          07300000
                              TOS:=IF RETINFO(1) = 2 THEN               07302000
                                   IF INTEGER (RETINFO) < 0 THEN        07304000
                                      (NOHACCNT-RETINFO)                07306000
                                   ELSE                                 07308000
                                      (RETINFO+NOHVSET)                 07310000
                                   ELSE                                 07312000
                                      DIRECERR;                         07314000
                              EXIT'(*);                                 07316000
                         END;                                           07318000
                         IF BINDJIT THEN JITBIND(MVTABINDEX,I);         07320000
                         EXIT'(OKEXIT);                                 07322000
                    END;                                                07324000
                    IF GEN >= 0 THEN  <<GEN SPECIFIED>>                 07326000
                       IF GEN <> INTEGER(MVTABENT(4)) THEN  <<MISMATCH>>07328000
                          EXIT'(WRONGEN);  <<BAD GEN ON LOGICAL MOUNT>> 07330000
               END;                                                     07332000
               IF FIRSTACCESSMSG THEN                                   07334000
               IF NOT AUTOMOUNT THEN  <<OP REPLY REQUIRED>>             07336000
               IF REQTYPE <> OPREQ THEN  <<USER MOUNT REQUEST>>         07338000
               BEGIN                                                    07340000
                    I:=0;                                               07342000
                    MOVE MSG:="ACCESS TO ",2;                           07344000
                    MOVE * :=SETNAME,(SETNAMELEN),2;                    07346000
                    MOVE * :="BY ",2;                                   07348000
                    MOVE * :=USERACCT,(USERACCTLEN),2;                  07350000
                    MOVE * :=" (Y/N)?",2;                               07352000
                    MSGLEN:=TOS-@MSG;                                   07354000
                    MSG(MSGLEN):=0;  <<GENMSG STOP>>                    07356000
                    GENMSG(-1,@MSG,,,,,,,0,%1,@REPLY);                  07358000
                    IF NOT REPLY THEN  <<OPERATOR REJECTED>>            07360000
                    BEGIN                                               07362000
                         EXIT'(OPREJECT);                               07364000
                    END;                                                07366000
               END;                                                     07368000
               FIRSTACCESSMSG:=FALSE;                                   07370000
          END ELSE  <<ENTIRE SET NOT PHYSICALLY MOUNTED>>               07372000
          BEGIN                                                         07374000
               IF VMOUNTINFO.AUTOF OR  <<DON'T BOTHER OPERATOR>>        07376000
               REQTYPE = SYSREQ2 OR REQTYPE = SYSREQ3 OR                07378000
               REQTYPE = OPREQ THEN                                     07380000
               BEGIN                                                    07382000
                    IF VMOUNT.ALLF THEN  <<OP WANTS TO KNOW>>           07384000
                    IF NOT (SYSREQ2<=REQTYPE<=OPREQ) THEN  <<TELL OP>>  07386000
                    BEGIN                                               07388000
                         MSG(USERACCTLEN+31):=0;  <<GENMSG STOP>>       07390000
                         MOVE MSG:="MOUNT FOR ",2;                      07392000
                         MOVE * := USERACCT,(USERACCTLEN),2;            07394000
                         MOVE * :="REJECTED (SET ABSENT)";              07396000
                         GENMSG(-1,@MSG,,,,,,,0);                       07398000
                    END;                                                07400000
                    EXIT'(NOTMOUNTED);  <<AUTO REJECT>>                 07402000
               END;                                                     07404000
               IF AVAILABLE(SETNAME,SETNAMELEN,DEVLIST) THEN            07406000
               IF DRIVES'NEEDED = DRIVES'OBTAINED THEN  <<FOUND ENOUGH>>07408000
               BEGIN                                                    07410000
                    I:=0;                                               07412000
                    MOVE MSG:="MOUNT ",2;                               07414000
                    MOVE * :=SETNAME,(SETNAMELEN),2;                    07416000
                    IF GENX > 0 THEN                                    07418000
                    BEGIN                                               07420000
                         MOVE * :="(",2;                                07422000
                         TOS:=ASCII(GENX,10,BPS0);                      07424000
                         ASSEMBLE(ADD);                                 07426000
                         MOVE * :=") ",2;                               07428000
                    END;                                                07430000
                    MOVE * :="ON LDEV# ",2;                             07432000
                    MSGLEN:=LOC:=TOS-@MSG;                              07434000
                    FOR I:=2 UNTIL (MAXVOLNUM+1) DO                     07436000
                    IF DEVLIST(I).(8:8) <> 0 THEN  <<MOUNT ON IT>>      07438000
                    BEGIN                                               07440000
                         LEN:=ASCII(DEVLIST(I).(8:8),10,MSG(LOC));      07442000
                         MSG(LOC+LEN):=",";                             07444000
                         LOC:=LOC+(LEN:=LEN+1);                         07446000
                         MSGLEN:=MSGLEN+LEN;                            07448000
                    END;                                                07450000
                    MOVE MSG(MSGLEN-1):=" (Y/N)?",2;                    07452000
                    MSGLEN:=TOS-@MSG;                                   07454000
                    MSG(MSGLEN):=0;  <<GENMSG STOP>>                    07456000
                    GENMSG(-1,@MSG,,,,,,,0,%1,@REPLY);                  07458000
                    IF NOT REPLY THEN  <<OPERATOR REJECTED>>            07460000
                    BEGIN                                               07462000
                         EXIT'(OPREJECT);                               07464000
                    END;                                                07466000
               END ELSE ELSE                                            07468000
               EXIT'(NOTAVAIL);                                         07470000
          END;                                                          07472000
          FIRSTIMETHRU:=FALSE;                                          07474000
     END;                                                               07476000
     DSIR := GETSIR (DIRSIR);                                           07478000
     HAVEDSIR := TRUE;                                                  07480000
     MSIR:=GETSIR(MVTABSIR);                                            07482000
     HAVEMSIR := TRUE;                                                  07484000
     IF FIRSTUSEROFSET THEN                                             07486000
     BEGIN                                                              07488000
         I := -MVTABINDEX;                                              07490000
         MVTABLE (ADD,I,DEVLIST,VMASK,RETINFO);                         07492000
         IF <> THEN EXIT'(MVTABERR);                                    07494000
         MVTABLEUPDATED := TRUE;                                        07496000
         HAVEMVTABNTRY := FALSE;                                        07498000
         CMASK := RETINFO.(0:8);  <<MASK OF NEW VOLUMES ADDED>>         07500000
         USECOUNT := RETINFO.(8:8);  <<NUMBER OF USERS OF SET>>         07502000
         NAMEINFO := 0D;                                                07504000
         ADDNAME;                                                       07506000
         RETINFO := UMASK;                                              07508000
         RETINFO (1) := NAMEINFO1;  RETINFO (2) := NAMEINFO2;           07510000
         URET:=USERTABLE(0,(PIN CAT VMASK (0:8:8)),MVTABINDEX, <<01106>>07512000
                      RETINFO);                                <<01106>>07514000
         IF <> THEN                                                     07516000
         BEGIN                                                          07518000
             DELNAME;                                                   07520000
             EXIT' (URET);                                     <<01106>>07522000
         END;                                                           07524000
         USERTABLEUPDATE := TRUE;                                       07526000
         DIRPARMS (0) := 1;  <<ALLOCATE VSDEFN>>                        07528000
         DIRPARMS (1) := MVTABINDEX;                                    07530000
         DIRPARMS (2) := 0; <<PSEUDO REF COUNT INCR>>                   07532000
         DIRPARMS (3) := FALSE;                                         07534000
         DIRECSCAN (%40,0D,VSID (8),VSID (4),VSID,                      07536000
                    PVRECIP,DIRPARMS);                                  07538000
         IF <> THEN                                                     07540000
         BEGIN                                                          07542000
             DELNAME;                                                   07544000
             EXIT' (DIRECERR);                                          07546000
         END;                                                           07548000
         FIRSTUSEROFSET := FALSE;                                       07550000
     END ELSE                                                           07552000
     BEGIN <<NEWUSEROFSET>>                                             07554000
         MVTABLE(ADD,MVTABINDEX,DEVLIST,                       <<01500>>07556000
                (VMASK LAND NOT MMASK), RETINFO);              <<01500>>07558000
         IF <> THEN                                                     07560000
         BEGIN                                                          07562000
             MVTABLE (REMOVE,MVTABINDEX,DEVLIST,0);                     07564000
             MVTABLEUPDATED := FALSE;                                   07566000
             EXIT' (MVTABERR);                                          07568000
         END;                                                           07570000
         CMASK := RETINFO.(0:8);  <<MASK OF NEW VOLUMES ADDED>>         07572000
         USECOUNT := RETINFO.(8:8);  <<NUMBER OF USERS OF SET>>         07574000
     END;                                                               07576000
     IF BIND THEN  <<BIND SYSTEM AND VS DIRECTORIES>>                   07578000
     BEGIN                                                              07580000
       << TOS:=REQSTATUS(DEVLIST(2).(0:8)); >>                 <<01628>>07582000
       << IF TOS.(9:1) = 1 >>                                  <<01628>>07584000
       <<    THEN EXIT'(DEVERR10); >>                          <<01628>>07586000
          RETINFOD:=DIRECBIND (%10,0D,VSACCNTW,VSGROUPW,                07588000
                              I,MVTABINDEX);                            07590000
          IF <> THEN                                                    07592000
          BEGIN                                                         07594000
               TOS:=IF RETINFO(1) = 2 THEN                              07596000
                    IF INTEGER (RETINFO) < 0 THEN                       07598000
                       (NOHACCNT-RETINFO)                               07600000
                    ELSE                                                07602000
                       (RETINFO+NOHVSET)                                07604000
                    ELSE                                                07606000
                       DIRECERR;                                        07608000
               EXIT'(*);                                                07610000
          END;                                                          07612000
          IF BINDJIT THEN JITBIND(MVTABINDEX,I);                        07614000
     END;                                                               07616000
     GETMVTABENTRY(MVTABINDEX,MVTABENT);                                07618000
     RELSIR(MVTABSIR,MSIR);                                             07620000
     HAVEMSIR := FALSE;                                                 07622000
     RELSIR (DIRSIR,DSIR);                                              07624000
     HAVEDSIR := FALSE;                                                 07626000
     EXIT'(OKEXIT);                                                     07628000
END << MOUNT >>;                                                        07630000
                                                                        07632000
$PAGE "PVSYS - DISMOUNT PROCEDURE"                                      07634000
                                                                        07636000
$CONTROL SEGMENT = PVSYSD                                               07638000
PROCEDURE DISMOUNT (VSNAME,VSGROUP,VSACCNT,REQTYPE,            <<00211>>07640000
                    PVINFO,DIFFERENT'PIN);                     <<00211>>07642000
VALUE PVINFO,DIFFERENT'PIN;                                    <<00211>>07644000
INTEGER REQTYPE,PVINFO,DIFFERENT'PIN;                          <<00211>>07646000
BYTE ARRAY VSNAME,VSGROUP,VSACCNT;                                      07648000
OPTION VARIABLE;                                                        07650000
OPTION PRIVILEGED,UNCALLABLE;                                           07652000
BEGIN                                                                   07654000
     LOGICAL PMAP = Q-4;  <<OPTIONAL PARAMETERS MAP>>                   07656000
     DOUBLE NAMEINFO;                                                   07658000
     LOGICAL MSIR := 3, DSIR := 3;                                      07660000
     INTEGER I,N,PIN,DEV,DST,LEN,LOC,JITINFO,USECOUNT,URET,    <<01106>>07662000
             NAMEINFO1 = NAMEINFO,                                      07664000
             NAMEINFO2 = NAMEINFO1+1,                                   07666000
             BINDCOUNT,MVTABINDEX;                                      07668000
     LOGICAL A,B,DUPNAME,MORENAMES,UNBINDIT;                   <<00174>>07670000
                                                                        07672000
     LOGICAL UMASK:=0,                                                  07674000
             RESOURCES := FALSE;                                        07676000
     DEFINE                                                             07678000
         HAVEDSIR              = RESOURCES.(15:1) #,                    07680000
         HAVEMSIR              = RESOURCES.(14:1) #;                    07682000
     DEFINE                                                             07684000
          USERREQ  = UMASK.(12:1)#,                                     07686000
          USERBIND = UMASK.(13:1)#,                                     07688000
          SYSREQ   = UMASK.(14:1)#,                                     07690000
          SYSBIND  = UMASK.(15:1)#;                                     07692000
     LOGICAL ARRAY UMASK'(-3:5);                                        07694000
     LOGICAL ARRAY UMASK'PB(*)=PB:=                                     07696000
          %03,  <<SYSTEM DISMOUNT (CONDITIONAL) - BINDING>>             07698000
          %02,  <<SYSTEM DISMOUNT - NO BINDING               >>         07700000
          %00,  <<UNUSED>>                                              07702000
          %14,  <<USER DISMOUNT - BINDING       >>                      07704000
          %10,  <<USER DISMOUNT - NO BINDING    >>                      07706000
          %03,  <<SYSTEM DISMOUNT - BINDING     >>                      07708000
          %02,  <<SYSTEM DISMOUNT - NO BINDING  >>                      07710000
          %00,  <<OPERATOR DISMOUNT - NO BINDING>>                      07712000
          %17;  <<MORGUE DISMOUNT (:BYE)        >>                      07714000
                                                                        07716000
     LOGICAL CMASK:=0,TMASK:=0,VMASK:=0,VSDEF:=0;                       07718000
     ARRAY                                                     <<00174>>07720000
         LDTENT (0:4);                                         <<00174>>07722000
     ARRAY RETINFO (0:PVENTSIZE-1) = Q;                                 07724000
     DOUBLE RETINFOD = RETINFO;                                         07726000
     ARRAY DIRENT(0:39);                                                07728000
     BYTE ARRAY DIRENTB(*) = DIRENT;                                    07730000
     ARRAY VTABENT(*)  = DIRENT;                                        07732000
     ARRAY DIRPARMS(*) = DIRENT;                                        07734000
     ARRAY VSDEFN(0:VDSENTSIZE);                                        07736000
     ARRAY MVTABENT(*) = VSDEFN;                                        07738000
     DOUBLE ARRAY MVTABENTD(*) = MVTABENT(5);                           07740000
     ARRAY NAMEQ(0:7) = Q;                                              07742000
     BYTE ARRAY NAMEQB(*) = NAMEQ;                                      07744000
     ARRAY NAMESEG(*) = DB+0;                                           07746000
     ARRAY UGANAME(0:11);  <<USER/GROUP/ACCOUNT NAME>>                  07748000
     BYTE ARRAY UGANAMEB(*) = UGANAME;                                  07750000
     BYTE ARRAY SETNAME(0:27);                                          07752000
     BYTE ARRAY MSG(0:72);                                              07754000
     ARRAY VSID(0:11);                                                  07756000
     BYTE ARRAY VSIDB(*) = VSID;                                        07758000
     ARRAY                                                              07760000
         VSNAMEW (*),                                                   07762000
         VSGROUPW (*),                                                  07764000
         VSACCNTW (*);                                                  07766000
     DEFINE                                                    <<00174>>07768000
         FILE'USECOUNT  = LDTENT (0) #,                        <<00174>>07770000
         NOT'DOWNED     = LDTENT (3).(2:1) #,                  <<00174>>07772000
         DOWN'PENDING   = LDTENT (3).(4:1) #;                  <<00174>>07774000
                                                                        07776000
     DEFINE                                                             07778000
          MVTABX  = PVINFO.(4:4)#,                                      07780000
          VMASKX  = PVINFO.(8:8)#;                                      07782000
                                                                        07784000
     DEFINE                                                             07786000
          VCLASSDEF = NOT VSDEF#;                                       07788000
     DEFINE  << NAMEINFO FIELDS >>                                      07790000
          NAMECOUNT = NAMEINFO1 #,                                      07792000
          NAMEDST   = NAMEINFO2 #;                                      07794000
                                                                        07796000
     SUBROUTINE EXIT'(EXITYPE);                                         07798000
     VALUE EXITYPE; INTEGER EXITYPE;                                    07800000
     BEGIN                                                              07802000
          CC:=IF EXITYPE = OKEXIT THEN CCE ELSE CCL;                    07804000
          IF EXITYPE = OKEXIT THEN                                      07806000
          BEGIN                                                         07808000
               IF CMASK <> 0 THEN  <<SOME VOLUMES WERE DISMOUNTED>>     07810000
               BEGIN                                                    07812000
                    I:=0;                                               07814000
                    TMASK:=CMASK;                                       07816000
                    B := GETSIR (LDTSIR);                      <<00174>>07818000
                    A:=GETSIR(LPDTSIR);                                 07820000
                    WHILE TMASK <> 0 DO                                 07822000
                    BEGIN                                               07824000
                         IF TMASK THEN  <<VOLUME WAS DISMOUNTED>>       07826000
                         BEGIN                                          07828000
                              TOS:=MVTABENT((I&LSL(1))+5).LDEVF;        07830000
                              IF (DEV:=TOS) <> 0 THEN                   07832000
                              LPDT((DEV & LSL(1))+1).MNTF:=0;           07834000
                              GETABENTRY (LDTDST,DEV,LDTENT);  <<00174>>07836000
                              IF DOWN'PENDING THEN             <<00174>>07838000
                               IF FILE'USECOUNT = 0 THEN       <<00174>>07840000
                               BEGIN                           <<00174>>07842000
                                   NOT'DOWNED := FALSE;        <<00174>>07844000
                                   DOWN'PENDING := FALSE;      <<00174>>07846000
                                   PUTABENTRY (LDTDST,         <<00174>>07848000
                                               DEV,LDTENT);    <<00174>>07850000
                                                               <<03504>>07852000
                                   << Deallocate and delete >> <<03504>>07854000
                                   << disc free space data  >> <<03504>>07856000
                                   << seg, ignore errors.   >> <<03504>>07858000
                                                               <<03504>>07860000
                                   Deallocate'Dfs'Data'Seg     <<03504>>07862000
                                          (dev);               <<03504>>07864000
                                   Delete'Dfs'Data'Seg (dev);  <<03504>>07866000
                                                               <<03504>>07868000
                                   GENMSG (1,250,              <<00174>>07870000
                                           %10000,DEV,,,,,0);  <<00174>>07872000
                               END;                            <<00174>>07874000
                         END;                                           07876000
                         I:=I+1;                                        07878000
                         TMASK:=TMASK & LSR(1);                         07880000
                    END;                                                07882000
                    RELSIR(LPDTSIR,A);                                  07884000
                    RELSIR (LDTSIR,B);                         <<00174>>07886000
               END;                                                     07888000
               RELSIR (MVTABSIR,MSIR);                                  07890000
               HAVEMSIR := FALSE;                                       07892000
               RELSIR (DIRSIR,DSIR);                                    07894000
               HAVEDSIR := FALSE;                                       07896000
               I:=MVTABENT:=0;                                          07898000
               TOS:=1 CAT REQTYPE(12:13:3);                             07900000
               TOS:=PIN CAT USECOUNT(0:8:8);                            07902000
               WHILE VMASK <> 0 DO  <<LOG VOLUME ACTION>>               07904000
               BEGIN                                                    07906000
                    IF VMASK THEN  <<THIS VOLUME DISASSOCIATED>>        07908000
                    BEGIN                                               07910000
                         MVTABENT:=MVTABENT+1;                          07912000
                         DEV:=MVTABENT((I&LSL(1))+5).(0:8);             07914000
                         MVTABENT(MVTABENT):=DEV CAT                    07916000
                                             GETSUBTYPE(DEV)(0:8:8);    07918000
                    END;                                                07920000
                    I:=I+1;                                             07922000
                    VMASK:=VMASK & LSR(1);                              07924000
               END;                                                     07926000
               MVTABENT(MVTABENT+1):=0;                                 07928000
               MOVE MVTABENT(MVTABENT+2):=MVTABENT(MVTABENT+1),         07930000
                                          (MAXVOLNUM-MVTABENT);         07932000
               IF VCLASSDEF THEN  <<NEED REQUEST NAME>>                 07934000
               BEGIN                                                    07936000
                    MOVE VSIDB:=VSNAME,(8),2;                           07938000
                    MOVE * :=VSGROUP,(8),2;                             07940000
                    MOVE * :=VSACCNT,(8);                               07942000
               END;                                                     07944000
               LOG13(*,*,UGANAME,12,VSID,12,MVTABENT,MAXVOLNUM+1,       07946000
                     PVLMOUNT);                                         07948000
          END ELSE                                             <<00211>>07950000
          BEGIN                                                <<00211>>07952000
              IF HAVEMSIR THEN RELSIR (MVTABSIR,MSIR);         <<00211>>07954000
              IF HAVEDSIR THEN RELSIR (DIRSIR,DSIR);           <<00211>>07956000
          END;                                                 <<00211>>07958000
          REQTYPE:=EXITYPE;                                             07960000
          ASSEMBLE (EXIT 7);                                   <<00211>>07962000
     END <<EXIT'>>;                                                     07964000
                                                                        07966000
     SUBROUTINE MOVENAME;                                               07968000
     BEGIN                                                              07970000
          N:=-1;                                                        07972000
          WHILE (N:=N+1) < 8 DO                                         07974000
          NAMEQ(N):=NAMESEG(LOC+N+1);                                   07976000
     END <<MOVENAME>>;                                                  07978000
                                                                        07980000
     LOGICAL SUBROUTINE COMPNAME;                                       07982000
     BEGIN                                                              07984000
          N:=-1;                                                        07986000
          COMPNAME:=TRUE;                                               07988000
          WHILE (N:=N+1) < 8 DO                                         07990000
          IF NAMESEG(LOC+N+1) <> NAMEQ(N) THEN                          07992000
          BEGIN                                                         07994000
               COMPNAME:=FALSE;                                         07996000
               N:=8;  <<STOP LOOP>>                                     07998000
          END;                                                          08000000
     END <<COMPNAME>>;                                                  08002000
                                                                        08004000
     SUBROUTINE DELNAME(ALL);                                           08006000
     VALUE ALL;                                                         08008000
     LOGICAL ALL;                                                       08010000
     BEGIN                                                              08012000
          I := 0;                                                       08014000
          DUPNAME:=FALSE;                                               08016000
          MORENAMES:=TRUE;                                              08018000
          IF NAMECOUNT = 0 THEN RETURN;  <<NOTHING BOUND>>              08020000
          MOVE NAMEQB:=VSGROUP,(8),2;                                   08022000
          MOVE    *  :=VSACCNT,(8);                                     08024000
          WHILE MORENAMES DO                                            08026000
          BEGIN                                                         08028000
               I:=I+1;                                                  08030000
               UNBINDIT:=FALSE;                                         08032000
               LOC:= I * NAMENTSIZE;                                    08034000
               DST:=EXCHANGEDB(NAMEDST);                                08036000
               IF NOT ALL THEN                                          08038000
               BEGIN                                                    08040000
                    IF COMPNAME THEN                                    08042000
                    BEGIN                                               08044000
                         DUPNAME:=TRUE;                                 08046000
                    END;                                                08048000
               END;                                                     08050000
               IF ALL OR DUPNAME THEN                                   08052000
               BEGIN                                                    08054000
                    MOVENAME;                                           08056000
                    UNBINDIT:=TRUE;                                     08058000
                    IF (NAMESEG(LOC):=NAMESEG(LOC)-1) = 0 THEN          08060000
                    BEGIN                                               08062000
                         IF (NAMECOUNT-1)>0 THEN <<MORE NAMES>>         08064000
                         BEGIN                                          08066000
                              I:=I-1;                                   08068000
                              MOVE  <<COMPACT NAME SEGMENT>>            08070000
                              NAMESEG(LOC):=NAMESEG(LOC+NAMENTSIZE),    08072000
                                  ((NAMECOUNT*NAMENTSIZE)-LOC);         08074000
                              LOC:=NAMECOUNT*NAMENTSIZE;                08076000
                              NAMESEG(LOC):=0;                          08078000
                              MOVE  <<ZERO OLD AREA>>                   08080000
                              NAMESEG(LOC+1):=NAMESEG(LOC),             08082000
                                              (NAMENTSIZE-1);           08084000
                         END;                                           08086000
                         NAMECOUNT:=NAMECOUNT-1;                        08088000
                    END ELSE IF ALL THEN <<MORE FOR SAME NAME>> I:=I-1; 08090000
               END;                                                     08092000
               EXCHANGEDB(DST);                                         08094000
               IF UNBINDIT THEN                                         08096000
               BEGIN                                                    08098000
                    DIRECUNBIND(%10,0D,NAMEQ(4),NAMEQ,MVTABINDEX);      08100000
                    IF <> THEN EXIT'(DIRECERR);                         08102000
                    IF UGANAMEB(16) = VSACCNT,(8) AND                   08104000
                       UGANAMEB( 8) = VSGROUP,(8) AND                   08106000
                       REQTYPE = USERREQ1 AND                           08108000
                       NOT ALL THEN JITBIND (0,0);                      08110000
               END;                                                     08112000
               MORENAMES :=                                             08114000
                IF ALL THEN                                             08116000
                 IF NAMECOUNT = 0 THEN FALSE ELSE TRUE                  08118000
                ELSE <<A SPECIFIC NAME BEING SOUGHT>>                   08120000
                 IF DUPNAME THEN FALSE                                  08122000
                 ELSE                                                   08124000
                  IF I <= NAMECOUNT THEN TRUE ELSE FALSE;               08126000
          END;                                                          08128000
          IF NOT ALL AND NOT DUPNAME THEN EXIT'(INVNAME);               08130000
          IF ALL THEN JITBIND (0,0);                                    08132000
          IF NAMECOUNT = 0 THEN                                         08134000
          BEGIN                                                         08136000
               RELDATASEG(NAMEDST);                                     08138000
               NAMEINFO := 0D;  <<NULL NAMES>>                          08140000
          END;                                                          08142000
     END <<DELNAME>>;                                                   08144000
                                                                        08146000
     SUBROUTINE CHECKNSET;                                              08148000
     BEGIN                                                              08150000
          IF RETINFO.(0:8) <> VMASK THEN EXIT'(DIFFCLASS);              08152000
          UMASK.(12:1):=IF RETINFO (2) <> 0 THEN 1 ELSE 0;              08154000
          UMASK.(13:1):=IF RETINFO (1) <> 0 THEN 1 ELSE 0;              08156000
          UMASK.(14:1):=IF RETINFO (4) <> 0 THEN 1 ELSE 0;              08158000
          UMASK.(15:1):=IF RETINFO (3) <> 0 THEN 1 ELSE 0;              08160000
          USECOUNT:=INTEGER (RETINFO(2) + RETINFO(4));                  08162000
          BINDCOUNT:=INTEGER (RETINFO(1) + RETINFO (3));                08164000
          NAMEINFO1 := RETINFO (5);                                     08166000
          NAMEINFO2 := RETINFO (6);                                     08168000
     END <<CHECKNSET>>;                                                 08170000
                                                                        08172000
     PUSH(STATUS);                                                      08174000
     TOS.(2:1):=0;  <<RESET USER TRAPS - AVOID ATTACHIO PROBLEMS>>      08176000
     SET(STATUS);                                                       08178000
                                                                        08180000
     IF NOT PMAP.(10:1) THEN                                   <<00251>>08182000
     BEGIN <<NAME DESCRIPTORS NOT SUPPLIED>>                   <<00251>>08184000
         @VSNAME := @VSIDB;                                    <<00251>>08186000
         @VSGROUP := @VSIDB (8);                               <<00251>>08188000
         @VSACCNT := @VSIDB (16);                              <<00251>>08190000
     END; <<OF INITIALIZING DESCRIPTORS>>                      <<00251>>08192000
     @VSNAMEW := @VSNAME & LSR (1);                                     08194000
     @VSGROUPW := @VSGROUP & LSR (1);                                   08196000
     @VSACCNTW := @VSACCNT & LSR (1);                                   08198000
     MOVE UMASK' (-3):=UMASK'PB,(9); <<SET UP USERTABLE MASK>>          08200000
     MVTABX:=IF PMAP.(14:1) THEN MVTABX ELSE 0;                <<00211>>08202000
     GETJITINFO(REQTYPE,JITINFO,UGANAME,UGANAME(4),UGANAME(8));         08204000
     PIN:=IF REQTYPE = OPREQ THEN 0 ELSE                                08206000
           IF PMAP THEN DIFFERENT'PIN ELSE                     <<00211>>08208000
           CURRPIN;  <<THIS PROCESS' PIN>>                     <<00776>>08210000
     DSIR:=GETSIR(DIRSIR);                                     <<04818>>08212000
     HAVEDSIR := TRUE;                                         <<04818>>08214000
     MSIR := GETSIR (MVTABSIR);                                <<04818>>08216000
     HAVEMSIR := TRUE;                                         <<04818>>08218000
     IF (MVTABINDEX:=MVTABX) = 0 THEN  <<USE VS NAME SPECIFICATION>>    08220000
     BEGIN                                                              08222000
          VSID:="  "; MOVE VSID(1):=VSID,(11);                          08224000
          IF VSNAME = "* " THEN  <<DISMOUNT HOME VOLUME SET>>           08226000
          BEGIN                                                         08228000
               RETINFOD := DIRECFIND (%10,0D,VSACCNTW,VSGROUPW,         08230000
                                      VSNAMEW,DIRENT);                  08232000
               IF <> THEN                                               08234000
               BEGIN                                                    08236000
                    TOS:=IF RETINFO(1) = 2 THEN (RETINFO+NOHVSET)       08238000
                         ELSE DIRECERR;                                 08240000
                    EXIT'(*);                                           08242000
               END;                                                     08244000
               IF DIRENTB(68) <> "  " THEN                              08246000
               BEGIN                                                    08248000
                    MOVE VSIDB:=DIRENTB(68),(8),2;  <<NAME>>            08250000
                    MOVE * :=DIRENTB(60),(8),2;  <<GROUP>>              08252000
                    MOVE * :=DIRENTB(52),(8);    <<ACCOUNT>>            08254000
               END ELSE                                                 08256000
               EXIT'(NOHVSET);                                          08258000
          END ELSE                                                      08260000
          BEGIN                                                         08262000
               MOVE VSIDB:=VSNAME,(8),2;                                08264000
               MOVE * :=VSGROUP,(8),2;                                  08266000
               MOVE * :=VSACCNT,(8);                                    08268000
          END;                                                          08270000
          GETVSDEFN(VSID,VSDEFN,VSDEF,I);                               08272000
          IF <> THEN EXIT'(I);  <<DIRECTORY PROBLEM>>                   08274000
          IF (MVTABINDEX:=VSDEFN(VDMISC).MVTABXF) = 0 THEN              08276000
          BEGIN                                                         08278000
               EXIT'(NOTMOUNTED);                                       08280000
          END;                                                          08282000
          VMASK:=VSDEFN(VDINFO).VOLMASK;                                08284000
          GETMVTABENTRY(MVTABINDEX,MVTABENT);                           08286000
     END ELSE                                                           08288000
     BEGIN                                                              08290000
          VMASK:=VMASKX;                                                08292000
          GETMVTABENTRY(MVTABINDEX,MVTABENT);                           08294000
          I:=MVTABENT(5).(8:8);  <<VTAB INDEX OF MASTER VOLUME>>        08296000
          GETABENTRY(VTABDST,I,VTABENT);                                08298000
          MOVE VSID:=VTABENT,(12);                                      08300000
     END;                                                               08302000
     URET:=USERTABLE(4,PIN,MVTABINDEX,RETINFO);                <<01106>>08304000
     IF <> THEN EXIT'(NOTVALDUSER);                                     08306000
     CHECKNSET;  << LOOK AT USERTABLE RETURNED INFO >>                  08308000
     IF REQTYPE <> BYEREQ THEN  <<CHECK REQUEST/BINDING COMPAT.>>       08310000
        IF ((UMASK LAND UMASK'(REQTYPE)) <> UMASK'(REQTYPE)) THEN       08312000
           EXIT'(USERERR1);  <<MOUNT/DISMOUNT REQUEST INCOMPATIBILITY>> 08314000
     IF (UMASK'(REQTYPE) LAND %5) <> 0 THEN  <<UNBIND TYPE>>            08316000
     IF BINDCOUNT <> 0 THEN  <<BIND COUNT IS OK>>                       08318000
     BEGIN                                                              08320000
          IF REQTYPE <> BYEREQ THEN                                     08322000
             DELNAME(0)                                                 08324000
          ELSE                                                          08326000
             DELNAME(1);  <<UNBIND ALL>>                                08328000
     END;                                                               08330000
     RETINFO:=UMASK'(REQTYPE);                                          08332000
     RETINFO (1) := NAMEINFO1;  RETINFO (2) := NAMEINFO2;               08334000
     URET:=USERTABLE(1,PIN,MVTABINDEX,RETINFO);                <<01106>>08336000
     IF <> THEN EXIT' (URET);                                  <<01106>>08338000
     IF REQTYPE <> BYEREQ AND USECOUNT > 1 THEN                         08340000
     EXIT'(OKEXIT);  <<LOGICAL DISMOUNT>>                               08342000
     MVTABLE(REMOVE,MVTABINDEX,,VMASK,RETINFO);                         08344000
     IF <> THEN EXIT'(MVTABERR);                                        08346000
     DIRPARMS (0) := 0;  <<LOGICAL DEALLOCATE OF VSDEFN>>               08348000
     DIRPARMS (1) := 0;  <<RESET MVTAB INDEX>>                          08350000
     DIRPARMS (2) := -1; <<DECR REF COUNTER>>                           08352000
     DIRPARMS (3) := FALSE;                                             08354000
     DIRECSCAN (%40,0D,VSID (8),VSID (4),VSID,                          08356000
                PVRECIP,DIRPARMS);                                      08358000
     IF <> THEN EXIT' (DIRECERR);                                       08360000
     CMASK:=RETINFO.(0:8);  <<MASK OF VOLUMES DELETED>>                 08362000
     USECOUNT := RETINFO.(8:8);  <<FOR HOUSEKEEPING>>                   08364000
     IF CMASK <> 0 THEN  <<SOME DRIVES MADE AVAILABLE>>                 08366000
     IF VMOUNTINFO.ALLF THEN  <<OPERATOR WANTS TO KNOW>>                08368000
     BEGIN                                                              08370000
          I:=0;                                                         08372000
          TMASK:=CMASK;  <<SET TEMPORARY MASK>>                         08374000
          MOVE MSG:="AVAILABLE DRIVE ON LDEV# ",2;                      08376000
          WHILE TMASK <> 0 DO                                           08378000
          BEGIN                                                         08380000
               IF TMASK THEN                                            08382000
               BEGIN                                                    08384000
                    TOS:=ASCII(MVTABENT((I&LSL(1))+5).(0:8),10,BPS0);   08386000
                    ASSEMBLE(ADD);                                      08388000
                    MOVE * :=",",2;                                     08390000
               END;                                                     08392000
               I:=I+1;                                                  08394000
               TMASK:=TMASK & LSR(1);                                   08396000
          END;                                                          08398000
          LEN:=TOS-@MSG-1;                                              08400000
          MSG(LEN):=0;  <<GENMSG STOP>>                                 08402000
          GENMSG(-1,@MSG,,,,,,,0);                                      08404000
     END;                                                               08406000
     EXIT'(OKEXIT);                                                     08408000
END << DISMOUNT>>;                                                      08410000
                                                                        08412000
                                                                        08414000
$CONTROL SEGMENT = SEG'                                                 08416000
                                                                        08418000
END.                                                                    08420000
