         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
$INCLUDE INCLMVTB                                              <<01232>>00065000
<< Fixed PLABEL to print 6 digits of directory size.         >><<P9265>>00107000
<< Several procedures used to set LPDT'RDY'SER'FRN'DISC and >> <<A9301>>00107001
<< LPDT'SERIAL to indicate a mounted serial  disc.  All  of >> <<A9301>>00107002
<< these  references  have been deleted, because these bits >> <<A9301>>00107003
<< must indicate an unmounted serial disc or other routines >> <<A9301>>00107004
<< which wake PVPROC to do automatic AVR will  not  do  so. >> <<A9301>>00107005
<< The  FOREIGN command processor still sets these bits ap- >> <<A9301>>00107006
<< propriately for foreign discs so that  the  "IF  FOREIGN >> <<A9301>>00107007
<< THEN  INAPPROPRIATE" tests in several command processors >> <<A9301>>00107008
<< will continue to work.  All remaining  statements  which >> <<A9301>>00107009
<< set bits in the LPDT have been bracketed by DISABLE/ENA- >> <<A9301>>00107010
<< BLE statements, in accordance with MPE conventions.      >> <<A9301>>00107011
<< Fixed SF672 which occurred if disc cacheing was enabled on>><<d9301>>00107100
<< the FROM device and a read error occurred during COPY.    >><<d9301>>00107200
<< Fixed by changing all disc ATTACHIO calls to P'ATTACHIO.  >><<d9301>>00107300
<<    Kludged serial disc labels for cartridges to read      >><<*9351>>00107301
<< subtype 0, whether it's a Buffalo or Linus.               >><<*9351>>00107302
<< Fixed Invalid Address -- Module 5 caused by doing an INIT >><<09964>>00107400
<< which caused an SET'ADDR'SEC command for a 7935 to be     >><<09964>>00107410
<< send through SIODM to driver.  However, transfer count    >><<09964>>00107420
<< was 0 which causes SIODM not to convert DST/offset to     >><<09964>>00107430
<< bank/address.  Driver then does LSEA from DST/offset and  >><<09964>>00107440
<< causes the error.                                         >><<09964>>00107450
<< Fixed SF206 caused by DEF'PUT'FILE'NAME leaving two       >><<09965>>00107500
<< addresses on the stack.  Also, the subroutine was using   >><<09965>>00107510
<< BUF'PTR which was not initialized.  DISCIO was using      >><<09965>>00107520
<< FL = 41 instead of %41.                                   >><<09965>>00107530
<< Fixed SF206 caused by CONDENSE'DISC not allocating enough >><<v9997>>00107540
<< array space if the volume table is greater than 16 discs. >><<v9997>>00107550
<< Now, max discs is set to 64 (max size of volume table)    >><<v9997>>00107560
<< instead of 16.  An error is returned if Volume table is   >><<v9997>>00107570
<< greater than 64.                                          >><<v9997>>00107580
<<Enhancement to support Eagle, Eaglet and Merlin           >> <<11468>>00107600
<<                                                           >><<l1542>>00107610
<<  Oct. 85 - In Verify'Media, SIZE was never calculated for >><<l1542>>00107620
<<  CS80 devices.  If sector 0 was defective on a cartridge  >><<l1542>>00107630
<<  tape, an endless loop occurred.  SIZE is now calculated  >><<l1542>>00107640
<<  before all bad address checks to either CS80 or Non-CS80 >><<l1542>>00107650
<<  devices.                                                 >><<l1542>>00107660
<< Enhancement to support 7937, 7938, 7957, 7958 as foreign  >><<02348>>00107670
<< disc                                                      >><<02348>>00107680
EQUATE max'discs = 64; << max amount of discs configurable >>  <<v9997>>00284000
     VTABSIR   = 22;                                           <<01232>>00300000
$EDIT VOID=00304000                                            <<01232>>00302000
$EDIT VOID=00660000                                            <<01232>>00654000
<< Volume Table Defines >>                                     <<01232>>00662000
                                                               <<01232>>00664000
DEFINE ldevf = (0:8)#;                                         <<01232>>00666000
DEFINE vol'table'no'ent = (0:8)#;                              <<v9997>>00669000
EQUATE size'of'vtab'entry = %16;                               <<s1297>>00672000
DEFINE non'sys = (14:1)#;                                      <<v9997>>00675000
DEFINE mvtabxf = (8:8)#;                                       <<01232>>00681000
     VDVENTSIZEB  = 12;                                        <<01232>>00886000
$EDIT VOID=00888000                                            <<01232>>00888000
DEFINE DISABLE = ASSEMBLE(SED 0)#,                             <<A9301>>00980000
       ENABLE  = ASSEMBLE(SED 1)#;                             <<A9301>>00981000
   MOVE * := ".",2;                                            <<09965>>01114000
   MOVE * := BBUFFER (20) WHILE AN,1;                          <<09965>>01118000
   MOVE * := ".",2;                                            <<09965>>01120000
   MOVE * := BBUFFER (20) WHILE AN,1;                          <<09965>>01124000
      ,vierr140 = 240 <<Disc Cache Errror on Fdev>>            <<d9301>>01538100
      ,vierr141 = 241 <<Disc Cache error on Tdev>>             <<d9301>>01538200
      ,vierr142 = 242 <<Volume Table has too many entries>>    <<v9997>>01538300
$EDIT VOID=01664000                                            <<01232>>01658000
$EDIT VOID=01892000                                            <<01232>>01884000
DOUBLE PROCEDURE P'attachio (ldnum, qmisc, dstx, offset,       <<d9301>>02368100
                 function, count, p1, p2, flags,               <<d9301>>02368200
                 extent'base, extent'length);                  <<d9301>>02368300
   VALUE ldnum, qmisc, dstx, offset, function, count, p1,      <<d9301>>02368400
         p2, flags, extent'base, extent'length;                <<d9301>>02368500
   INTEGER ldnum, qmisc, dstx, offset, function, count, p1,    <<d9301>>02368600
           p2, flags, extent'length;                           <<d9301>>02368700
   DOUBLE extent'base;                                         <<d9301>>02368800
   OPTION PRIVILEGED, UNCALLABLE, EXTERNAL, VARIABLE;          <<d9301>>02368900
                                                                        02369000
PROCEDURE Uncache'Ldev (ldev, statr);                          <<d9301>>02369100
   VALUE ldev;                                                 <<d9301>>02369200
   INTEGER ldev, statr;                                        <<d9301>>02369300
   OPTION PRIVILEGED, UNCALLABLE, EXTERNAL;                    <<d9301>>02369400
                                                                        02369500
PROCEDURE Cache'Ldev (ldev, statr);                            <<d9301>>02369600
   VALUE ldev;                                                 <<d9301>>02369700
   INTEGER ldev, statr;                                        <<d9301>>02369800
   OPTION PRIVILEGED, UNCALLABLE, EXTERNAL;                    <<d9301>>02369900
     INTEGER DST,FL := 1;                                      <<d9301>>02806000
$EDIT VOID=02824000                                            <<d9301>>02816000
     TOS:=P'ATTACHIO(LDEV,0,0,@BUFP,SET'ADDR'SEC,2,0,0,FL);    <<09964>>02848000
     TOS:=P'ATTACHIO(LDEV,0,DST,@BUFP,FUNCT,WC,ADDR1,ADDR2,FL);<<d9301>>02878000
     IF FL = BLOCKED'IO THEN                                   <<d9301>>02884000
LOGICAL PROCEDURE VOLUME'MOUNTED (LDEV, VOLUME'INDEX,          <<01232>>03256000
                                  MVTAB'INDEX, VOL'SET'LDEV);  <<01232>>03258000
INTEGER VOLUME'INDEX,MVTAB'INDEX;                              <<01232>>03264000
INTEGER MSGNUM,MVTABX,I,VOL'INDEX,COND'INDEX,VOLUME'COUNT;     <<01232>>03284000
ARRAY MVTAB (*) = VLAB;                                        <<01232>>03292000
SUBROUTINE DEF'MOVE'FROM'DST;                                  <<01232>>03309000
   MOVE'FROM'DST (@MVTAB,MVTAB'DST,MVTABX*SIZE'OF'MVTAB'ENTRY, <<01232>>03362000
                  SIZE'OF'MVTAB'ENTRY);                        <<01232>>03363000
   I := 0;                                                     <<01232>>03372000
   WHILE (I:=I+1) <= VOLUME'COUNT DO                           <<01232>>03374000
      BEGIN                                                    <<01232>>03375000
      VOL'INDEX := SIZE'OF'MVTAB'VS'HEAD + (SIZE'OF'VOL'ENTRY  <<01232>>03376000
                   * (I-1));                                   <<01232>>03378000
      IF (VOLSETLDEV (I) := MVTAB'VOL'LDEV) = 0 THEN           <<01232>>03380000
      END;                                                     <<01232>>03389000
   MVTABX := 0;                                                <<01232>>03402000
   MOVE'FROM'DST (@VOL'ENT, VTABDST, 0, SIZE'OF'VTAB'ENTRY);   <<01232>>03404000
   VOLUME'COUNT := VOL'ENT (NUM'SYS'VOL);                      <<01232>>03406000
$EDIT VOID=03412000                                            <<01232>>03408000
      MOVE'FROM'DST (@VOL'ENT, VTABDST, I*SIZE'OF'VTAB'ENTRY,  <<01232>>03428000
                     SIZE'OF'VTAB'ENTRY);                      <<01232>>03430000
$EDIT VOID=03442000                                            <<01232>>03442000
   IF (SUBTYPE = ST'9110 LOR SUBTYPE = ST'9144 LOR             <<*1468>>03550000
      SUBTYPE = ST'HP35401A) THEN                                       03551000
                                                                        03551100
   DISCIO(LDEV,SPARE'BLOCK,DISC'ADDR,RETAIN'DATA,2,IOSTATUS);  <<09964>>05072000
   DISCIO(LDEV,SPARE'BLOCK,DISC'ADDR,NO'RETAIN'DATA,2,         <<09964>>05218000
       DISCIO(LDEV,SPARE'BLOCK,ADDR,NO'RETAIN'DATA,2,IOSTATUS);<<09964>>07928000
            IF (SUBTYPE = ST'9110 LOR SUBTYPE = ST'9144 LOR    <<*1468>>08284000
               SUBTYPE = ST'HP35401A) THEN                     <<*1468>>08285000
                                                                        08285100
               BEGIN   << Linus or Buffalo or Merlin >>        <<*1468>>08286000
                          SUBTYPE <> ST'9144 LAND              <<*1468>>09132000
                          SUBTYPE <> ST'HP35401A) THEN         <<*1468>>09133000
                                                                        09133100
                                                                        09133200
        DISABLE;                                               <<A9301>>09349000
        ENABLE;                                                <<A9301>>09353000
<< NOTE:  The comments and code from here to the end of the >> <<A9301>>09360100
<< procedure are obsolete, except perhaps for the final  IF >> <<A9301>>09360200
<< statement (Dtype = 3 or 4), which is the only reason all >> <<A9301>>09360300
<< of this is left in here.  We now do NOT want to set bits >> <<A9301>>09360400
<< in the LPDT, because this will  prevent  other  routines >> <<A9301>>09360500
<< from  waking PVPROC to do AVR on serial discs which were >> <<A9301>>09360600
<< loaded when the system came up.                          >> <<A9301>>09360700
                                                               <<A9301>>09360800
   <<   IF Dtype = 2 THEN                                      <<A9301>>09450000
   <<      BEGIN                                               <<A9301>>09452000
   <<      LPDT'RDY'SER'FRN'DISC := TRUE;                      <<A9301>>09454000
   <<      LPDT'SERIAL'OR'FOREIGN := LPDT'SERIAL;              <<A9301>>09456000
   <<      END                                                 <<A9301>>09458000
   <<   ELSE >>  IF Dtype = 3 LOR Dtype = 4 THEN               <<A9301>>09460000
   DISCIO (LDEV,SPARE'BLOCK,ADDR,NO'RETAIN'DATA,2,IOSTATUS);   <<09964>>10424000
   LOCK'DFS'DATA'SEG (LDEV);                                   <<d9301>>10681000
   SIZE := IF (DISC'SIZE - ADDR) * DBL(SECSIZE) >=             <<l1542>>11092100
           DBL(BUFFSIZE + 1)  THEN                             <<l1542>>11092200
                BUFFSIZE + 1                                   <<l1542>>11092300
           ELSE                                                <<l1542>>11092400
                INT (DISC'SIZE - ADDR) * SECSIZE;              <<l1542>>11092500
$EDIT VOID=11128000                                            <<l1542>>11124000
             trklen,fsubtype,tsubtype,                         <<d9301>>12026000
             cached'fdev, cached'tdev, cache'stat;             <<d9301>>12027000
     EQUATE cache'error    = 2;                                <<d9301>>12095000
     EQUATE cached         = 0;                                <<d9301>>12095100
$EDIT VOID=12214000                                            <<A9301>>12200000
<< Stop disc caching if any on both to and from devices     >> <<d9301>>12338100
     UNCACHE'LDEV (FDEV, CACHED'FDEV);                         <<d9301>>12338200
     IF CACHED'FDEV = CACHE'ERROR THEN                         <<d9301>>12338300
        BEGIN                                                  <<d9301>>12338400
        GENMSG (PVMSGSET, VIERR140);                           <<d9301>>12338500
        GOTO XIT;                                              <<d9301>>12338600
        END;                                                   <<d9301>>12338700
     UNCACHE'LDEV (TDEV, CACHED'TDEV);                         <<d9301>>12338800
     IF CACHED'TDEV = CACHE'ERROR THEN                         <<d9301>>12338900
        BEGIN                                                           12339000
        GENMSG (PVMSGSET, VIERR141);                           <<d9301>>12339100
        GOTO XIT;                                              <<d9301>>12339200
        END;                                                   <<d9301>>12339300
                                                                        12339400
$EDIT VOID=12502000                                                     12500000
$EDIT VOID=12510000                                                     12508000
           BEGIN                                               <<d9301>>12522100
           WAITFORIO(WIOQ);  << clean up write IOQ >>          <<d9301>>12523000
           END;                                                <<d9301>>12525000
     DISABLE;                                                  <<A9301>>12684200
     LPDT'RDY'SER'FRN'DISC := FALSE;                           <<A9301>>12684400
     ENABLE;                                                   <<A9301>>12684600
     IF CACHED'FDEV = CACHED THEN CACHE'LDEV(FDEV,CACHE'STAT); <<d9301>>12697000
     IF CACHED'TDEV = CACHED THEN CACHE'LDEV(TDEV,CACHE'STAT); <<d9301>>12697100
          MVTAB(*)     = BUFF;                                 <<01232>>12852000
     DOUBLE ARRAY MVTABD(*) = BUFF;                            <<01232>>12854000
     INTEGER VOL'INDEX;   << offset into MVTAB >>              <<01232>>12865000
     SUBROUTINE DEF'MOVE'FROM'DST;                             <<01232>>12935000
          MOVE'FROM'DST (@MVTAB, MVTAB'DST,                    <<01232>>13208000
                         MVTABX * SIZE'OF'MVTAB'ENTRY,         <<01232>>13209000
                         SIZE'OF'MVTAB'ENTRY);                 <<01232>>13209100
               VOL'INDEX := SIZE'D'OF'MVTAB'VS'HEAD + I;       <<01232>>13214000
               IF MVTABD'VOL'ENTRY <> 0D THEN                  <<01232>>13215000
                    VOL'INDEX := SIZE'OF'MVTAB'VS'HEAD +       <<01232>>13217000
                                 (SIZE'OF'VOL'ENTRY * I);      <<01232>>13217100
                    VDTAB(I):=MVTAB'VOL'LDEV;                  <<01232>>13218000
$EDIT VOID=13262000                                            <<01232>>13260000
     DOUBLE Ddirsize;                                          <<P9265>>14161000
                    "  Dir. Base:     , Dir. Size:       ";    <<*9351>>14288000
                    Ddirsize := double(vlab(ldirsize));        <<P9265>>14292000
                    Dascii(Ddirsize,10,pbuf(30));              <<P9265>>14293000
                    FWRITE(OUTF,PBUFW,-36,0);                  <<P9265>>14294000
           IF (Subtype = St'9110 LOR Subtype = St'9144 LOR     <<*1468>>14580000
              Subtype = St'HP35401A) THEN                      <<*1468>>14581000
                                                                        14581100
        << Linus and Buffalo and Merlin don't have a DSCT.   >><<*1468>>14586000
  2(-1),  << HP7914, HP7945 invalid >>                         <<*1468>>15598000
  6,      << HP35401A >>                                       <<*1468>>15599000
  -1,     << invalid >>                                        <<*1468>>15599100
                                                                        15599200
  2(-1),  << HP7936, HP7937 - invalid>>                        <<E1468>>15601000
  5(-1);  << Null >>                                           <<01468>>15602000
          << Kludge for SDC:  Make all cartridges subtype 0 >> <<*9351>>15707000
          << in the serial disc label, even though Buffalo  >> <<*9351>>15707100
          << is really subtype 3.  This is for purposes of  >> <<*9351>>15707200
          << media and drive compatibility between Linus,   >> <<*1468>>15707300
          << Buffalo and Merlin.                            >> <<*1468>>15707400
                                                               <<*9351>>15707500
          Subtype := 0;                                        <<*9351>>15710000
  IF (SUBTYPE > ST'9110 LAND SUBTYPE <> ST'9144 LAND           <<*1468>>15858000
     SUBTYPE <> ST'HP35401A) THEN                              <<*1468>>15859000
                                                                        15859100
$EDIT VOID=16040000                                            <<A9301>>16038000
  9,      << HP7936, >>                                        <<E2348>>16157000
  10,     << HP7937, >>                                        <<02348>>16157100
  11,     << HP7957, >>                                        <<02348>>16157200
  12,     << HP7958, >>                                        <<02348>>16157300
  2(-1);  << Null   >>                                         <<l1468>>16158000
DISABLE;                                                       <<A9301>>16287000
ENABLE;                                                        <<A9301>>16291000
$EDIT VOID=18610000                                            <<01232>>18610000
            Relsir (mvtab'sir, mvtab'sir'flag);                <<01232>>18864000
   MOVE'FROM'DST (@TEMP, VTABDST, LDT'VOLUME'TBL'INDEX *       <<01232>>19606000
                  SIZE'OF'VTAB'ENTRY, SIZE'OF'VTAB'ENTRY);     <<01232>>19608000
         mvtab'sir'flag := Getsir (mvtab'sir);                 <<01232>>19728000
               Relsir (mvtab'sir, mvtab'sir'flag);             <<01232>>19742000
               Relsir (mvtab'sir, mvtab'sir'flag);             <<01232>>19782000
               Relsir (mvtab'sir, mvtab'sir'flag);             <<01232>>19884000
         Relsir (mvtab'sir, mvtab'sir'flag);                   <<01232>>20244000
       if dirsize >= 6112D then                                <<*1116>>22299000
          ds'disc'address := dirbase - 29D                     <<*1116>>22299100
       else                                                    <<*1116>>22299200
       if dirsize >= 6112D then                                <<*1116>>22302100
          ds'number'of'sectors := dirsize + 29D                <<*1116>>22302200
       else                                                    <<*1116>>22302300
                     ,vol'index   << offset into MVTAB >>      <<01232>>24054000
                     ;                                         <<01232>>24084000
   INTEGER           dirbase1 = dirbase;                       <<01232>>24086000
   LOGICAL ARRAY      mvtab(*)   = temp;                       <<01232>>24120000
   LOGICAL ARRAY      mvhead(*)  = temp;                       <<01232>>24121000
   DOUBLE ARRAY       mvtabd(*)  = temp;                       <<01232>>24124000
   DOUBLE ARRAY       mvheadd(*) = temp;                       <<01232>>24125000
   SUBROUTINE def'move'from'dst;                               <<01232>>24174000
         move'from'dst (@mvtab, mvtab'dst,                     <<01232>>24510000
                        mvtabx * size'of'mvtab'entry,          <<01232>>24511000
                        size'of'mvtab'entry);                  <<01232>>24511100
         vol'index := size'of'mvtab'vs'head;                   <<01232>>24516000
         dirldev := mvtab'vol'ldev;                            <<01232>>24518000
         vol'index := size'd'of'mvtab'vs'head;                 <<01232>>24520000
         dirbase := mvtabd'vol'entry;                          <<01232>>24522000
         dirbase1.(0:8) := 0;        << strip off "ldev" >>    <<01232>>24524000
         i:=0;    << waste entry 0 >>                          <<01232>>24542000
         WHILE (i:=i+1) <= volume'count DO                     <<01232>>24544000
           BEGIN                                               <<01232>>24546000
              vol'index := size'of'mvtab'vs'head +             <<01232>>24547000
                           (size'of'vol'entry * (i-1));        <<01232>>24548000
              vol'set'ldevs(i) := mvtab'vol'ldev;              <<01232>>24550000
                                                               <<01232>>24603000
        << get sys mvtab entry >>                              <<01232>>24604000
        move'from'dst (@mvhead, mvtab'dst, 0,                  <<01232>>24606000
                       size'of'mvtab'entry);                   <<01232>>24607000
        mvtabx := 0;                                           <<s1297>>24607100
        dirldev:=mvtabh'sys'ldev;                              <<01232>>24614000
        dirbase := mvtabhd'sys'dirbase;                        <<01232>>24616000
        dirbase1.(0:8) := 0;  << strip off ldev >>             <<01232>>24618000
$EDIT VOID=24622000                                            <<01232>>24620000
        Move'From'Dst (@vol'ent,vtabdst,0,size'of'vtab'entry); <<01232>>24638000
        volume'count:=vol'ent(0).vol'table'no'ent;             <<v9997>>24640000
        if volume'count > max'discs then                       <<v9997>>24641000
           begin                                               <<v9997>>24641100
              genmsg(pvmsgset,vierr142);                       <<v9997>>24641200
              leave(0);                                        <<v9997>>24641300
           end;                                                <<v9997>>24641400
$EDIT VOID=24644000                                            <<01232>>24642000
              Move'From'Dst (@vol'ent, vtabdst,                <<01232>>24656000
                             i * size'of'vtab'entry,           <<01232>>24658000
                             size'of'vtab'entry);              <<01232>>24659000
                 0 AND vol'ent(0) <> 0 AND                     <<v9997>>24664000
                 vol'ent(vol'table'ldev).non'sys = 0 THEN      <<v9997>>24665000
   <<      volume entry number in the volume     >>            <<v9997>>24702000
   <<      table and not max system volumes.     >>            <<v9997>>24704000
                  (Subtype = St'9110 LOR Subtype = St'9144 LOR <<*1468>>25008000
                  Subtype = St'HP35401A);                      <<*1468>>25009000
                                                                        25009100
                                                                        25009200
<< Flags      - Passed directly to P'ATTACHIO.               >><<d9301>>25540000
$EDIT VOID=25550000                                            <<d9301>>25542000
$EDIT VOID=25624000                                            <<d9301>>25624000
$EDIT VOID=25634000                                            <<d9301>>25632000
$EDIT VOID=25732000                                            <<d9301>>25652000
   D'Iostat := P'Attachio(Ldev,Qmisc,0,@Bufp,Funct,Wc,         <<d9301>>25770000
