$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
