$CONTROL MAP,CODE,USLINIT                                               00010000
<<PVPROC - MODULE 31>>                                                  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
$CONTROL PRIVILEGED                                                     00028000
                                                                        00030000
$TITLE "PVPROC - GLOBAL DECLARATIONS"                                   00032000
<< Ignore special interrupts from CS'80 discs.              >> <<04157>>00034000
<< Change all references to the now defunct 7935 to 7933.   >> <<04277>>00036000
<< Make sure both "SDLF" & "FORS" bits of LPDT set for serial>><<04524>>00038000
<<   disc remount.                                           >><<04524>>00040000
                                                                        00042000
BEGIN                                                                   00044000
                                                                        00046000
$SET X8=ON                                                     <<*8117>>00048000
$INCLUDE INCLLPDT                                              <<06273>>00050000
$INCLUDE INCLLDT5                                              <<06273>>00052000
$PAGE "GLOBAL DECLARATIONS"                                    <<06273>>00054000
<<************************* PVPROC *************************>>          00056000
                                                                        00058000
LOGICAL STAT = Q-1;                                                     00060000
                                                                        00062000
INTEGER X = X;                                                 <<06273>>00064000
                                                               <<06273>>00066000
INTEGER ERR,LDEV,VTABX,MSGLOC,MOUNTSTAT;                                00068000
                                                                        00070000
LOGICAL PRINTMSG, PRT'READMSG;                                 <<01600>>00072000
                                                                        00074000
DOUBLE STATUS;                                                          00076000
                                                                        00078000
LOGICAL                                                                 00080000
     S0 = S-0,                                                 <<03586>>00082000
     LDTX'OFFSET,          << DST rel. offset for LDTX entry >><<03586>>00084000
     STATUS1 = STATUS,                                                  00086000
     STATUS2 = STATUS+1;                                                00088000
                                                                        00090000
BYTE ARRAY MSG(0:72);                                                   00092000
                                                                        00094000
BYTE ARRAY NAME(0:7);                                                   00096000
                                                                        00098000
ARRAY VLAB(0:127);  <<VOLUME LABEL BUFFER>>                             00100000
                                                                        00102000
BYTE ARRAY VLABB(*) = VLAB;                                             00104000
                                                               <<06273>>00106000
INTEGER                                                        <<06273>>00108000
      LPDT'INDEX,                                              <<06273>>00110000
      LDT'INDEX,                                               <<06273>>00112000
      LDTX'INDEX;                                              <<06273>>00114000
                                                               <<06273>>00116000
<< LOGICAL DEVICE TABLE ENTRY >>                               <<06273>>00118000
                                                               <<06273>>00120000
LOGICAL ARRAY LDT (0:SIZE'OF'LDT'ENTRY);                       <<06273>>00122000
                                                               <<06273>>00124000
<< LOGICAL DEVICE TABLE EXTENSION ENTRY >>                     <<06273>>00126000
                                                               <<06273>>00128000
LOGICAL ARRAY LDTX (0:SIZE'OF'LDTX'ENTRY-1);                   <<S7487>>00130000
LOGICAL ARRAY LDTX'SAVE(0:SIZE'OF'LDTX'ENTRY-1);               <<S7487>>00132000
LOGICAL SAVE'LPDT'SERIAL'DISC;                                 <<*7691>>00134000
                                                                        00136000
EQUATE WORDSPERSECTR=128; <<#WORDS PER SECTOR FOR ALL>>        <<00074>>00138000
                          <<SUPPORTED SERIAL DISCS>>           <<00074>>00140000
DEFINE                                                                  00142000
     SCRATCHVOL = (DISCTYPE(LDEV,VLAB)=3)#,                    <<01115>>00144000
     SERIALVOL  = (DISCTYPE(LDEV,VLAB)=2)#,                    <<01115>>00146000
     FOREIGNVOL = (DISCTYPE(LDEV,VLAB)=4)#,                    <<01115>>00148000
     SYSTEMVOL  = (DISCTYPE(LDEV,VLAB)=0)#;                    <<01115>>00150000
EQUATE  << VOLUME LABEL INFORMATION >>                                  00152000
     LDEVINFO     =  6,                                                 00154000
     LGENINDEX    =  7,                                                 00156000
     LSYSID1      =  8,                                                 00158000
     LSYSID2      =  9,                                                 00160000
     LVNAMELOC'    = 10,                                                00162000
     LINITDATE    = 14,                                                 00164000
     LDIRBASE     = 15,                                                 00166000
     LDIRSIZE     = 16,                                                 00168000
     LANAMELOC'    = 17,                                                00170000
     LSYSIDLOC    = 16,  <<BYTES>>                                      00172000
     LVNAMELOC    = 20,  <<BYTES>>                                      00174000
     LVDIRINFO    = 30,                                                 00176000
     LANAMELOC    = 34,  <<BYTES>>                                      00178000
     LGNAMELOC    = 42,  <<BYTES>>                                      00180000
     LVOLDIR      = 25,                                                 00182000
     LVOLDIRLOC   = 50,  <<BYTES>>                                      00184000
     LVSNAMELOC   = 50;  <<BYTES>>                                      00186000
                                                                        00188000
EQUATE  << DATA SEGMENTS/SIRS >>                                        00190000
     VTABDST   = 29,                                                    00192000
     VTABSIR   = 22,                                                    00194000
     MVTABDST  = 53,                                                    00196000
     MVTABSIR  = 27;                                                    00198000
                                                                        00200000
EQUATE  << SUBTYPES >>                                                  00202000
     S7902        = 0,  <<FLOPPY DISC-ENTIRE PACK>>            <<00074>>00204000
     R7905        = 4,  <<7905 - REMOVEABLE PART>>                      00206000
     F7905        = 5,  <<7905 - FIXED PART>>                           00208000
     S7905        = 6,  <<7905 - ONE DEVICE (FIXED+REMOVEABLE)>>        00210000
     S7920        = 8,  <<7920>>                               <<RK.00>>00212000
     S7925        = 9,  <<7925>>                               <<00074>>00214000
     R7906        =10,  <<7906 - REMOVABLE PART>>              <<00074>>00216000
     F7906        =11,  <<7906 - FIXED PART>>                  <<00074>>00218000
     S7906        =12;  <<7906 - BOTH>>                        <<00074>>00220000
                                                                        00222000
EQUATE  <<MOUNT STATES>>                                                00224000
     VLDVOL  = 0,  <<VALID VOLUME>>                                     00226000
     SCRVOL  = 1,  <<SCRATCH VOLUME>>                                   00228000
     SYSVOL  = 2,  <<SYSTEM VOLUME>>                                    00230000
     UNFVOL  = 3,  <<UNFORMATTED VOLUME>>                               00232000
     UNRVOL  = 4,  <<UNREADABLE LABEL>>                                 00234000
     SERVOL  = 5,  <<SERIAL DISC VOLUME>>                      <<00.SD>>00236000
     UNKVOL  = 6;  <<UNKNOWN VOLUME FORMAT>>                   <<00.SD>>00238000
                                                                        00240000
                                                               <<03502>>00242000
DEFINE  << DISC TYPE SUBTYPE COMBINATIONS >>                   <<03502>>00244000
     D7905R     = ( TYPE=0 LAND STYPE= 4 )#,                   <<03502>>00246000
     D7905F     = ( TYPE=0 LAND STYPE= 5 )#,                   <<03502>>00248000
     D7920      = ( TYPE=0 LAND STYPE= 8 )#,                   <<03502>>00250000
     D7925      = ( TYPE=0 LAND STYPE= 9 )#,                   <<03502>>00252000
     D7906R     = ( TYPE=0 LAND STYPE=10 )#,                   <<03502>>00254000
     D7906F     = ( TYPE=0 LAND STYPE=11 )#,                   <<03502>>00256000
     FLOPPY     = ( TYPE=2 )#,                                 <<03502>>00258000
     D7911      = ( TYPE=3 LAND STYPE=1 )#,                    <<06061>>00260000
     D7912      = ( TYPE=3 LAND STYPE=2 )#,                    <<06061>>00262000
     D7914      = ( TYPE=3 LAND STYPE=4 )#,                    <<06061>>00264000
     D7945      = ( TYPE=3 LAND STYPE=5)#,                     <<*8837>>00266000
     D7933      = ( TYPE=3 LAND STYPE= 8 )#,                   <<04277>>00268000
     LINUS      = ( TYPE=3 LAND STYPE= 0 )#,                   <<03502>>00270000
     BUFFALO    = ( TYPE=3 LAND STYPE= 3 )#,                   <<b8703>>00272000
     REMVBLE    = (D7920 OR D7925 OR D7905R OR D7906R          <<03502>>00274000
                  OR FLOPPY OR LINUS OR D7911 OR D7912         <<06061>>00276000
                  OR D7914 OR D7933 OR BUFFALO OR D7945)#,     <<*8837>>00278000
     SPLITDISC  = (D7905F OR D7906F)#;                         <<03502>>00280000
                                                               <<03502>>00282000
EQUATE                                                                  00284000
     JUNK'WAIT    = %20,  ! Call to WAIT parm.              >> <<S7487>>00286000
     CR           = %15,  <<CARRIAGE RETURN>>                           00288000
     LF           = %12,  <<LINE FEED>>                                 00290000
     R            =   0,  <<READ - ATTACHIO FUNCTTION>>                 00292000
     W            =   1,  <<WRITE - ATTACHIO FUNCTION>>                 00294000
     NSD          =   1,  <<VALUE OF NSDF FOR NON-SYS DISC>>            00296000
     SYSD         =   1,  <<LDEV OF SYSTEM DISC>>                       00298000
     SYSDB        = 512,  <<SYSTEM DB BASE>>                            00300000
     SYSVOLNUM    =   2;  <<LOC IN ZERO ENTRY OF VTAB>>                 00302000
                                                                        00304000
EQUATE  << SYSTEM DB AREA >>                                            00306000
     SYSUP        = SYSDB+%73,                                          00308000
     PROGENPINX   = SYSDB+%141,                                         00310000
     PVPROCPINX   = SYSDB+%363,                                         00312000
     PVRECG'CNT   = SYSDB+%364;                                         00314000
                                                                        00316000
DEFINE  << PARTIAL FIELDS >>                                            00318000
     LDEVF        = ( 0:8)#,  <<VTAB ENTRY LDEV FIELD>>                 00320000
     STATE        = ( 0:2)#,  <<DEVICE RECG. LPDT FIELD>>               00322000
     MVTABXF      = ( 8:8)#,  <<MOUNTED VOLUME TABLE INDEX>>            00324000
     NREADYF      = (14:1)#,  <<NOT READY BIT OF STATUS-2 (DISMOUNTED)>>00326000
     GSTATUS      = (13:3)#,                                            00328000
     TERMSTAT     = ( 3:7)#,  <<DISC I/O TERMINATION STATUS FIELD>>     00330000
     DEVTYPEF     = (10:6)#,  <<DEV TYPE IN LDT(3)>>                    00332000
     READ'SWITCH  = ( 9:1)#,  <<DEV IS READ ONLY>>             <<01600>>00334000
     VTENTNUMF    = (0 :8)#,                                            00336000
     VTENTSIZEF   = (8 :8)#;                                            00338000
                                                                        00340000
EQUATE  << CONDITION CODES >>                                           00342000
     CCG = 0,                                                           00344000
     CCL = 1,                                                           00346000
     CCE = 2;                                                           00348000
                                                                        00350000
EQUATE  PVERRMSGSET = 15;                                      <<01143>>00352000
                                                               <<01143>>00354000
EQUATE     << PV PROC ERROR INDICES INTO MESSAGE CATALOGUE >>  <<01143>>00356000
      READ'ONLY      =73,   << DEVICE IS READ ONLY >>          <<01600>>00358000
     INUSE'PVDISM   = 85,   << IN USE PRIV. VOL DISMOUNTED >>  <<01143>>00360000
     INUSE'SERDISM  = 86,   << IN USE SERIAL DISC DISMOUNT >>  <<01143>>00362000
     INUSE'REMOUNT  = 87,   << IN USE VOLUME REMOUNTED >>      <<01143>>00364000
     INUSE'FORDMT   = 88,   << IN USE FOREIGN DISK DISMOUNT >> <<01143>>00366000
     VOL'DISMOUNT   = 90,   << VOLUME DISMOUNTED >>            <<01143>>00368000
     VOL'MOUNT      = 91,   << VOLUME MOUNTED >>               <<01143>>00370000
     UNFORMVOL      = 95,   << UNFORMATTED VOLUME >>           <<01143>>00372000
     UNREADLAB      = 96,   << UNREADABLE LABEL >>             <<01143>>00374000
           <<  NO ROOM IN VOLUME TABLE >>                      <<01143>>00376000
     NOROOM98       = 98,   << UNFORMATTED LABEL DISK >>       <<01143>>00378000
     IOFAIL         = 226,  << I/O error from reqstatus >>     <<03769>>00380000
     NOROOM99       = 99;   <<   FORMATTED LABEL DISK >>       <<01143>>00382000
                                                               <<01143>>00384000
DEFINE                                                         <<04157>>00386000
   CS'80  =  ( LDEVTOTYPE(LDEV) = 3 )#;                        <<04157>>00388000
                                                               <<04157>>00390000
EQUATE                                                         <<04157>>00392000
   STATUS'CS80   = 7,    << Read status function - ATTACHIO >> <<04157>>00394000
   IGNORE'INT    = %101010,  << Driver wants us to ignore it >><<04157>>00396000
   P1'CS80       = 8,    << Parameters to ATTACHIO           >><<04157>>00398000
   P2'CS80       = 9;    <<   for the special read status    >><<04157>>00400000
                                                               <<04157>>00402000
                                                               <<04157>>00404000
INTEGER                                                        <<04157>>00406000
   DISC'STATUS;          << The return from the driver       >><<04157>>00408000
DEFINE CC=STAT.(6:2)#;                                                  00410000
DEFINE CARY=STAT.(5:1)#;                                       <<RK.05>>00412000
DEFINE DUPLICATE = ASSEMBLE(DUP)#;                                      00414000
DEFINE DELETE = ASSEMBLE(DEL)#;                                         00416000
DEFINE HARDHALT = ASSEMBLE(HALT 0;BR*-1)#;                              00418000
DEFINE ENABLE  = ASSEMBLE(SED 1)#;                             <<01371>>00420000
DEFINE DISABLE = ASSEMBLE(SED 0)#;                             <<01371>>00422000
                                                               <<06273>>00424000
<< Subroutine definitions for MOVE'FROM'DST and MOVE'TO'DST. >><<06273>>00426000
<< Usage: declare "SUBROUTINE DEF'MOVE'xx'DST" in each pro-  >><<06273>>00428000
<< cedure requiring it. Note that DBSOURCE and DBTARGET are  >><<06273>>00430000
<< LOGICAL only. Use the "@" when either one is a pointer.   >><<06273>>00432000
                                                               <<06273>>00434000
DEFINE                                                         <<06273>>00436000
   DEF'MOVE'FROM'DST =                                         <<06273>>00438000
      MOVE'FROM'DST (DBTARGET, DSTN, DSTOFFSET, WORD'COUNT);   <<06273>>00440000
         VALUE   DBTARGET, DSTN, DSTOFFSET, WORD'COUNT;        <<06273>>00442000
         LOGICAL DBTARGET, DSTN, DSTOFFSET, WORD'COUNT;        <<06273>>00444000
      BEGIN                                                    <<06273>>00446000
      X := TOS;    <<Save return address>>                     <<06273>>00448000
      ASSEMBLE (MFDS 0);                                       <<06273>>00450000
      TOS := X;                                                <<06273>>00452000
      END #,                                                   <<06273>>00454000
                                                               <<06273>>00456000
   DEF'MOVE'TO'DST =                                           <<06273>>00458000
      MOVE'TO'DST (DSTN, DSTOFFSET, DBSOURCE, WORD'COUNT);     <<06273>>00460000
         VALUE   DSTN, DSTOFFSET, DBSOURCE, WORD'COUNT;        <<06273>>00462000
         LOGICAL DSTN, DSTOFFSET, DBSOURCE, WORD'COUNT;        <<06273>>00464000
      BEGIN                                                    <<06273>>00466000
      X := TOS;                                                <<06273>>00468000
      ASSEMBLE (MTDS 0);                                       <<06273>>00470000
      TOS := X;                                                <<06273>>00472000
      END #;                                                   <<06273>>00474000
                                                               <<03500>>00476000
<< For status returned by Create'Dfs'Data'Seg >>               <<03500>>00478000
                                                               <<03500>>00480000
LOGICAL dfs'status;                                            <<03500>>00482000
                                                                        00484000
INTRINSIC READ,PRINT,ASCII,BINARY,TERMINATE;                            00486000
                                                                        00488000
PROCEDURE REPORT'IOERROR (LDEV,IOSTATUS);                      <<04157>>00490000
   VALUE LDEV,IOSTATUS;                                        <<04157>>00492000
   INTEGER LDEV,IOSTATUS;                                      <<04157>>00494000
   OPTION EXTERNAL;                                            <<04157>>00496000
                                                               <<04157>>00498000
                                                               <<04157>>00500000
PROCEDURE WAIT(W,D);                                                    00502000
VALUE W,D;                                                              00504000
INTEGER W,D;                                                            00506000
OPTION EXTERNAL;                                                        00508000
                                                                        00510000
PROCEDURE AWAKE(P,A,W);                                                 00512000
VALUE P,A,W;                                                            00514000
INTEGER P,A,W;                                                          00516000
OPTION EXTERNAL;                                                        00518000
                                                                        00520000
LOGICAL PROCEDURE GETSIR(N);                                            00522000
VALUE N; LOGICAL N;                                                     00524000
OPTION EXTERNAL;                                                        00526000
                                                                        00528000
PROCEDURE RELSIR(N,B);                                                  00530000
VALUE N,B; LOGICAL N,B;                                                 00532000
OPTION EXTERNAL;                                                        00534000
                                                               <<01115>>00536000
INTEGER PROCEDURE DISCTYPE(LDEV, LABL);                        <<01115>>00538000
VALUE LDEV;                                                    <<01115>>00540000
INTEGER LDEV;                                                  <<01115>>00542000
ARRAY LABL;                                                    <<01115>>00544000
OPTION EXTERNAL;                                               <<01115>>00546000
                                                                        00548000
INTEGER PROCEDURE EXCHANGEDB(D);                                        00550000
VALUE D; LOGICAL D;                                                     00552000
OPTION EXTERNAL;                                                        00554000
                                                                        00556000
LOGICAL PROCEDURE SETSYSDB;                                             00558000
OPTION EXTERNAL;                                                        00560000
                                                                        00562000
PROCEDURE RESETDB(D);                                                   00564000
VALUE D; LOGICAL D;                                                     00566000
OPTION EXTERNAL;                                                        00568000
                                                                        00570000
PROCEDURE LOG12(MISCINFO,DEVINFO,VNAME,VNAMELEN,RECTYPE);               00572000
VALUE MISCINFO,DEVINFO,VNAMELEN,RECTYPE;                                00574000
LOGICAL MISCINFO,DEVINFO;                                               00576000
INTEGER VNAMELEN,RECTYPE;                                               00578000
ARRAY VNAME;                                                            00580000
OPTION EXTERNAL;                                                        00582000
                                                                        00584000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,PARM1,PARM2,                  00586000
   PARM3,PARM4,PARM5,DEST,REPLY,OFFSET,DST,IOTYPE);                     00588000
VALUE SETNO,MSGNO,MASK,PARM1,PARM2,PARM3,PARM4,PARM5,                   00590000
   DEST,REPLY,OFFSET,DST,IOTYPE;                                        00592000
INTEGER SETNO,MSGNO,DEST,DST;                                           00594000
LOGICAL MASK,PARM1,PARM2,PARM3,PARM4,PARM5,REPLY,OFFSET,                00596000
   IOTYPE;                                                              00598000
OPTION VARIABLE,EXTERNAL;                                               00600000
                                                                        00602000
                                                                        00604000
DOUBLE PROCEDURE ATTACHIO(P1,P2,P3,P4,P5,P6,P7,P8,P9);                  00606000
VALUE      P1,P2,P3,P4,P5,P6,P7,P8,P9;                                  00608000
INTEGER    P1,P2,P3,P4,P5,P6,P7,P8,P9;                                  00610000
OPTION EXTERNAL;                                                        00612000
                                                                        00614000
DOUBLE PROCEDURE P'ATTACHIO(P1,P2,P3,P4,P5,P6,P7,P8,P9,PA,PB); <<S7487>>00616000
VALUE      P1,P2,P3,P4,P5,P6,P7,P8,P9,PA,PB;                   <<S7487>>00618000
INTEGER    P1,P2,P3,P4,P5,P6,P7,P8,P9;                         <<S7487>>00620000
DOUBLE     PA;                                                 <<S7487>>00622000
LOGICAL    PB;                                                 <<S7487>>00624000
OPTION EXTERNAL,VARIABLE;                                      <<S7487>>00626000
                                                               <<S7487>>00628000
DOUBLE PROCEDURE REQSTATUS(LDN);                                        00630000
VALUE LDN; INTEGER LDN;                                                 00632000
OPTION EXTERNAL;                                                        00634000
                                                                        00636000
PROCEDURE HELP;                                                         00638000
OPTION EXTERNAL;                                                        00640000
                                                                        00642000
PROCEDURE DEBUG;                                               <<01143>>00644000
OPTION EXTERNAL;                                               <<01143>>00646000
                                                               <<03500>>00648000
<< Disc free space set-up routines >>                          <<03500>>00650000
                                                               <<03500>>00652000
INTEGER PROCEDURE Create'Dfs'Data'Seg (ldev, disk'label,       <<03500>>00654000
                                       assume'dt'is'dirty,     <<03500>>00656000
                                       flag'dt'as'dirty);      <<03500>>00658000
   VALUE ldev, assume'dt'is'dirty, flag'dt'as'dirty;           <<03500>>00660000
   INTEGER ldev;                                               <<03500>>00662000
   ARRAY disk'label;                                           <<03500>>00664000
   LOGICAL assume'dt'is'dirty;                                 <<03500>>00666000
   LOGICAL flag'dt'as'dirty;                                   <<03500>>00668000
   OPTION EXTERNAL, VARIABLE;                                  <<03500>>00670000
                                                               <<03500>>00672000
PROCEDURE Delete'Dfs'Data'Seg (ldev);                          <<03500>>00674000
   VALUE ldev;                                                 <<03500>>00676000
   INTEGER ldev;                                               <<03500>>00678000
   OPTION EXTERNAL;                                            <<03500>>00680000
                                                               <<03500>>00682000
PROCEDURE Process'Dfs'Error (ldev, error'status,               <<03500>>00684000
                             type'of'error);                   <<03500>>00686000
   VALUE ldev, error'status, type'of'error;                    <<03500>>00688000
   INTEGER ldev;                                               <<03500>>00690000
   LOGICAL error'status;                                       <<03500>>00692000
   INTEGER type'of'error;                                      <<03500>>00694000
   OPTION EXTERNAL;                                            <<03500>>00696000
                                                               <<03586>>00698000
INTEGER PROCEDURE GETDATASEG(MEMSIZE,VDSIZE);                  <<03586>>00700000
   VALUE MEMSIZE,VDSIZE;                                       <<03586>>00702000
   INTEGER MEMSIZE,VDSIZE;                                     <<03586>>00704000
   OPTION EXTERNAL;                                            <<03586>>00706000
                                                               <<03586>>00708000
                                                               <<03586>>00710000
                                                               <<03586>>00712000
PROCEDURE RELDATASEG(SEGMENT);                                 <<03586>>00714000
   VALUE SEGMENT;                                              <<03586>>00716000
   INTEGER SEGMENT;                                            <<03586>>00718000
   OPTION EXTERNAL;                                            <<03586>>00720000
                                                               <<03586>>00722000
                                                               <<03586>>00724000
                                                               <<03586>>00726000
PROCEDURE RECOGNIZE (LDEV);                                    <<03586>>00728000
   VALUE LDEV;                                                 <<03586>>00730000
   INTEGER LDEV;                                               <<03586>>00732000
   OPTION EXTERNAL;                                            <<03586>>00734000
                                                               <<03586>>00736000
                                                               <<03586>>00738000
                                                               <<03586>>00740000
PROCEDURE CLEANLDEV (LDEV);                                    <<03586>>00742000
  VALUE LDEV;                                                  <<03586>>00744000
  INTEGER LDEV;                                                <<03586>>00746000
  OPTION EXTERNAL;                                             <<03586>>00748000
                                                               <<03586>>00750000
INTEGER PROCEDURE LDEVTOTYPE(LDEV);                            <<03586>>00752000
   VALUE LDEV;                                                 <<03586>>00754000
   INTEGER LDEV;                                               <<03586>>00756000
   OPTION EXTERNAL;                                            <<03586>>00758000
                                                               <<03586>>00760000
                                                               <<03586>>00762000
PROCEDURE CHECKDISC(LDEV,STATUS);                              <<03586>>00764000
   VALUE LDEV;                                                 <<03586>>00766000
   INTEGER LDEV;                                               <<03586>>00768000
   LOGICAL STATUS;                                             <<03586>>00770000
   OPTION EXTERNAL;                                            <<03586>>00772000
                                                               <<03586>>00774000
                                                               <<03586>>00776000
LOGICAL PROCEDURE TEST'FOR'REELSWITCH (LDEV);                  <<03619>>00778000
   VALUE LDEV;                                                 <<03619>>00780000
   INTEGER LDEV;                                               <<03619>>00782000
   OPTION EXTERNAL;                                            <<03619>>00784000
                                                               <<03619>>00786000
                                                               <<03619>>00788000
                                                               <<03619>>00790000
PROCEDURE LABELED'DEV'MOUNTED (LDEV);                          <<03619>>00792000
   VALUE LDEV;                                                 <<03619>>00794000
   INTEGER LDEV;                                               <<03619>>00796000
   OPTION EXTERNAL;                                            <<03619>>00798000
                                                               <<03619>>00800000
                                                               <<03619>>00802000
                                                               <<03619>>00804000
PROCEDURE CHECKLDEV(LDEV);                                     <<03723>>00806000
   VALUE LDEV;                                                 <<03723>>00808000
   INTEGER LDEV;                                               <<03723>>00810000
   OPTION EXTERNAL;                                            <<03723>>00812000
INTEGER PROCEDURE FLUSH'CACHE (LDEV,ADDR1,ADDR2);              <<07327>>00814000
   VALUE   LDEV,ADDR1,ADDR2;                                   <<07327>>00816000
   INTEGER LDEV;                                               <<07327>>00818000
   DOUBLE  ADDR1,ADDR2;                                        <<07327>>00820000
   OPTION  EXTERNAL;                                           <<07327>>00822000
                                                               <<07327>>00824000
                                                               <<03723>>00826000
                                                               <<03723>>00828000
PROCEDURE GET'SDISC'DSEG;                                      <<S7487>>00830000
OPTION FORWARD;                                                <<S7487>>00832000
                                                               <<S7487>>00834000
PROCEDURE FREE'SDISC'DSEG;                                     <<S7487>>00836000
OPTION FORWARD;                                                <<S7487>>00838000
$PAGE  "SERIAL DISC - REEL SWITCH"                             <<06273>>00840000
PROCEDURE REEL'SWITCH (LDEV);                                  <<03619>>00842000
   VALUE LDEV;                                                 <<03619>>00844000
   INTEGER LDEV;                                               <<03619>>00846000
   OPTION INTERNAL;                                            <<03619>>00848000
                                                               <<03619>>00850000
BEGIN                                                          <<03619>>00852000
                                                               <<03619>>00854000
<< Makes sure that if the newly re-mounted serial disc, was >> <<03619>>00856000
<< for a reel switch and that AVR will be performed on it.  >> <<03619>>00858000
                                                               <<03619>>00860000
                                                               <<03619>>00862000
IF TEST'FOR'REELSWITCH(LDEV)  THEN                             <<03619>>00864000
BEGIN          << We are expecting a reel switch! >>           <<03619>>00866000
   GET'SDISC'DSEG;      ! Obtain a new SDISC DST for read.     <<S7487>>00868000
   RECOGNIZE(LDEV);    << Perform AVR >>                       <<03619>>00870000
   FREE'SDISC'DSEG;     ! Set the state of LDTX back.          <<S7487>>00872000
   LABELED'DEV'MOUNTED(LDEV);    << Tell Labeled Tape       >> <<03619>>00874000
                                 << interface we're done.   >> <<03619>>00876000
END;                                                           <<03619>>00878000
                                                               <<03619>>00880000
END;                                                           <<03619>>00882000
$PAGE "    WAKE'SDISC'PROCESS  "                               <<S7487>>00884000
PROCEDURE WAKE'SDISC'PROCESS;                                  <<S7487>>00886000
                                                               <<S7487>>00888000
!------------------------------------------------------------- <<S7487>>00890000
! When  serial  disc performs a volume switch, he puts himself <<S7487>>00892000
! to sleep and stores his PCB number in the LDTX.  When PVPROC <<S7487>>00894000
! sees a serial or foreign disc, it wakes up the given process <<S7487>>00896000
! so that he can continue with his volume switching.           <<S7487>>00898000
!------------------------------------------------------------- <<S7487>>00900000
                                                               <<S7487>>00902000
BEGIN                                                          <<S7487>>00904000
IF LDTX'SERIAL'OR'FOREIGN AND LDTX'SDISC'PCB'NUM <> 0 THEN     <<S7487>>00906000
   AWAKE(LDTX'SDISC'PCB'NUM,JUNK'WAIT,0);                      <<S7487>>00908000
END;                                                           <<S7487>>00910000
$PAGE "       GET'SDISC'DSEG "                                 <<S7487>>00912000
PROCEDURE GET'SDISC'DSEG;                                      <<S7487>>00914000
                                                               <<S7487>>00916000
!------------------------------------------------------------- <<S7487>>00918000
! This procedure allocates a new serial disc DST and stores it <<S7487>>00920000
! in  the  LDTX so that the labeled tape routines can read the <<S7487>>00922000
! label from the disc and use its own SDISC xtra data segment. <<S7487>>00924000
! It  is used when a serial disc is first mounted, when volume <<S7487>>00926000
! switching is performed and when then unit is swithed offline <<S7487>>00928000
! unexpectedly.                                                <<S7487>>00930000
!------------------------------------------------------------- <<S7487>>00932000
                                                               <<S7487>>00934000
BEGIN                                                          <<S7487>>00936000
ARRAY SDISC'DST(0:4);    ! SDISC temporary buffer.             <<S7487>>00938000
INTEGER                                                        <<S7487>>00940000
   SDISC'DST'NUM,        ! Newly allocated SDISC DST #.        <<S7487>>00942000
   LDT'SIR'RETURN;       ! Return value from GETSIR.           <<S7487>>00944000
                                                               <<S7487>>00946000
EQUATE                                                         <<S7487>>00948000
   MEMSIZE        = %77700,     ! Values  for GETDATASEG.      <<S7487>>00950000
   VDSIZE         = 0,                                         <<S7487>>00952000
   ! Entries in SDISC'DST                                      <<S7487>>00954000
   JUST'ALLOCATED = 0,   ! True if XDS just allocated.         <<S7487>>00956000
   WRITERING      = 1,   ! True if allow writes.               <<S7487>>00958000
   FATALERROR     = 2,   ! True if error detected.             <<S7487>>00960000
   ERRORLOGCELL   = 3,                                         <<S7487>>00962000
   MSIZECELL      = 4,                                         <<S7487>>00964000
   JUST'ALLOC'ADR = 7;                                         <<S7487>>00966000
                                                               <<S7487>>00968000
SUBROUTINE DEF'MOVE'TO'DST;                                    <<S7487>>00970000
!------------------------------------------------------------- <<S7487>>00972000
! Attempt to obtain the SDISC DST and then initialize it.      <<S7487>>00974000
!------------------------------------------------------------- <<S7487>>00976000
                                                               <<S7487>>00978000
SDISC'DST'NUM := GETDATASEG(MEMSIZE,VDSIZE);                   <<S7487>>00980000
IF <> THEN                                                     <<S7487>>00982000
   BEGIN                 ! Can't get DST, give up!             <<S7487>>00984000
   CC := CCL;                                                  <<S7487>>00986000
   RETURN;                                                     <<S7487>>00988000
   END;                                                        <<S7487>>00990000
SDISC'DST(JUST'ALLOCATED) := TRUE;                             <<S7487>>00992000
SDISC'DST(WRITERING) := FALSE;                                 <<S7487>>00994000
SDISC'DST(FATALERROR) := FALSE;                                <<S7487>>00996000
SDISC'DST(ERRORLOGCELL) := 0;                                  <<S7487>>00998000
SDISC'DST(MSIZECELL) := MEMSIZE;                               <<S7487>>01000000
MOVE'TO'DST (SDISC'DST'NUM,JUST'ALLOC'ADR,@SDISC'DST,5);       <<S7487>>01002000
$PAGE                                                          <<*7691>>01004000
!------------------------------------------------------------- <<S7487>>01006000
! Save  the  current  state  of the LDTX and store the new DST <<S7487>>01008000
! number in the LDTX and copy the new LDTX to the actual LDT.  <<S7487>>01010000
!------------------------------------------------------------- <<S7487>>01012000
                                                               <<S7487>>01014000
LDT'SIR'RETURN := GETSIR(LDT'SIR);                             <<S7487>>01016000
MOVE LDTX'SAVE := LDTX,(SIZE'OF'LDTX'ENTRY);                   <<S7487>>01018000
MOVE LDTX := SIZE'OF'LDTX'ENTRY(0);                            <<S7487>>01020000
LDTX'SDISC'GPT'XDS := SDISC'DST'NUM;                           <<S7487>>01022000
LDTX'SERIAL'OR'FOREIGN := 1;                                   <<S7487>>01024000
MOVE'TO'DST (LDT'DST,LDTX'OFFSET,@LDTX,SIZE'OF'LDTX'ENTRY);    <<S7487>>01026000
RELSIR(LDT'SIR,LDT'SIR'RETURN);                                <<S7487>>01028000
DISABLE;                                                       <<*7691>>01030000
SAVE'LPDT'SERIAL'DISC := LPDT'SERIAL'DISC;                     <<*7691>>01032000
LPDT'SERIAL'DISC := 1;                                         <<*7691>>01034000
ENABLE;                                                        <<*7691>>01036000
CC := CCE                ! Alls well that ends well.           <<S7487>>01038000
END;                                                           <<S7487>>01040000
                                                               <<S7487>>01042000
                                                               <<S7487>>01044000
$PAGE     "    FREE'SDISC'DSEG "                               <<S7487>>01046000
PROCEDURE FREE'SDISC'DSEG;                                     <<S7487>>01048000
                                                               <<S7487>>01050000
!------------------------------------------------------------- <<S7487>>01052000
! This procedure  restores the LDTX in  its previous state and <<S7487>>01054000
! frees the newly created serial disc DST that was created and <<S7487>>01056000
! initialized by GET'SDISC'DSEG.  The ATTACHIO call with func- <<S7487>>01058000
! tion 10 is used to free the serial disc buffer DST's.        <<S7487>>01060000
!------------------------------------------------------------- <<S7487>>01062000
                                                               <<S7487>>01064000
BEGIN                                                          <<S7487>>01066000
INTEGER                                                        <<S7487>>01068000
   LDT'SIR'RETURN;       ! Return parm from GETSIR.            <<S7487>>01070000
                                                               <<S7487>>01072000
SUBROUTINE DEF'MOVE'TO'DST;                                    <<S7487>>01074000
ATTACHIO(LDEV,0,0,0,10,0,0,0,1);                               <<S7487>>01076000
RELDATASEG(LDTX'SDISC'GPT'XDS);                                <<S7487>>01078000
LDT'SIR'RETURN := GETSIR(LDT'SIR);                             <<S7487>>01080000
MOVE LDTX := LDTX'SAVE,(SIZE'OF'LDTX'ENTRY);                   <<S7487>>01082000
MOVE'TO'DST (LDT'DST,LDTX'OFFSET,@LDTX,SIZE'OF'LDTX'ENTRY);    <<S7487>>01084000
RELSIR(LDT'SIR,LDT'SIR'RETURN);                                <<S7487>>01086000
DISABLE;                                                       <<*7691>>01088000
LPDT'SERIAL'DISC := SAVE'LPDT'SERIAL'DISC;                     <<*7691>>01090000
ENABLE;                                                        <<*7691>>01092000
END;                                                           <<S7487>>01094000
$PAGE "           LABELLED'SDISC"                              <<S7487>>01096000
PROCEDURE LABELED'SDISC;                                       <<S7487>>01098000
OPTION INTERNAL;                                               <<S7487>>01100000
                                                               <<S7487>>01102000
!------------------------------------------------------------- <<S7487>>01104000
! This  procedure  is  called  when an SDISC is newly mounted. <<S7487>>01106000
! (LDTX  word  1=0,  no  serial disc DST is present, so it un- <<S7487>>01108000
! owned).  We will save the state of the LDTX and create a new <<S7487>>01110000
! serial  disc DST for the device and store it in the LDTX for <<S7487>>01112000
! SDISC to find and use. We then will call RECOGNIZE to see if <<S7487>>01114000
! the  serial  disc is labeled.  Lastly we will reset the LDTX <<S7487>>01116000
! to  the  state that it was before we were called and release <<S7487>>01118000
! the serial disc extra data segment.                          <<S7487>>01120000
!                                                              <<S7487>>01122000
! NOTE: DB must be at the stack!                               <<S7487>>01124000
!------------------------------------------------------------- <<S7487>>01126000
                                                               <<S7487>>01128000
BEGIN                                                          <<S7487>>01130000
EQUATE                                                         <<S7487>>01132000
  LOCK     = 16,         ! ATTACHIO Lock LDEV function.        <<S7487>>01134000
  UNLOCK   = 17,         ! ATTACHIO Unlock LDEV function.      <<S7487>>01136000
  CHK'LOCK = 18;         ! Check if ldev is locked or not.     <<S7487>>01138000
DEFINE                                                         <<S7487>>01140000
   DOWNED'DEV  = STATUS.(6:1) = 1#;                            <<S7487>>01142000
INTEGER                                                        <<S7487>>01144000
   STATUS;               ! Return from CHECKDISC.              <<S7487>>01146000
LOGICAL                                                        <<S7487>>01148000
   LOCKFLAG := TRUE;     ! True if ldev is locked already      <<S7487>>01150000
                                                               <<S7487>>01152000
                                                               <<S7487>>01154000
   ! If the device is downed, don't want to AVR it.            <<S7487>>01156000
                                                               <<S7487>>01158000
   CHECKDISC(LDEV,STATUS);                                     <<S7487>>01160000
   IF DOWNED'DEV  THEN  RETURN;                                <<S7487>>01162000
                                                               <<S7487>>01164000
   IF CS'80 THEN                                               <<S7487>>01166000
      BEGIN        ! See if we need to lock the device.        <<S7487>>01168000
      P'ATTACHIO(LDEV,0,0,@LOCKFLAG,CHK'LOCK,1,0,0,1);         <<S7487>>01170000
      IF NOT LOCKFLAG THEN                                     <<S7487>>01172000
         ! Disc is not locked, better lock it.                 <<S7487>>01174000
         P'ATTACHIO(LDEV,0,0,0,LOCK,0,0,0,1);                  <<S7487>>01176000
      END;                                                     <<S7487>>01178000
                                                               <<S7487>>01180000
   GET'SDISC'DSEG;     ! Set up the device for SDISC.          <<S7487>>01182000
   IF <> THEN GO EXIT; ! If an error occured, forget it.       <<S7487>>01184000
                                                               <<S7487>>01186000
   RECOGNIZE(LDEV);    ! See if it's a labeled serial disc.    <<S7487>>01188000
                                                               <<S7487>>01190000
   FREE'SDISC'DSEG;    ! Release DST and set LDTX back.        <<S7487>>01192000
                                                               <<S7487>>01194000
EXIT:                                                          <<S7487>>01196000
                                                               <<S7487>>01198000
   IF CS'80 AND (NOT LOCKFLAG)  THEN                           <<S7487>>01200000
      ! If we locked it, then unlock it.                       <<S7487>>01202000
      P'ATTACHIO(LDEV,0,0,0,UNLOCK,0,0,0,1);                   <<S7487>>01204000
                                                               <<S7487>>01206000
END;                                                           <<S7487>>01208000
                                                               <<S7487>>01210000
$PAGE  "IO PROCEDURE"                                          <<06273>>01212000
PROCEDURE DISCIO(LDN,FUNCT,BUF,ADDR,WC);                                01214000
VALUE LDN,FUNCT,ADDR,WC;                                                01216000
INTEGER LDN,FUNCT,WC;                                                   01218000
DOUBLE ADDR;                                                            01220000
ARRAY BUF;                                                              01222000
OPTION PRIVILEGED,UNCALLABLE;                                           01224000
BEGIN                                                                   01226000
     INTEGER                                                            01228000
          ADDR1 = ADDR,                                                 01230000
          ADDR2 = ADDR+1;                                               01232000
     INTEGER POINTER BUFP = BUF;                                        01234000
                                                                        01236000
     CC:=CCE;                                                           01238000
     TOS := P'ATTACHIO(LDN,0,0,@BUFP,FUNCT,WC,ADDR1,ADDR2,1);  <<S7487>>01240000
     DELETE;                                                            01242000
     IF TOS.GSTATUS <> 1 THEN CC:=CCL;                                  01244000
END << DISCIO >>;                                                       01246000
$PAGE  "SERIAL DISC - UPDATE LDT"                              <<06273>>01248000
                                                                        01250000
PROCEDURE UPDATELDT(LDN,VTABX);                                         01252000
VALUE LDN,VTABX;                                                        01254000
INTEGER LDN,VTABX;                                                      01256000
OPTION PRIVILEGED,UNCALLABLE;                                           01258000
                                                               <<06273>>01260000
<< Save Volume Table Index in LDT if SDISC is not in use. >>   <<06273>>01262000
                                                               <<06273>>01264000
BEGIN                                                                   01266000
     LOGICAL A;                                                         01268000
     INTEGER DST;                                                       01270000
     INTEGER LDT'INDEX, LDTX'INDEX;                            <<07096>>01272000
     LOGICAL ARRAY LDT (*) = DB+0;                             <<06273>>01274000
     LOGICAL ARRAY LDTX (*) = LDT;                             <<06273>>01276000
                                                                        01278000
     DST := EXCHANGEDB (LDT'DST);                              <<06273>>01280000
     LDT'INDEX := LDN * SIZE'OF'LDT'ENTRY;                     <<*8117>>01282000
     LDTX'INDEX := LDN * SIZE'OF'LDTX'ENTRY + LDTX'BASE;       <<07096>>01284000
     A := GETSIR (LDT'SIR);                                    <<06273>>01286000
     IF LDTX'SDISC'GPT'XDS = 0 THEN                            <<06273>>01288000
        LDT'VOLUME'TBL'INDEX := VTABX;                         <<06273>>01290000
     RELSIR (LDT'SIR,A);                                       <<06273>>01292000
     EXCHANGEDB (DST);                                         <<06273>>01294000
END << UPDATELDT >>;                                                    01296000
                                                                        01298000
$PAGE  "FIND MOUNTED/DISMOUNTED DEVICE"                        <<06273>>01300000
INTEGER PROCEDURE MOUNTEDLDEV;                                          01302000
OPTION PRIVILEGED,UNCALLABLE;                                           01304000
BEGIN                                                                   01306000
                                                               <<06273>>01308000
<< This procedure returns LDEV for the device with service    ><<06273>>01310000
<< granted and reset the device status in LPDT to "NOT'OWNED" ><<06273>>01312000
<< state.                                                     ><<06273>>01314000
                                                               <<06273>>01316000
INTEGER I,DEV,RDEV,TYPE,STYPE,LDEVMAX,LPDTESIZE;               <<06273>>01318000
LOGICAL DIT,DEVINFO;                                           <<06273>>01320000
                                                                        01322000
SUBROUTINE DEF'MOVE'FROM'DST;                                  <<06273>>01324000
                                                               <<06273>>01326000
LPDTESIZE := SIZE'OF'LPDT'ENTRY;                               <<*8117>>01328000
LDEVMAX := LPDT'MAX'ENTRIES;                                   <<06273>>01330000
LDT'INDEX := 0;                                                <<06273>>01332000
FOR DEV := 1 UNTIL LDEVMAX DO                                  <<06273>>01334000
   BEGIN                                                       <<06273>>01336000
   LPDT'INDEX := DEV * LPDTESIZE;                              <<06273>>01338000
   IF LPDT'DEV'OWN'STATE = LPDT'SERVICE'OK THEN                <<06273>>01340000
      BEGIN                                                    <<06273>>01342000
      MOVE'FROM'DST (@LDT, LDT'DST, DEV*SIZE'OF'LDT'ENTRY,     <<06273>>01344000
                     SIZE'OF'LDT'ENTRY);                       <<06273>>01346000
      TYPE := LDT'DEVICE'TYPE;                                 <<06273>>01348000
      STYPE := LPDT'SUBTYPE;                                   <<06273>>01350000
      RDEV := DEV;                                             <<06273>>01352000
      IF SPLITDISC THEN                                        <<06273>>01354000
         BEGIN                                                 <<06273>>01356000
         << Look for removable part >>                         <<06273>>01358000
         DIT := LPDT'DIT'PTR;                                  <<06273>>01360000
         FOR I := 1 UNTIL LDEVMAX DO                           <<06273>>01362000
            BEGIN                                              <<06273>>01364000
            LPDT'INDEX := I * SIZE'OF'LPDT'ENTRY;              <<*8117>>01366000
            IF LPDT'DIT'PTR = DIT AND I <> DEV THEN            <<06273>>01368000
               BEGIN                                           <<06273>>01370000
               STYPE := LPDT'SUBTYPE;                          <<06273>>01372000
               RDEV := I;                                      <<06273>>01374000
               I := LDEVMAX;                                   <<06273>>01376000
               END;                                            <<06273>>01378000
            END;                                               <<06273>>01380000
         END;                                                  <<06273>>01382000
      IF REMVBLE THEN                                          <<06273>>01384000
         BEGIN                                                 <<06273>>01386000
         LPDT'INDEX := RDEV * LPDTESIZE;                       <<06273>>01388000
         IF LPDT'NON'SYS'DOMAIN THEN                           <<06273>>01390000
            BEGIN                                              <<06273>>01392000
            MOUNTEDLDEV := RDEV;                               <<06273>>01394000
            DISABLE;                                           <<06273>>01396000
            LPDT'DEV'OWN'STATE := LPDT'NOT'OWNED;              <<06273>>01398000
            ENABLE;                                            <<06273>>01400000
            DEV := LDEVMAX;                                    <<06273>>01402000
            END;                                               <<06273>>01404000
         END;                                                  <<06273>>01406000
      END;                                                     <<06273>>01408000
   END;                                                        <<06273>>01410000
END << MOUNTEDLDEV >>;                                                  01412000
                                                                        01414000
$PAGE  "CREATE VOLUME TABLE ENTRY"                             <<06273>>01416000
INTEGER PROCEDURE ADDTOVTAB(LDN,ESTAT);                                 01418000
VALUE LDN,ESTAT;                                                        01420000
INTEGER LDN,ESTAT;                                                      01422000
OPTION VARIABLE;                                                        01424000
OPTION PRIVILEGED,UNCALLABLE;                                           01426000
BEGIN                                                                   01428000
     << LDN -   LOGICAL DEVICE NUMBER FOR VOLUME TO BE ADDED TO         01430000
                VOLUME TABLE.                                           01432000
        ESTAT - OPTIONAL PARAMETER WHICH, IF NON ZERO, INDICATES        01434000
                THE VOLUME IS UNFORMATTED OR HAS AN UNREADABLE          01436000
                LABEL. IN EITHER CASE, A VOLUME NAME WILL NOT BE        01438000
                PLACED IN THE VOLUME TABLE ENTRY                        01440000
                                                                        01442000
      RETURN CODES:                                                     01444000
        CCE - SUCCESSFUL (EITHER EMPTY ENTRY -- CARRY=FALSE             01446000
                          OR OLDNAME=NEWNAME -- CARRY=TRUE)             01448000
        CCL - NO ROOM (VTAB IS FULL)                                    01450000
        CCG - LDN WAS ALREADY IN VTAB AND                               01452000
              THE OLDVOLNAME<>NEWVOLNAME                                01454000
                                                                        01456000
     >>                                                                 01458000
     LOGICAL PMAP = Q-4;                                                01460000
     INTEGER INDEX:=0;                                                  01462000
     INTEGER OLDINDEX:=0;                                      <<RK.00>>01464000
     INTEGER I,DST,LOC,VTENTNUM,VTENTSIZE,SIZE;                <<07095>>01466000
     LOGICAL A,IOSTATUS,THISLDEV;                              <<RK.00>>01468000
     ARRAY VTAB(*) = DB+0;                                              01470000
     ARRAY VTABENT(0:13);  <<ASSUME VTAB ENTRY SIZE = 14>>              01472000
     BYTE ARRAY                                                         01474000
          VTABB(*)     = VTAB,                                          01476000
          VTABENTB(*)  = VTABENT;                                       01478000
     DEFINE                                                             01480000
          ESTATF   = (13: 1)#,                                          01482000
          NSDVOLF  = (14: 1)#,                                          01484000
          SCRATCHF = (15: 1)#;                                          01486000
                                                                        01488000
     CC:=CCE;                                                           01490000
     CARY:=0;                                                  <<RK.05>>01492000
     A:=GETSIR(VTABSIR);                                                01494000
     DST:=EXCHANGEDB(VTABDST);                                          01496000
     VTENTNUM:=VTAB.VTENTNUMF;                                          01498000
     VTENTSIZE:=VTAB.VTENTSIZEF;                                        01500000
     I:=VTAB(SYSVOLNUM).(8:8);  <<NUMBER OF SYSTEM VOLUMES>>            01502000
     WHILE (I:=I+1) <= VTENTNUM DO                                      01504000
     BEGIN                                                              01506000
          LOC:=(I*VTENTSIZE);                                           01508000
          THISLDEV:=VTAB(LOC+12).LDEVF;                        <<RK.00>>01510000
          IF THISLDEV = 0 THEN INDEX:= I;    <<AVAILABLE SLOT>><<RK.00>>01512000
          IF THISLDEV = LOGICAL(LDN) THEN OLDINDEX:=I;         <<RK.00>>01514000
          << IE, IT'S ALREADY HERE -- LOST AN OFFLINE ? >>     <<RK.00>>01516000
          << TWO SECOND GOTCHA !! >>                           <<RK.00>>01518000
     END;                                                      <<RK.00>>01520000
     EXCHANGEDB(DST);                                          <<RK.00>>01522000
     IF OLDINDEX <> 0 THEN <<ALREADY HERE>>                    <<RK.00>>01524000
     BEGIN                                                     <<RK.00>>01526000
          <<MOVE OLD ENTRY INTO VTABENT>>                      <<RK.00>>01528000
          TOS:=@VTABENT;                                       <<RK.00>>01530000
          TOS:=VTABDST;                                        <<RK.00>>01532000
          TOS:=OLDINDEX*VTENTSIZE;                             <<RK.00>>01534000
          TOS:=VTENTSIZE;                                      <<RK.00>>01536000
          ASSEMBLE(MFDS 4);                                    <<RK.00>>01538000
          IF VTABENTB<>VLABB(LVNAMELOC),(8),2 OR               <<RK.00>>01540000
             * <> VLABB(LGNAMELOC),(8),2 OR                    <<RK.00>>01542000
             * <> VLABB(LANAMELOC),(8) THEN                    <<RK.00>>01544000
          CC:=CCG;                                             <<RK.00>>01546000
          INDEX:=OLDINDEX;  <<UPDATE VTAB ENTRY>>              <<RK.00>>01548000
          CARY:=1;                                             <<RK.05>>01550000
     END;                                                      <<RK.00>>01552000
     IF  INDEX <> 0 THEN  <<FOUND AVAILABLE ENTRY>>            <<RK.00>>01554000
     BEGIN                                                              01556000
        IF OLDINDEX <> 0 THEN                                  <<07095>>01558000
           SIZE := VTENTSIZE - 2   << Save MVTAB index >>      <<07095>>01560000
        ELSE                                                   <<07095>>01562000
           SIZE := VTENTSIZE - 1;                              <<07095>>01564000
          VTABENT:=0;                                                   01566000
          MOVE VTABENT(1):=VTABENT,(SIZE);                     <<07095>>01568000
          VTABENT(12):=2 CAT LDN(0:8:8);  <<SET NSD-VOLUME FLAG>>       01570000
          IF PMAP THEN VTABENT(12).ESTATF:=ESTAT ELSE                   01572000
          BEGIN                                                         01574000
               IF DISCTYPE(LDN,VLAB)=3 THEN VTABENT(12).SCRATCHF:=1;    01576000
               MOVE VTABENTB:=VLABB(LVNAMELOC),(8),2;                   01578000
               MOVE * :=VLABB(LGNAMELOC),(8),2;                         01580000
               MOVE * :=VLABB(LANAMELOC),(8);                           01582000
          END;                                                          01584000
          <<MOVE NEW ENTRY INTO VTAB>>                                  01586000
          TOS:=VTABDST;                                                 01588000
          TOS:=INDEX*VTENTSIZE;                                         01590000
          TOS:=@VTABENT;                                                01592000
          TOS:=VTENTSIZE;                                               01594000
          ASSEMBLE(MTDS 4);                                             01596000
          UPDATELDT(LDN,INDEX);                                         01598000
          ADDTOVTAB:=INDEX;  <<PASS BACK VTAB INDEX>>                   01600000
     END ELSE CC:=CCL;                                                  01602000
     RELSIR(VTABSIR,A);                                                 01604000
END << ADDTOVTAB >>;                                                    01606000
                                                                        01608000
$PAGE  "DELETE VOLUME TABLE ENTRY"                             <<06273>>01610000
INTEGER PROCEDURE DELFRVTAB(LDN);                                       01612000
VALUE LDN; INTEGER LDN;                                                 01614000
OPTION PRIVILEGED,UNCALLABLE;                                           01616000
BEGIN                                                                   01618000
     INTEGER INDEX:=0;                                                  01620000
     INTEGER DST,LOC,VTENTNUM,VTENTSIZE;                                01622000
     LOGICAL A,FOUND:=FALSE;                                            01624000
     ARRAY VTAB(*) = DB+0;                                              01626000
                                                                        01628000
     CC:=CCE;                                                           01630000
     A:=GETSIR(VTABSIR);                                                01632000
     DST:=EXCHANGEDB(VTABDST);                                          01634000
     VTENTNUM:=VTAB.VTENTNUMF;                                          01636000
     VTENTSIZE:=VTAB.VTENTSIZEF;                                        01638000
     WHILE (INDEX:=INDEX+1) <= VTENTNUM DO                              01640000
     BEGIN                                                              01642000
          LOC:=(INDEX*VTENTSIZE);                                       01644000
          IF VTAB(LOC+12).LDEVF = LOGICAL(LDN) THEN  <<FOUND ENTRY>>    01646000
          BEGIN                                                         01648000
               FOUND:=TRUE;                                             01650000
               DELFRVTAB:=INDEX;  <<PASS BACK VTAB INDEX>>              01652000
               VTAB(LOC):=0; MOVE VTAB(LOC+1):=VTAB(LOC),(VTENTSIZE-1); 01654000
               UPDATELDT(LDN,0);  <<NULL VTAB POINTER>>                 01656000
               INDEX:=VTENTNUM;  <<STOP LOOP>>                          01658000
          END;                                                          01660000
     END;                                                               01662000
     EXCHANGEDB(DST);                                                   01664000
     RELSIR(VTABSIR,A);                                                 01666000
     IF NOT FOUND THEN CC:=CCL;                                         01668000
END << DELFRVTAB>>;                                                     01670000
                                                                        01672000
$PAGE  "MISC. PROCEDURE"                                       <<06273>>01674000
PROCEDURE PVLOG12(MOUNTYPE);                                            01676000
VALUE MOUNTYPE; LOGICAL MOUNTYPE;                                       01678000
OPTION PRIVILEGED,UNCALLABLE;                                           01680000
BEGIN                                                                   01682000
     <<VLAB MUST CONTAIN THE VOLUME LABEL OF THE VOLUME JUST            01684000
       MOUNTED IF ENTRY IS FOR A MOUNT RECOGNITION.                     01686000
     >>                                                                 01688000
                                                                        01690000
     LOGICAL MISCINFO,DEVINFO;                                          01692000
     ARRAY VNAME(0:15);                                                 01694000
     BYTE ARRAY VNAMEB(*) = VNAME;                                      01696000
     EQUATE                                                             01698000
          PVPMOUNT  = 12,  <<LOG ENTRY TYPE>>                           01700000
          VNAMELEN  = 16;  <<LENGTH OF VNAME ARRAY FOR LOG>>            01702000
                                                                        01704000
     VNAME:=0; MOVE VNAME(1):=VNAME,(15);                               01706000
     MISCINFO:=STATUS2.NREADYF                                          01708000
               CAT MOUNTYPE(13:15:1)                                    01710000
               CAT MOUNTSTAT(8:12:4)                                    01712000
               CAT VTABX(0:8:8);                                        01714000
     DEVINFO:=LDEV CAT LPDT((LDEV & LSL(1))+1)(4:12:4);                 01716000
     IF NOT STATUS2.NREADYF THEN  <<MOUNT ENTRY>>                       01718000
     IF MOUNTSTAT = VLDVOL OR MOUNTSTAT = SYSVOL THEN                   01720000
     BEGIN                                                              01722000
          MOVE VNAME:=VLAB(LVNAMELOC'),(4);                             01724000
          IF MOUNTSTAT = VLDVOL THEN  <<ITS A PRIVATE VOLUME>>          01726000
          MOVE VNAME(4):=VLAB(LANAMELOC'),(12);                         01728000
     END;                                                               01730000
     LOG12(MISCINFO,DEVINFO,VNAME,VNAMELEN,PVPMOUNT);                   01732000
END  << PVLOG12 >>;                                                     01734000
$PAGE                                                                   01736000
PROCEDURE PRTGENMSG (NUM);                                     <<01143>>01738000
VALUE NUM;   INTEGER NUM;                                      <<01143>>01740000
OPTION PRIVILEGED,UNCALLABLE;                                  <<RK.00>>01742000
BEGIN                                                          <<RK.00>>01744000
     GENMSG (PVERRMSGSET, NUM, %10000, LDEV,,,,, 0);           <<01143>>01746000
     PRINTMSG := FALSE;                                        <<01143>>01748000
END;                                                           <<RK.00>>01750000
$PAGE  "PROGEN - CREATE VOLUME ENTRIES"                        <<06273>>01752000
PROCEDURE CHECKNSD;                                            <<03723>>01754000
OPTION PRIVILEGED,UNCALLABLE;                                  <<03723>>01756000
                                                               <<03723>>01758000
BEGIN                                                          <<03723>>01760000
                                                               <<03723>>01762000
<< Called when PVPROC first awoken by PROGEN to interragate >> <<03723>>01764000
<< all ldevs for any mounted non-system domain discs and add>> <<03723>>01766000
<< them to the volume table.                                >> <<03723>>01768000
<< DB can be set anywhere.                                  >> <<03723>>01770000
                                                               <<03723>>01772000
                                                               <<03723>>01774000
                                                               <<03723>>01776000
DEFINE                                                         <<03723>>01778000
   NOT'ONLINE=   STATUS1.(14:1) = 1#,<< Device is not ready  >><<03723>>01780000
   VLABSIZE  =   128#;               << Size of disc label   >><<06273>>01782000
                                                               <<03723>>01784000
DOUBLE                                                         <<03723>>01786000
   STATUS;                                                     <<03723>>01788000
                                                               <<03723>>01790000
LOGICAL                                                        <<03723>>01792000
   STATUS0  = STATUS,                                          <<03723>>01794000
   STATUS1  = STATUS +1;                                       <<03723>>01796000
                                                               <<03723>>01798000
                                                               <<03723>>01800000
INTEGER                                                        <<03723>>01802000
   DST,                      << DST of stack upon entry >>     <<03723>>01804000
   HLDEV;                    << Max. ldev # configured  >>     <<03723>>01806000
                                                               <<03723>>01808000
SUBROUTINE DEF'MOVE'FROM'DST;                                  <<06273>>01810000
                                                               <<03723>>01812000
DST := EXCHANGEDB(0);        << Must be at stack >>            <<03723>>01814000
                                                               <<03723>>01816000
<< Get the zeroth entry of the LDT to find out how many    >>  <<03723>>01818000
<< LDEVs on the system.                                    >>  <<03723>>01820000
                                                               <<03723>>01822000
MOVE'FROM'DST (@LDT, LDT'DST, 0, SIZE'OF'LDT'ENTRY);           <<06273>>01824000
                                                               <<03723>>01826000
HLDEV := LDT'NUM'ENTRIES;                                      <<06273>>01828000
LDEV := 0;                                                     <<03723>>01830000
                                                               <<03723>>01832000
WHILE (LDEV := LDEV+1) <= HLDEV DO                             <<03723>>01834000
BEGIN                                                          <<03723>>01836000
   << Want to check all ldevs. Must be good ldev, and     >>   <<03723>>01838000
   << non-system domain disc before being added to the    >>   <<03723>>01840000
   << volume table. INITIAL will add all system           >>   <<03723>>01842000
   << discs to the table, and set all other entries to    >>   <<03723>>01844000
   << zero.                                               >>   <<03723>>01846000
                                                               <<03723>>01848000
   CHECKLDEV(LDEV);     << Make sure it's valid >>             <<03723>>01850000
   IF < THEN  GO AROUND;                                       <<03723>>01852000
                                                               <<03723>>01854000
   << Get the LDT entry to find out the device type       >>   <<03723>>01856000
                                                               <<03723>>01858000
   LDT'INDEX := LDEV * SIZE'OF'LDT'ENTRY;                      <<*8117>>01860000
   MOVE'FROM'DST (@LDT, LDT'DST, LDT'INDEX, SIZE'OF'LDT'ENTRY);<<*8117>>01862000
   LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;                    <<*8117>>01864000
   LDT'INDEX := 0;                                             <<06273>>01866000
                                                               <<03723>>01868000
   IF LDT'ACCESS'TYPE = LDT'DIRECT'ACCESS THEN                 <<06273>>01870000
   BEGIN        << It's a disc! >>                             <<03723>>01872000
      IF LPDT'NON'SYS'DOMAIN THEN                              <<06273>>01874000
      BEGIN     << Non-system domain >>                        <<03723>>01876000
                                                               <<03723>>01878000
         << Make sure it's on line >>                          <<03723>>01880000
                                                               <<03723>>01882000
         STATUS := REQSTATUS(LDEV);                            <<03723>>01884000
         IF <>  OR  NOT'ONLINE THEN  GO AROUND;                <<03723>>01886000
                                                               <<03723>>01888000
         << Now read the label >>                              <<03723>>01890000
                                                               <<03723>>01892000
         DISCIO(LDEV,R,VLAB,0D,VLABSIZE);                      <<03723>>01894000
         IF <> THEN                                            <<03723>>01896000
         BEGIN                                                 <<03723>>01898000
            STATUS := REQSTATUS(LDEV);                         <<03723>>01900000
            IF <> THEN GO AROUND;                              <<03723>>01902000
            ERR := STATUS1.TERMSTAT;                           <<03723>>01904000
            MOUNTSTAT := IF (ERR=7  LOR  ERR=%11)              <<03723>>01906000
                            THEN UNFVOL ELSE UNRVOL;           <<03723>>01908000
         END                                                   <<03723>>01910000
         ELSE                                                  <<03723>>01912000
         MOUNTSTAT:=IF SCRATCHVOL THEN SCRVOL ELSE             <<03723>>01914000
                    IF SYSTEMVOL THEN SYSVOL ELSE              <<03723>>01916000
                    IF SERIALVOL THEN SERVOL ELSE              <<03723>>01918000
                    IF FOREIGNVOL THEN UNKVOL ELSE             <<03723>>01920000
                    VLDVOL;                                    <<03723>>01922000
                                                               <<03723>>01924000
         IF MOUNTSTAT <> SYSVOL  THEN                          <<03723>>01926000
         BEGIN                                                 <<03723>>01928000
            VTABX := ADDTOVTAB(LDEV);                          <<03723>>01930000
            IF < THEN                                          <<03723>>01932000
            BEGIN                                              <<03723>>01934000
               PRTGENMSG(NOROOM99);                            <<03723>>01936000
               GO AROUND;                                      <<03723>>01938000
            END;                                               <<03723>>01940000
         END;                                                  <<03723>>01942000
                                                               <<03723>>01944000
         IF MOUNTSTAT = SERVOL THEN                            <<03723>>01946000
         BEGIN      << Serial disc >>                          <<03723>>01948000
            LPDT'RDY'SER'FRN'DISC := TRUE;                     <<06273>>01950000
            LPDT'SERIAL'OR'FOREIGN := LPDT'SERIAL;             <<06273>>01952000
         END                                                   <<03723>>01954000
         ELSE                                                  <<03723>>01956000
            IF MOUNTSTAT = UNKVOL  THEN                        <<03723>>01958000
            BEGIN      << Foreign disc >>                      <<03723>>01960000
               LPDT'RDY'SER'FRN'DISC := TRUE;                  <<06273>>01962000
               LPDT'SERIAL'OR'FOREIGN := LPDT'FOREIGN;         <<06273>>01964000
            END;                                               <<03723>>01966000
                                                               <<03723>>01968000
         << Create disc free space data segment for PV >>      <<03723>>01970000
                                                               <<03723>>01972000
         IF mountstat = vldvol THEN                            <<03723>>01974000
            BEGIN  << Private Volume >>                        <<03723>>01976000
                                                               <<03723>>01978000
               dfs'status := Create'Dfs'Data'Seg (ldev, vlab,  <<03723>>01980000
                                           FALSE, FALSE);      <<03723>>01982000
               IF NOT dfs'status THEN                          <<03723>>01984000
                  Process'Dfs'Error (ldev, dfs'status, 0);     <<03723>>01986000
                                                               <<03723>>01988000
            END;   << Private Volume >>                        <<03723>>01990000
                                                               <<03723>>01992000
       PVLOG12(1);                                             <<03723>>01994000
    END;                                                       <<03723>>01996000
 END;                                                          <<03723>>01998000
                                                               <<03723>>02000000
AROUND:                                                        <<03723>>02002000
END;                                                           <<03723>>02004000
                                                               <<03723>>02006000
EXCHANGEDB(DST);                                               <<03723>>02008000
                                                               <<03723>>02010000
END;      << Procedure CHECKNSD >>                             <<03723>>02012000
                                                               <<06273>>02014000
                                                                        02016000
$PAGE "PVPROC - AUTO-RECOGNITION LOOP (OUTER BLOCK)"                    02018000
SUBROUTINE DEF'MOVE'FROM'DST;                                  <<06273>>02020000
                                                                        02022000
<<******************* O-U-T-E-R  B-L-O-C-K ************************>>   02024000
                                                                        02026000
CHECKNSD;  <<LOOK FOR MOUNTED, NON-SYSTEM VOLUMES>>            <<06273>>02028000
IF ABSOLUTE(SYSUP) THEN                                        <<06273>>02030000
   WAIT(JUNK'WAIT,0)                                           <<S7487>>02032000
ELSE                                                           <<06273>>02034000
   AWAKE(ABSOLUTE(PROGENPINX),2,%20);                          <<06273>>02036000
PRT'READMSG:=FALSE;  <<READ ONLY SWITCH OFF>>                  <<06273>>02038000
                                                               <<06273>>02040000
<< Main loop >>                                                <<06273>>02042000
                                                               <<06273>>02044000
WHILE TRUE DO                                                  <<06273>>02046000
   BEGIN                                                       <<06273>>02048000
                                                               <<06273>>02050000
   << DVREC increments PVRECG'CNT and wake up PVPROC >>        <<06273>>02052000
                                                               <<06273>>02054000
   WHILE ABSOLUTE(PVRECG'CNT) > 0 DO  <<VOLUME MOUNTED>>       <<06273>>02056000
      BEGIN                                                    <<06273>>02058000
      DISABLE;                                                 <<06273>>02060000
      ABSOLUTE(PVRECG'CNT):=ABSOLUTE(PVRECG'CNT)-1;            <<06273>>02062000
      ENABLE;                                                  <<06273>>02064000
      PRINTMSG:=TRUE;  <<ASSUME VALID RECOGNITION>>            <<06273>>02066000
                                                               <<06273>>02068000
      << Find device which causes interrupt and process req. >><<06273>>02070000
                                                               <<06273>>02072000
      IF (LDEV := MOUNTEDLDEV) <> 0 THEN  <<VALID RECOGNITION>><<06273>>02074000
         BEGIN                                                 <<06273>>02076000
         MOUNTSTAT:=0;  <<ASSUME VALID PV VOLUME>>             <<06273>>02078000
                                                               <<06273>>02080000
         << Extract LDTX entry >>                              <<06273>>02082000
                                                               <<06273>>02084000
         MOVE'FROM'DST (@LDT, LDT'DST, 0, SIZE'OF'LDT'ENTRY);  <<06273>>02086000
         LDT'INDEX := 0;                                       <<06273>>02088000
         LDTX'OFFSET := LDEV * SIZE'OF'LDTX'ENTRY + LDTX'BASE; <<06273>>02090000
         MOVE'FROM'DST (@LDTX, LDT'DST, LDTX'OFFSET,           <<06273>>02092000
                        SIZE'OF'LDTX'ENTRY);                   <<06273>>02094000
         LDTX'INDEX := 0;                                      <<06273>>02096000
         LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;              <<*8117>>02098000
         DISC'STATUS := 0;                                     <<06273>>02100000
                                                               <<06273>>02102000
         << Check for unexpected interrupts                  >><<06273>>02104000
                                                               <<06273>>02106000
         IF CS'80  THEN                                        <<06273>>02108000
            BEGIN                                              <<06273>>02110000
                                                               <<06273>>02112000
            << PVPROC should ignore certain unexpected inter->><<06273>>02114000
            << rupts from CS80 discs. For example, when      >><<06273>>02116000
            << a disc does automatic head alignment, it gene->><<06273>>02118000
            << rates an unexpected interrurpt. In order to   >><<06273>>02120000
            << detect this situation, PVPROC will do a read  >><<06273>>02122000
            << status with special values for P1 and P2. If  >><<06273>>02124000
            << the driver wants us to ignore the interrupt,  >><<06273>>02126000
            << %101010 will be returned in the first word of >><<06273>>02128000
            << the status information.                       >><<06273>>02130000
                                                               <<06273>>02132000
            STATUS:=P'ATTACHIO(LDEV,0,0,@DISC'STATUS,          <<*7691>>02134000
                   STATUS'CS80,1,P1'CS80,P2'CS80,1);           <<06273>>02136000
            IF STATUS1.(13:3) <> 1 THEN                        <<06273>>02138000
               BEGIN      << Report I/O error to console     >><<06273>>02140000
               REPORT'IOERROR(LDEV,STATUS1.(8:8));             <<06273>>02142000
               GO WAIT1;                                       <<06273>>02144000
               END;                                            <<06273>>02146000
                                                               <<06273>>02148000
            IF DISC'STATUS = IGNORE'INT  THEN                  <<06273>>02150000
               BEGIN                                           <<06273>>02152000
                                                               <<06273>>02154000
               << Now want to reset the ownership bits>>       <<06273>>02156000
               << of the LPDT to whatever condition   >>       <<06273>>02158000
               << they were before this interrupt -   >>       <<06273>>02160000
               << the device may have been owned.     >>       <<06273>>02162000
                                                               <<06273>>02164000
               DISABLE;                                        <<06273>>02166000
               IF LPDT'RDY'SER'FRN'DISC AND                    <<06273>>02168000
                  LPDT'SERIAL'OR'FOREIGN = LPDT'SERIAL AND     <<06273>>02170000
                  LDTX'SDISC'GPT'XDS <> 0 THEN                 <<06273>>02172000
                  LPDT'DEV'OWN'STATE := LPDT'OWNED             <<06273>>02174000
               ELSE                                            <<06273>>02176000
                  LPDT'DEV'OWN'STATE := LPDT'NOT'OWNED;        <<06273>>02178000
               ENABLE;                                         <<06273>>02180000
               GO WAIT1;                                       <<06273>>02182000
               END;                                            <<06273>>02184000
            END;                                               <<06273>>02186000
                                                               <<06273>>02188000
         << Check the device state - ON-LINE / OFF-LINE      >><<06273>>02190000
                                                               <<06273>>02192000
         STATUS:=REQSTATUS(LDEV);                              <<06273>>02194000
         IF <> THEN                                            <<06273>>02196000
            BEGIN                                              <<06273>>02198000
            PRTGENMSG(IOFAIL);                                 <<06273>>02200000
            GO WAIT1;                                          <<06273>>02202000
            END;                                               <<06273>>02204000
                                                               <<06273>>02206000
                                                               <<06273>>02208000
         IF STATUS2.READ'SWITCH = 1 THEN                       <<06273>>02210000
            PRT'READMSG := TRUE  <<Device is set to read only>><<06273>>02212000
         ELSE                                                  <<06273>>02214000
            PRT'READMSG := FALSE;                              <<06273>>02216000
                                                               <<06273>>02218000
         IF STATUS2.NREADYF THEN                               <<06273>>02220000
            BEGIN                                              <<06273>>02222000
                                                               <<06273>>02224000
            <<***********************************************>><<06273>>02226000
            << Service an OFF-LINE interrupt                 >><<06273>>02228000
            <<***********************************************>><<06273>>02230000
                                                               <<06273>>02232000
            IF LPDT'MOUNTED'PV THEN                            <<06273>>02234000
                                                               <<06273>>02236000
               << Private Volume in use >>                     <<06273>>02238000
                                                               <<06273>>02240000
               PRTGENMSG (INUSE'PVDISM)                        <<06273>>02242000
            ELSE                                               <<06273>>02244000
                                                               <<06273>>02246000
               << Check if serial disc in use >>               <<06273>>02248000
                                                               <<06273>>02250000
               IF LPDT'RDY'SER'FRN'DISC AND                    <<06273>>02252000
                  LPDT'SERIAL'OR'FOREIGN = LPDT'SERIAL AND     <<06273>>02254000
                  LDTX'SDISC'GPT'XDS <> 0 THEN                 <<06273>>02256000
                                                               <<06273>>02258000
               << Serial disc in use >>                        <<06273>>02260000
                                                               <<06273>>02262000
                  BEGIN                                        <<06273>>02264000
                  PRTGENMSG (INUSE'SERDISM);                   <<06273>>02266000
                  VTABX:=DELFRVTAB(LDEV);                      <<06273>>02268000
                  << Remove from Tape Label Table >>           <<06273>>02270000
                  CLEANLDEV(LDEV);                             <<06273>>02272000
                  END                                          <<06273>>02274000
                                                               <<06273>>02276000
               ELSE                                            <<06273>>02278000
                                                               <<06273>>02280000
               << Check if foreign disc in use >>              <<06273>>02282000
                                                               <<06273>>02284000
                  IF LPDT'RDY'SER'FRN'DISC AND                 <<06273>>02286000
                     LPDT'SERIAL'OR'FOREIGN = LPDT'FOREIGN AND <<06273>>02288000
                     LDTX'FDISC'ALLOC <> 0 THEN                <<06273>>02290000
                                                               <<06273>>02292000
                  << Foreign disc in use >>                    <<06273>>02294000
                                                               <<06273>>02296000
                     BEGIN                                     <<06273>>02298000
                     << Flush !!!!!!!! >>                      <<07327>>02300000
                     FLUSH'CACHE (LDEV,0D,%17777777777 D);     <<07327>>02302000
                                                               <<07327>>02304000
                     PRTGENMSG(INUSE'FORDMT);                  <<06273>>02306000
                     VTABX:=DELFRVTAB(LDEV);                   <<06273>>02308000
                     END                                       <<06273>>02310000
                  ELSE                                         <<06273>>02312000
                                                               <<06273>>02314000
                  << Device is not in use.                   >><<06273>>02316000
                                                               <<06273>>02318000
                     BEGIN                                     <<06273>>02320000
                                                               <<06273>>02322000
                     << Flush !!!!!!!!!! >>                    <<07327>>02324000
                     FLUSH'CACHE (LDEV,0D,%17777777777 D);     <<07327>>02326000
                                                               <<07327>>02328000
                     << Remove entry from Volume Table       >><<06273>>02330000
                     << Delete disc free space data segment. >><<06273>>02332000
                     << If serial disc then remove entry from>><<06273>>02334000
                     << Tape Label Table.                    >><<06273>>02336000
                                                               <<06273>>02338000
                     VTABX:=DELFRVTAB(LDEV);                   <<06273>>02340000
                     IF = THEN                                 <<06273>>02342000
                        << Entry found >>                      <<06273>>02344000
                        PRTGENMSG (VOL'DISMOUNT)               <<06273>>02346000
                     ELSE                                      <<06273>>02348000
                        BEGIN                                  <<06273>>02350000
                        MSGLOC:=34;                            <<06273>>02352000
                        MOVE MSG:=("(VOLUME MOUNTED)",CR,LF,   <<06273>>02354000
                                   "        DISMOUNT");        <<06273>>02356000
                        END;                                   <<06273>>02358000
                                                               <<06273>>02360000
                     IF NOT LDTX'SERIAL'OR'FOREIGN             <<S7487>>02362000
                        THEN DELETE'DFS'DATA'SEG (LDEV);       <<S7487>>02364000
                                                               <<06273>>02366000
                     END;                                      <<06273>>02368000
            DISABLE;                                           <<06273>>02370000
            LPDT'RDY'SER'FRN'DISC := FALSE;                    <<06273>>02372000
            ENABLE;                                            <<06273>>02374000
            END                                                <<06273>>02376000
         ELSE                                                  <<06273>>02378000
                                                               <<06273>>02380000
            <<***********************************************>><<06273>>02382000
            << Service an ON-LINE interrupt                  >><<06273>>02384000
            <<***********************************************>><<06273>>02386000
                                                               <<06273>>02388000
                                                               <<06273>>02390000
            IF NOT LPDT'MOUNTED'PV THEN                        <<06273>>02392000
               BEGIN                                           <<06273>>02394000
                                                               <<06273>>02396000
               << Volume was not in use.                    >> <<06273>>02398000
               << Read volume label                         >> <<06273>>02400000
                                                               <<06273>>02402000
               DISCIO (LDEV, R, VLAB, 0D, 128);                <<06273>>02404000
               IF <> THEN                                      <<06273>>02406000
                  BEGIN                                        <<06273>>02408000
                                                               <<06273>>02410000
                  << Unable to read a volume label.         >> <<06273>>02412000
                  << Create entry in volume table.          >> <<06273>>02414000
                                                               <<06273>>02416000
                  VTABX:=ADDTOVTAB(LDEV,%1);                   <<06273>>02418000
                  IF < THEN                                    <<06273>>02420000
                     PRTGENMSG (NOROOM98)                      <<06273>>02422000
                  ELSE                                         <<06273>>02424000
                     BEGIN                                     <<06273>>02426000
                     STATUS:=REQSTATUS(LDEV);                  <<06273>>02428000
                     IF <> THEN                                <<06273>>02430000
                        BEGIN                                  <<06273>>02432000
                        PRTGENMSG(IOFAIL);                     <<06273>>02434000
                        GO WAIT1;                              <<06273>>02436000
                        END;                                   <<06273>>02438000
                                                               <<06273>>02440000
                     ERR:=STATUS1.TERMSTAT;                    <<06273>>02442000
                     IF (ERR=7 LOR ERR=%11) THEN               <<06273>>02444000
                        BEGIN                                  <<06273>>02446000
                        MOUNTSTAT:=UNFVOL;                     <<06273>>02448000
                        PRTGENMSG(UNFORMVOL);                  <<06273>>02450000
                        END                                    <<06273>>02452000
                     ELSE                                      <<06273>>02454000
                        BEGIN                                  <<06273>>02456000
                        MOUNTSTAT:=UNRVOL;                     <<06273>>02458000
                        PRTGENMSG(UNREADLAB);                  <<06273>>02460000
                        END;                                   <<06273>>02462000
                     END;                                      <<06273>>02464000
                  END                                          <<06273>>02466000
               ELSE                                            <<06273>>02468000
                                                               <<06273>>02470000
               << Private volume, serial or foreign disc,   >> <<06273>>02472000
               << scratch volume.                           >> <<06273>>02474000
                                                               <<06273>>02476000
                  BEGIN                                        <<06273>>02478000
                  TOS := @MSG;                                 <<06273>>02480000
                  MSGLOC := 0;                                 <<06273>>02482000
                                                               <<06273>>02484000
                  << Create entry in volume table.          >> <<06273>>02486000
                                                               <<06273>>02488000
                  VTABX:=ADDTOVTAB(LDEV);                      <<06273>>02490000
                  IF < THEN                                    <<06273>>02492000
                     PRTGENMSG (NOROOM99)                      <<06273>>02494000
                  ELSE                                         <<06273>>02496000
                     BEGIN                                     <<06273>>02498000
                     IF CARRY THEN                             <<06273>>02500000
                        BEGIN                                  <<06273>>02502000
                        MOVE *:=("(VOLUME DISMOUNTED) ",CR,LF, <<*8899>>02504000
                                 "        "),2;                <<06273>>02506000
                        MSGLOC:=30;                            <<06273>>02508000
                        DISABLE;                               <<06273>>02510000
                        LPDT'RDY'SER'FRN'DISC := FALSE;        <<06273>>02512000
                        ENABLE;                                <<06273>>02514000
                        END;                                   <<06273>>02516000
                                                               <<06273>>02518000
                     CASE DISCTYPE(LDEV,VLAB) OF               <<06273>>02520000
                                                               <<06273>>02522000
                     << Process request according to volume  >><<06273>>02524000
                     << type using info from the volume label>><<06273>>02526000
                                                               <<06273>>02528000
                     BEGIN                                     <<06273>>02530000
                                                               <<06273>>02532000
                     << System volume >>                       <<06273>>02534000
                                                               <<06273>>02536000
                        BEGIN                                  <<06273>>02538000
                        MOUNTSTAT:=SYSVOL;                     <<06273>>02540000
                        MSGLOC:=MSGLOC+13;                     <<06273>>02542000
                        MOVE  * :="SYSTEM VOLUME";             <<06273>>02544000
                        END;                                   <<06273>>02546000
                                                               <<06273>>02548000
                     << Private volume >>                      <<06273>>02550000
                                                               <<06273>>02552000
                        BEGIN                                  <<06273>>02554000
                        MOVE NAME:=VLABB(LVNAMELOC),(8);       <<06273>>02556000
                        MOVE  * :=NAME WHILE AN,1;             <<06273>>02558000
                        MOVE * :=" OF ",2;                     <<06273>>02560000
                        MOVE NAME:=VLABB(LVSNAMELOC),(8);      <<06273>>02562000
                        MOVE * :=NAME WHILE AN,1;              <<06273>>02564000
                        MOVE * :=".",2;                        <<06273>>02566000
                        MOVE NAME:=VLABB(LGNAMELOC),(8);       <<06273>>02568000
                        MOVE * :=NAME WHILE AN,1;              <<06273>>02570000
                        MOVE * :=".",2;                        <<06273>>02572000
                        MOVE NAME:=VLABB(LANAMELOC),(8);       <<06273>>02574000
                        MOVE * :=NAME WHILE AN,1;              <<06273>>02576000
                        MSGLOC:=TOS-@MSG;                      <<06273>>02578000
                                                               <<06273>>02580000
                        << Create disc free space data      >> <<06273>>02582000
                        << segment when device is UP.       >> <<06273>>02584000
                                                               <<06273>>02586000
                        MOVE'FROM'DST (@LDT, LDT'DST,          <<06273>>02588000
                           LDEV * SIZE'OF'LDT'ENTRY,           <<06273>>02590000
                           SIZE'OF'LDT'ENTRY);                 <<06273>>02592000
                                                               <<06273>>02594000
                        IF LDT'AVAIL'TO'SYS THEN               <<06273>>02596000
                           BEGIN                               <<06273>>02598000
                           DFS'STATUS := CREATE'DFS'DATA'SEG   <<06273>>02600000
                              (LDEV, VLAB, FALSE, FALSE);      <<06273>>02602000
                           IF NOT DFS'STATUS THEN              <<06273>>02604000
                              PROCESS'DFS'ERROR (LDEV,         <<06273>>02606000
                                 DFS'STATUS, 0);               <<06273>>02608000
                           END;                                <<06273>>02610000
                        END;                                   <<06273>>02612000
                                                               <<06273>>02614000
                     << Serial disc >>                         <<06273>>02616000
                                                               <<06273>>02618000
                        BEGIN                                  <<06273>>02620000
                        MOUNTSTAT:=SERVOL;                     <<06273>>02622000
                        MSGLOC:=MSGLOC+11;                     <<06273>>02624000
                        MOVE  * :="SERIAL DISC";               <<06273>>02626000
                        DISABLE;                               <<06273>>02628000
                        LPDT'RDY'SER'FRN'DISC := TRUE;         <<06273>>02630000
                        LPDT'SERIAL'OR'FOREIGN := LPDT'SERIAL; <<06273>>02632000
                        ENABLE;                                <<06273>>02634000
                        IF LDTX'SDISC'GPT'XDS <> 0 THEN        <<S7487>>02636000
                           BEGIN                               <<06273>>02638000
                           << Check if was reel switch.      >><<06273>>02640000
                           REEL'SWITCH (LDEV);                 <<06273>>02642000
                           DISABLE;                            <<06273>>02644000
                           LPDT'DEV'OWN'STATE := LPDT'OWNED;   <<06273>>02646000
                           ENABLE;                             <<06273>>02648000
                           WAKE'SDISC'PROCESS;                 <<S7487>>02650000
                           GO TO SERIALREMOUNT;                <<06273>>02652000
                           END                                 <<06273>>02654000
                        ELSE                                   <<06273>>02656000
                           LABELED'SDISC;                      <<S7487>>02658000
                           ;                                   <<06273>>02660000
                        END;                                   <<06273>>02662000
                                                               <<06273>>02664000
                     << Scratch volume >>                      <<06273>>02666000
                                                               <<06273>>02668000
                        BEGIN                                  <<06273>>02670000
                        MOUNTSTAT:=SCRVOL;                     <<06273>>02672000
                        MSGLOC:=MSGLOC+14;                     <<06273>>02674000
                        MOVE  * :="SCRATCH VOLUME"; <<FDF>>    <<06273>>02676000
                        END;                                   <<06273>>02678000
                                                               <<06273>>02680000
                     << Foreign volume >>                      <<06273>>02682000
                                                               <<06273>>02684000
                        BEGIN                                  <<06273>>02686000
                        MOUNTSTAT:=UNKVOL;                     <<06273>>02688000
                        MSGLOC:=MSGLOC+14;                     <<06273>>02690000
                        MOVE  * :="FOREIGN VOLUME";            <<06273>>02692000
                        DISABLE;                               <<06273>>02694000
                        LPDT'RDY'SER'FRN'DISC := TRUE;         <<06273>>02696000
                        LPDT'SERIAL'OR'FOREIGN := LPDT'FOREIGN;<<06273>>02698000
                        ENABLE;                                <<06273>>02700000
                        IF LDTX'FDISC'ALLOC <> 0 THEN          <<06273>>02702000
                           BEGIN                               <<S7487>>02704000
                           WAKE'SDISC'PROCESS;                 <<S7487>>02706000
                           GO TO INUSEREMOUNT;                 <<06273>>02708000
                           END;                                <<S7487>>02710000
                        END;                                   <<06273>>02712000
                                                               <<06273>>02714000
                     END; << OF CASE ON DISCTYPE >>            <<06273>>02716000
                     WAKE'SDISC'PROCESS;                       <<S7487>>02718000
                     END; ! of room in the VTAB.               <<S7487>>02720000
                  END; ! of good DISCIO on label read.         <<S7487>>02722000
               END ! of went online.                           <<S7487>>02724000
            ELSE                                               <<06273>>02726000
                                                               <<06273>>02728000
               << Device was previously in use.             >> <<06273>>02730000
                                                               <<06273>>02732000
INUSEREMOUNT:  PRTGENMSG(INUSE'REMOUNT);                       <<06273>>02734000
                                                               <<06273>>02736000
SERIALREMOUNT:                                                 <<06273>>02738000
            PVLOG12(0);  << MAKE LOG ENTRY >>                  <<06273>>02740000
            IF PRINTMSG THEN  <<VALID MOUNT/DISMOUNT>>         <<06273>>02742000
               BEGIN                                           <<06273>>02744000
               MSG(MSGLOC+13):=0;  <<GENMSG STOP>>             <<06273>>02746000
               MOVE MSG(MSGLOC):=" ON LDEV#    ";              <<06273>>02748000
               ASCII(LDEV,10,MSG(MSGLOC+10));                  <<06273>>02750000
               GENMSG(-1,@MSG,,,,,,,0);                        <<06273>>02752000
               IF PRT'READMSG THEN GENMSG                      <<06273>>02754000
               (PVERRMSGSET,READ'ONLY,%10000,,,,,,0);          <<06273>>02756000
               END;                                            <<06273>>02758000
            END; ! of MOUNTEDLDEV found one to process.        <<S7487>>02760000
WAIT1:                                                         <<07418>>02762000
        END; ! of WHILE PVRECG count greater than zero.        <<S7487>>02764000
                                                               <<06273>>02766000
                                                               <<06273>>02768000
        WAIT(-JUNK'WAIT,0); ! Wait for next inturrupt.         <<S7487>>02770000
   END; ! Loop forever and ever, AMEN.                         <<S7487>>02772000
HELP;                                                          <<06273>>02774000
END.                                                           <<06273>>02776000
