         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
<< Fix S9202 prevents SF625 with labeled  SDISC  by  moving >> <<09391>>00040010
<<   the REMRITENTRY call here from AVREC of Labseg.        >> <<09391>>00040020
<< Makes sure unlabeled SDISC is logically on line during a >> <<09391>>00040030
<<   reelswitch (bug introduced in S9202).                  >> <<09391>>00040040
<< This fix supports restoration of lost on-line interrupts >> <<09417>>00040050
<<   and auto-AVRing of SDISCs which were on-line when  the >> <<09417>>00040060
<<   system was brought up.                                 >> <<09417>>00040070
<< Make sure SDISC process gets AWAKEned even if non-serial >> <<09557>>00040080
<<   media is mounted.                                      >> <<09557>>00040090
<< Support addition of  OBTAIN/RELEASE  data  structure  to >> <<09563>>00040100
<<   SDISC extra data segment.                              >> <<09563>>00040110
$INCLUDE INCLSYSG                                              <<09417>>00048100
$PAGE "MPE TABLE ACCESS:  PROCESS CONTROL BLOCK (PCB)"         <<09417>>00048200
$INCLUDE INCLPCB5                                              <<09417>>00048300
INTEGER                                                        <<09417>>00069000
   PIN;   << If <> 0, PIN to use with REMRITENTRY.          >> <<09417>>00069100
$EDIT VOID=00140000                                            <<09417>>00138000
$EDIT VOID=00300000                                            <<09417>>00300000
$EDIT VOID=00314000                                            <<09417>>00304000
$EDIT VOID=00324000                                            <<09417>>00322000
$EDIT VOID=00332000                                            <<09417>>00332000
$EDIT VOID=00414000                                            <<09417>>00414000
$EDIT VOID=00418000                                            <<09417>>00418000
INTRINSIC ASCII, FATHER, TERMINATE;                            <<09417>>00486000
$EDIT VOID=00568000                                            <<09417>>00556000
INTEGER PROCEDURE RECOGNIZE' (LDEV);                           <<S9202>>00728000
                                                               <<S9202>>00812100
INTEGER PROCEDURE REMRITENTRY (PIN);                           <<S9202>>00812200
   VALUE PIN;                                                  <<S9202>>00812300
   INTEGER PIN;                                                <<S9202>>00812400
   OPTION PRIVILEGED, UNCALLABLE, EXTERNAL;                    <<S9202>>00812500
                                                               <<S9202>>00812600
INTEGER PROCEDURE SETOWNED (LDEV, NEW'OWNED'STATE);            <<09417>>00824500
   VALUE   LDEV, NEW'OWNED'STATE;                              <<09417>>00825000
   INTEGER LDEV, NEW'OWNED'STATE;                              <<09417>>00825500
COMMENT -- Returns current LPDT'DEV'OWN'STATE.  If  NEW'OWNED' <<09417>>00826000
STATE >= 0, updates LPDT'DEV'OWN'STATE.                        <<09417>>00826500
;                                                              <<09417>>00827000
   OPTION  PRIVILEGED, UNCALLABLE, EXTERNAL;                   <<09417>>00827500
$PAGE "SDISC'ON'LINE"                                          <<S9202>>00838010
PROCEDURE SDISC'ON'LINE;                                       <<S9202>>00838020
   OPTION PRIVILEGED, UNCALLABLE, INTERNAL;                    <<S9202>>00838030
                                                               <<S9202>>00838040
BEGIN COMMENT --                                               <<S9202>>00838050
   Some common code for  REEL'SWITCH  and  LABELED'SDISC.  Ac- <<S9202>>00838060
quires an XDS for use by SDISC, saves the user process info in <<S9202>>00838070
the LDTX in a safe place, puts PVPROC's info there,  sets  the <<S9202>>00838080
device  logically on line, reads and interprets any "tape" la- <<S9202>>00838090
bels, restores the user process info to the LDTX, gives up its <<S9202>>00838100
XDS, and performs any required REMRITENTRY call (see  comments <<S9202>>00838110
in procedures AVREC and RECOGNIZE of LABSEG).  That's a lot of <<S9202>>00838120
work for so few lines.                                         <<S9202>>00838130
;                                                              <<S9202>>00838140
$EDIT VOID=00838170                                            <<09417>>00838150
GET'SDISC'DSEG;   << Acquire XDS, swap LDTX environments.   >> <<S9202>>00838180
IF <> THEN                                                     <<S9202>>00838190
   BEGIN   << Couldn't acquire DSEG, bail out.              >> <<S9202>>00838200
   DISABLE;                                                    <<S9202>>00838210
   LPDT'RDY'SER'FRN'DISC := TRUE;                              <<S9202>>00838220
   LPDT'SERIAL'OR'FOREIGN := LPDT'SERIAL;                      <<S9202>>00838230
   ENABLE;                                                     <<S9202>>00838240
   RETURN;                                                     <<S9202>>00838250
   END;    << Couldn't acquire DSEG, bail out.              >> <<S9202>>00838260
DISABLE;                                                       <<S9202>>00838270
LPDT'RDY'SER'FRN'DISC := TRUE;           << Set device      >> <<S9202>>00838280
LPDT'SERIAL'OR'FOREIGN := LPDT'SERIAL;   << on-line.        >> <<S9202>>00838290
ENABLE;                                                        <<S9202>>00838300
SETOWNED (LDEV, LPDT'OWNED);   << RECOGNIZE' needs this.    >> <<09417>>00838301
PIN := RECOGNIZE' (LDEV);   << Read/interpret labels.       >> <<S9202>>00838310
SETOWNED (LDEV, LPDT'SERVICE'OK);  << Prevent more intrpts. >> <<09417>>00838311
FREE'SDISC'DSEG;   << Restore LDTX environment, release XDS >> <<S9202>>00838320
$EDIT VOID=00838330                                            <<09417>>00838330
END;    << of SDISC'ON'LINE.                                >> <<S9202>>00838340
PROCEDURE REEL'SWITCH;                                         <<S9202>>00842000
$EDIT VOID=00846000                                            <<S9202>>00844000
   OPTION PRIVILEGED, UNCALLABLE, INTERNAL;                    <<S9202>>00848000
BEGIN COMMENT --                                               <<09391>>00852000
  If we are switching volumes for a labeled  serial  disc  re- <<09391>>00854000
quest, we must AVR it to let Labseg verify that we are not do- <<09391>>00856000
ing something fishy like trying to overwrite an unexpired vol- <<09391>>00858000
ume.  The labeled/not labeled test is  performed  in  Labseg's <<09391>>00860000
TEST'FOR'REEL'SWITCH.                                          <<09391>>00861000
;                                                              <<09391>>00862000
   BEGIN   << Labeled request, and expecting reel switch.   >> <<09391>>00866000
$EDIT VOID=00872000                                            <<S9202>>00868000
   SDISC'ON'LINE;   << Acquire SDISC resources, AVR volume. >> <<09391>>00869000
   END     << Labeled request, and expecting reel switch.   >> <<09391>>00878000
ELSE      << Unlabeled reelswitch, must set SDISC logically >> <<09391>>00878500
   BEGIN  << on line here because SDISC'ON'LINE not called. >> <<09391>>00879000
   DISABLE;                                                    <<09391>>00879500
   LPDT'RDY'SER'FRN'DISC := TRUE;                              <<09391>>00880000
   LPDT'SERIAL'OR'FOREIGN := LPDT'SERIAL;                      <<09391>>00880500
   ENABLE;                                                     <<09391>>00881000
   END;   << Unlabeled reelswitch...                        >> <<09391>>00881500
END;      << of REEL'SWITCH.                                >> <<09391>>00882000
BEGIN COMMENT --                                               <<09557>>00890000
  When a device being used as a serial disc has to go  offline <<09557>>00892000
to  change  media, SDISC stores that process' PCB index in the <<09557>>00894000
device's LDTX entry.  When the device comes on line  with  new <<09557>>00896000
media we run, and WAKE'SDISC'PROCESS makes sure the SDISC pro- <<09557>>00898000
cess is AWAKEned to continue execution.                        <<09557>>00900000
;                                                              <<09557>>00902000
                                                               <<09557>>00904000
   BEGIN   << Device used as SDISC needs waking.            >> <<09557>>00907000
   SETOWNED (LDEV, LPDT'OWNED);                                <<09557>>00907100
   END;    << Device used as SDISC needs waking.            >> <<09557>>00909000
                                                               <<09563>>00936100
EQUATE                                                         <<09563>>00936200
   INIT'ARRAY'SIZE = 9;                                        <<09563>>00936300
                                                               <<09563>>00936400
LOGICAL ARRAY                                                  <<09563>>00938000
   SDISC'DST(0:INIT'ARRAY'SIZE-1);   << Initialization bufr >> <<09563>>00939000
                                                               <<09563>>00939100
   VOL'FATAL'CELL = 3,                                         <<09563>>00962000
   DST'LOCK'CELL  = 5,   << Start of 4 wd OBTAIN/RLS struct >> <<09563>>00965000
SDISC'DST(VOL'FATAL'CELL) := 0;                                <<09563>>00998000
MOVE SDISC'DST(DST'LOCK'CELL) := (4(0));                       <<09563>>01001000
MOVE'TO'DST (SDISC'DST'NUM, JUST'ALLOC'ADR, @SDISC'DST,        <<09563>>01002000
   INIT'ARRAY'SIZE);                                           <<09563>>01003000
$PAGE "           LABELED'SDISC"                               <<09417>>01096000
$EDIT VOID=01192000                                            <<S9202>>01182000
   SDISC'ON'LINE;                                              <<S9202>>01183000
$PAGE "           GET'LDTX'ENTRY"                              <<09417>>01210000
PROCEDURE GET'LDTX'ENTRY;                                      <<09417>>01210100
   OPTION PRIVILEGED, UNCALLABLE, INTERNAL;                    <<09417>>01210200
                                                               <<09417>>01210300
BEGIN COMMENT --                                               <<09417>>01210400
  Extracts the LDTX entry for LDEV (global variable).          <<09417>>01210500
;                                                              <<09417>>01210600
SUBROUTINE DEF'MOVE'FROM'DST;                                  <<09417>>01210700
MOVE'FROM'DST (@LDT, LDT'DST, 0, SIZE'OF'LDT'ENTRY);           <<09417>>01210800
LDT'INDEX := 0;                                                <<09417>>01210900
LDTX'OFFSET := LDEV * SIZE'OF'LDTX'ENTRY + LDTX'BASE;          <<09417>>01211000
MOVE'FROM'DST (@LDTX, LDT'DST, LDTX'OFFSET,                    <<09417>>01211100
               SIZE'OF'LDTX'ENTRY);                            <<09417>>01211200
LDTX'INDEX := 0;                                               <<09417>>01211300
END;   << of GET'LDTX'ENTRY                                 >> <<09417>>01211400
$EDIT VOID=01400000                                            <<09417>>01396000
     DEVINFO := LOGICAL (LDEV) LOR (LPDT'SUBTYPE & LSL(8));    <<09417>>01716000
$PAGE                                                          <<09417>>01750100
PROCEDURE PRINT'MOUNT'MSG;                                     <<09417>>01750200
   OPTION PRIVILEGED, UNCALLABLE, INTERNAL;                    <<09417>>01750300
                                                               <<09417>>01750400
BEGIN COMMENT --                                               <<09417>>01750500
  Prints "xxxxxx ON LDEV# nn".  Expects the following upon en- <<09417>>01750600
try:                                                           <<09417>>01750700
                                                               <<09417>>01750800
  The string <xxxxxx>, starting at MSG(0),                     <<09417>>01750900
  MSGLOC set to the byte index after <xxxxxx>,                 <<09417>>01751000
  <nn> in the global cell LDEV.                                <<09417>>01751100
;                                                              <<09417>>01751200
IF PRINTMSG THEN                                               <<09417>>01751300
   BEGIN   << Valid mount or dismount.                      >> <<09417>>01751400
   MSG(MSGLOC+13) := 0;   << GENMSG terminator.             >> <<09417>>01751500
   MOVE MSG(MSGLOC) := " ON LDEV#    ";                        <<09417>>01751600
   ASCII (LDEV, 10, MSG(MSGLOC+10));                           <<09417>>01751700
   GENMSG (-1, @MSG, , , , , , , 0);   << There it goes.    >> <<09417>>01751800
   IF PRT'READMSG THEN   << Tack on Read-Only message.      >> <<09417>>01751900
      GENMSG (PVERRMSGSET, READ'ONLY, %10000, , , , , , 0);    <<09417>>01751910
   END;   << Valid mount or dismount.                       >> <<09417>>01751920
END;      << of PRINT'MOUNT'MSG.                            >> <<09417>>01751930
            GET'LDTX'ENTRY;                                    <<09417>>01949000
            LABELED'SDISC;                   << AVR it.     >> <<09417>>01950000
            SETOWNED (LDEV, LPDT'NOT'OWNED);                   <<09417>>01952000
            MOVE MSG := "SERIAL DISC";                         <<09417>>01953000
            MSGLOC := 11;                                      <<09417>>01953100
            PRINT'MOUNT'MSG;                                   <<09417>>01953200
                                                               <<09417>>02024100
<< The following statement  prevents  users  from  :RUNning >> <<09417>>02024200
<< PVPROC.PUB.SYS.  Only PROGEN is allowed to launch us.    >> <<09417>>02024300
                                                               <<09417>>02024400
IF FATHER * PCBSIZE <> SYSPROGENPCB THEN TERMINATE;            <<09417>>02024500
PRT'READMSG := FALSE;   << Assume Read-Only switch not set. >> <<09417>>02026500
PRINTMSG := TRUE;                                              <<09417>>02027000
$EDIT VOID=02034000                                            <<09417>>02030000
AWAKE (SYSPROGENPCB, 2, JUNK'WAIT);                            <<09417>>02036000
$EDIT VOID=02038000                                            <<09417>>02038000
   << DEVREC increments SYSPVRECCNT and wakes up PVPROC.    >> <<09417>>02052000
   WHILE SYSPVRECCNT > 0 DO           << Something to do.   >> <<09417>>02056000
$EDIT VOID=02064000                                            <<09417>>02060000
$EDIT VOID=02096000                                            <<09417>>02082000
         GET'LDTX'ENTRY;                                       <<09417>>02083000
$EDIT VOID=02166000                                            <<09417>>02166000
                  SETOWNED (LDEV, LPDT'OWNED)                  <<09417>>02174000
                  SETOWNED (LDEV, LPDT'NOT'OWNED);             <<09417>>02178000
$EDIT VOID=02180000                                            <<09417>>02180000
                        PIN := 0;                              <<09417>>02627000
$EDIT VOID=02634000                                            <<S9202>>02628000
                           BEGIN   << SDISC in use, check   >> <<09417>>02638000
                                   << for lbl tape reel swt >> <<09417>>02640000
                           REEL'SWITCH;                        <<S9202>>02642000
$EDIT VOID=02652000                                            <<09417>>02644000
                           SETOWNED (LDEV, LPDT'OWNED);        <<09417>>02645000
                           END     << SDISC in use...       >> <<09417>>02654000
                           BEGIN   << SDISC not in use.     >> <<09417>>02657000
                           SETOWNED (LDEV, LPDT'NOT'OWNED);    <<09417>>02659000
                           END;                                <<09417>>02660000
                        IF PIN <> 0 THEN REMRITENTRY (PIN);    <<09417>>02661000
$EDIT VOID=02661100                                            <<09557>>02661100
                        IF LDTX'FDISC'ALLOC = 1 THEN           <<09557>>02702000
                           SETOWNED (LDEV, LPDT'OWNED);        <<09417>>02706000
                     WAKE'SDISC'PROCESS;                       <<09557>>02718000
$EDIT VOID=02738000                                            <<09417>>02738000
$EDIT VOID=02758000                                            <<09417>>02742000
            PRINT'MOUNT'MSG;                                   <<09417>>02743000
        IF SETOWNED (LDEV, -1) = LPDT'SERVICE'OK THEN          <<09417>>02762100
           SETOWNED (LDEV, LPDT'NOT'OWNED);                    <<09417>>02762200
        DISABLE;                                               <<09417>>02763500
        SYSPVRECCNT := SYSPVRECCNT - 1;                        <<09417>>02763600
        ENABLE;                                                <<09417>>02763700
        END;   << of WHILE loop.                            >> <<09417>>02764000
