<< LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION>>               00005000
$CONTROL MAP,CODE,USLINIT                                               00010000
<<PFAIL - MODULE 30>>                                                   00015000
<< HP32033C MPE SOURCE C.00.00 >>                                       00020000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00025000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00030000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00035000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00040000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00045000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00050000
$CONTROL UNCALLABLE,PRIVILEGED,MAIN=PFAIL                               00055000
$TP                                                                     00060000
$TITLE "POWERFAIL RESTART/RECOVERY PROCESS"                             00065000
BEGIN                                                                   00070000
                                                                        00075000
EQUATE                                                                  00080000
   MULTI'IMB   = %60, <<MASK OF CPUS HAVING MULTI IMBS>>       <<m8290>>00085000
   POWERFAIL   = %72, << SYSDB INDEX >>                                 00090000
   PFAILURE    = 65,  << OPCODE TO TELL DRIVER PFAILED >>               00095000
   SYSDB       = %1000,                                                 00100000
   DINIL       = 7,                                            <<00.04>>00105000
   DIOQP       = 2,   << DIT INDEX TO IOQ POINTER >>                    00110000
   DDLTP       = 4,   << DIT INDEX TO DVR LINK TABLE PTR >>             00115000
   DILTP       = 5,   << DIT INDEX TO ILT >>                            00120000
   DMNTR       = 1,   << DLT INDEX TO MONITOR PLABEL >>                 00125000
   ICNTRL      = 7,   << CONTROLLER INFO OF ILT >>                      00130000
   IMASK       = 7,   << INTERRUPT MASK WORD >>                         00135000
   IMASK55     = %32, <<4 WORD INT MASK FOR ICF/55>>           <<03045>>00140000
   JUNKWAIT    = -%20,                                                  00145000
   JUNK'IOWAIT = -%120,                                                 00150000
   CONSLDEV    = %74, << SYSDB INDEX >>                                 00155000
   QI          = 5,                                            <<06836>>00160000
   ICS'PFAIL   = 12;                                           <<06836>>00165000
                                                                        00170000
DEFINE                                                                  00175000
   DRTNUMBER   = (7:9)#,  <<DRT NUMBER FIELD IN ILT>>          <<03045>>00180000
   CHAN'NUM    = (9:4)#,  <<4-BIT-CHANNEL NUMBER>>             <<03045>>00185000
   IMB'NUM     = (7:2)#,  <<2-BIT-IMB NUMBER>>                 <<03045>>00190000
   QPFAILS     = (11:1)#, << PFAIL TO BE INDICATED BY ATTACHIO >>       00195000
   ABS         = ABSOLUTE#,                                             00200000
   ASMB        = ASSEMBLE#,                                             00205000
   DISABLE     = ASSEMBLE(SED 0)#,                                      00210000
   ENABLE      = ASSEMBLE(SED 1)#,                                      00215000
   IAK         = (8:1)#,  << INTERRUPT ACKNOWLEDGE BIT OF DIT >>        00220000
   PDISABLE    = ASMB(PSDB)#,                                           00225000
   PENABLE     = ASMB(PSEB)#,                                           00230000
   PF          = ABS(SYSDB+POWERFAIL)#,                                 00235000
   REQUEST     = (3:1)#; << REQUEST FLAG OF DIT DFLAGS >>               00240000
                                                                        00245000
INTEGER                                                                 00250000
   SYSUP       = DB+%73,                                                00255000
   SYSCONSOLE  = DB+CONSLDEV;                                           00260000
                                                                        00265000
INTEGER POINTER                                                         00270000
   PS0         = S-0,                                                   00275000
   PS1         = S-1;                                                   00280000
                                                                        00285000
EQUATE                                                         <<06835>>00290000
  PF'MSG'LENGTH = 16;                                          <<06835>>00295000
                                                               <<06835>>00300000
ARRAY                                                                   00305000
   PFMSG(0:PF'MSG'LENGTH-1) := %6412,                          <<06835>>00310000
                               "**RECOVERY FROM POWER FAIL**", <<06835>>00315000
                               %6412;                          <<06835>>00320000
                                                                        00325000
$INCLUDE INCLLPDT                                              <<06835>>00330000
$INCLUDE INCLLDT5                                              <<06835>>00335000
$TITLE " "                                                     <<07305>>00340000
$INCLUDE INCLIQH                                               <<06836>>00345000
$INCLUDE INCLIOQ                                               <<06836>>00350000
$PAGE                                                                   00355000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS);   00360000
VALUE LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                        00365000
INTEGER LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                      00370000
OPTION EXTERNAL;                                                        00375000
                                                                        00380000
PROCEDURE AWAKEIO(DITP,FLAGS);                                          00385000
VALUE DITP,FLAGS;                                                       00390000
POINTER DITP;                                                           00395000
LOGICAL FLAGS;                                                          00400000
OPTION EXTERNAL;                                                        00405000
                                                                        00410000
PROCEDURE CHECKLDEV(DEV);                                               00415000
VALUE DEV;                                                              00420000
INTEGER DEV;                                                            00425000
OPTION EXTERNAL;                                                        00430000
                                                                        00435000
PROCEDURE DSETCONTROL(OP,DITP);                                         00440000
VALUE OP,DITP;                                                          00445000
INTEGER OP;                                                             00450000
POINTER DITP;                                                           00455000
OPTION EXTERNAL;                                                        00460000
                                                                        00465000
PROCEDURE LOG7;                                                         00470000
OPTION EXTERNAL;                                                        00475000
                                                                        00480000
DOUBLE PROCEDURE IOSTATUS(IOQX);                                        00485000
VALUE IOQX;                                                             00490000
INTEGER IOQX;                                                           00495000
OPTION EXTERNAL;                                                        00500000
                                                                        00505000
PROCEDURE HELP;                                                         00510000
OPTION EXTERNAL;                                                        00515000
                                                                        00520000
PROCEDURE PRINTPFMSG(MSG,WORDS);                                        00525000
VALUE MSG,WORDS; DOUBLE MSG;                                            00530000
INTEGER WORDS;                                                          00535000
OPTION EXTERNAL;                                                        00540000
                                                                        00545000
PROCEDURE RESETDB(A);                                                   00550000
VALUE A;                                                                00555000
INTEGER A;                                                              00560000
OPTION EXTERNAL;                                                        00565000
                                                                        00570000
LOGICAL PROCEDURE SETSYSDB;                                             00575000
OPTION EXTERNAL;                                                        00580000
                                                                        00585000
PROCEDURE TERMINIT(DITP);                                               00590000
VALUE DITP;                                                             00595000
POINTER DITP;                                                           00600000
OPTION EXTERNAL;                                                        00605000
                                                                        00610000
PROCEDURE WAIT(A,B);                                                    00615000
VALUE A,B;                                                              00620000
INTEGER A,B;                                                            00625000
OPTION EXTERNAL;                                                        00630000
                                                                        00635000
PROCEDURE WRITE2(WORD);                                                 00640000
VALUE WORD;                                                             00645000
INTEGER WORD;                                                           00650000
OPTION EXTERNAL;                                                        00655000
                                                                        00660000
PROCEDURE INITIO(FLAG);                                                 00665000
   VALUE FLAG;                                                          00670000
   LOGICAL FLAG;                                                        00675000
   OPTION EXTERNAL;                                                     00680000
                                                               <<02062>>00685000
LOGICAL PROCEDURE EXCHANGEDB(INX);                             <<02062>>00690000
    VALUE   INX;                                               <<02062>>00695000
    INTEGER  INX;                                              <<02062>>00700000
    OPTION EXTERNAL;                                           <<02062>>00705000
                                                                        00710000
PROCEDURE MMSTAT'(EVENT,P1,P2,P3,P4,P5,P6);                    <<07305>>00715000
   VALUE EVENT,P1,P2,P3,P4,P5,P6;                              <<07305>>00720000
   INTEGER EVENT,P1,P2,P3,P4,P5,P6;                            <<07305>>00725000
   OPTION EXTERNAL;                                            <<07305>>00730000
                                                               <<07305>>00735000
                                                               <<*7944>>00740000
PROCEDURE SUDDENDEATH (NUM);                                   <<*7944>>00745000
  VALUE NUM;                                                   <<*7944>>00750000
  INTEGER NUM;                                                 <<*7944>>00755000
  OPTION EXTERNAL;                                             <<*7944>>00760000
                                                               <<*7944>>00765000
INTEGER PROCEDURE GET'DSDEVICE( LDEV );                        <<D9004>>00770000
   VALUE LDEV;                                                 <<D9004>>00775000
   INTEGER LDEV;                                               <<D9004>>00780000
   OPTION EXTERNAL;                                            <<D9004>>00785000
                                                               <<D9004>>00790000
$PAGE                                                                   00795000
PROCEDURE POWERUP;                                                      00800000
BEGIN                                                                   00805000
INTEGER X=X,                                                   <<06836>>00810000
        LDEV,                                                  <<06835>>00815000
        COUNT,    << Length of message for ATTACHIO >>         <<06835>>00820000
        DEV'TYPE, << Device type from LDT           >>         <<06835>>00825000
        IOQ'CNT,<< # IOQs to terminals for pfail msg >>        <<06836>>00830000
        IOQ'ENTRY'INDEX,                                       <<06836>>00835000
        LPDT'INDEX,                                            <<06835>>00840000
        LDT'INDEX;                                             <<06835>>00845000
                                                               <<06835>>00850000
INTEGER S0=S-0;                                                <<03045>>00855000
INTEGER POINTER DITP;                                          <<06835>>00860000
INTEGER ARRAY LDT(*) = DB + 0;                                 <<02062>>00865000
LOGICAL NEW := TRUE;                                           <<06835>>00870000
LOGICAL QPFAIL;   << TELL DRIVER OF PFAIL VIA ATTACHIO >>               00875000
EQUATE                                                         <<06835>>00880000
   IBM'SUBSYSTEM = %26,        <<IMF, MRJE        >>           <<D9004>>00885000
   INP'DEV'TYPE= %21;          <<INP DEVICE NUMBER>>           <<07305>>00890000
                                                               <<06836>>00895000
ARRAY                                                          <<03045>>00900000
  TEMPMASK (0:3) = Q;  << Temporary copy of Int. mask word >>  <<07305>>00905000
LOGICAL                                                        <<03045>>00910000
   MASKADDR;           <<ADDRESS OF INTERRUPT MASK>>           <<03045>>00915000
                                                                        00920000
INTEGER                                                        <<03045>>00925000
   IMB,                <<LOOP COUNTER INDEX INTO TEMPMASK>>    <<03045>>00930000
   CHANNUM,                   <<CHANNEL NUMBER>>               <<03676>>00935000
   MAXIMB,             <<NUMBER OF IMBS SUPPORTED BY CPU>>     <<03045>>00940000
   CPUNUM;             <<CPU NUMBER RETURNED FROM CPN>>        <<03045>>00945000
                                                               <<07305>>00950000
<< This MUST be the last declaration. >>                       <<07305>>00955000
                                                               <<07305>>00960000
INTEGER ARRAY IOQ'HOLDER(*) = Q;                               <<07305>>00965000
                                                               <<07305>>00970000
                                                                        00975000
                                                               <<06836>>00980000
<< Set up storage area for the IOQs. There will need to be     <<06836>>00985000
<< at least one for every terminal device (for the pfail msg)>><<06836>>00990000
<< Will set asside enough room to equal the total # IOQs     >><<06836>>00995000
<< configured.                                               >><<06836>>01000000
                                                               <<06836>>01005000
TOS := IQH'TOT'ENT;                                            <<06836>>01010000
ASSEMBLE (ADDS 0);   << Allocate room for IOQ'HOLDER array >>  <<07305>>01015000
                                                               <<06836>>01020000
IOQ'HOLDER := 0;                                               <<06836>>01025000
MOVE IOQ'HOLDER(1) := IOQ'HOLDER(0), (IQH'TOT'ENT-1);          <<06836>>01030000
                                                               <<06836>>01035000
RESTART:                                                                01040000
   MMSTAT'(240,2,NEW,PF,SYSUP,0,0);                            <<*7720>>01045000
   INITIO(1); <<INITIALIZE SYSTEM VOLUMES AND CONSOLE>>        <<01686>>01050000
   PUSH(DB);                                                            01055000
   TOS := TOS+@PFMSG;   << ABSOLUTE ADDRESS OF PFMSG >>                 01060000
   TOS := PF'MSG'LENGTH;                                       <<06835>>01065000
   SETSYSDB;                                                            01070000
   PRINTPFMSG(*,*);       << OUTPUT MSG TO CON >>                       01075000
   PF := 5; << SET POWERFAIL INDICATOR TO RECOVERY >>          <<m8290>>01080000
   ENABLE;                                                              01085000
   LDEV := 1;                                                  <<06835>>01090000
                                                               <<03045>>01095000
    <<======================================================>> <<03045>>01100000
    <<THE NORMAL OPERATIONS OF READ/SET MASK ARE COMPLICATED>> <<03045>>01105000
    <<BY THE INTRODUCTION OF A 4-WORD INTERRUPT MASK FOR THE>> <<03045>>01110000
    <<ICF/55.    FOR NON ICF/55 CPUS:                       >> <<03045>>01115000
    <<    INTERRUPT MASK STORED AT %7                       >> <<03045>>01120000
    <<    READ MASK RETURNS THE (1 WORD) MASK ON TOS        >> <<03045>>01125000
    <<    SET MASK EXPECTS  THE (1 WORD) MASK ON TOS        >> <<03045>>01130000
    <<           FOR THE ICF/55 CPU:                        >> <<03045>>01135000
    <<    INTERRUPT MASK STORED AT %32  (MASK FOR IMB 0)    >> <<03045>>01140000
    <<                             %33  (MASK FOR IMB 1)    >> <<03045>>01145000
    <<                             %34  (MASK FOR IMB 2)    >> <<03045>>01150000
    <<                             %35  (MASK FOR IMB 3)    >> <<03045>>01155000
    <<    SET MASK / READ MASK EXPECT OR RETURN TOP OF STACK>> <<03045>>01160000
    <<                             S-3  (MASK FOR IMB 3)    >> <<03045>>01165000
    <<                             S-2  (MASK FOR IMB 2)    >> <<03045>>01170000
    <<                             S-1  (MASK FOR IMB 1)    >> <<03045>>01175000
    <<                  TOS ==>    S-0  (MASK FOR IMB 0)    >> <<03045>>01180000
    <<======================================================>> <<03045>>01185000
   ASSEMBLE(PCN);      <<DETERMINE CPU NUMBER>>                <<03045>>01190000
   CPUNUM := TOS;      << AND SAVE IT>>                        <<03045>>01195000
                                                               <<03045>>01200000
   MAXIMB := IF MULTI'IMB &LSR(CPUNUM) THEN 3 ELSE 0;          <<m8290>>01205000
                       <<ICF/55 SUPPORTS 4 IMBS>>              <<03045>>01210000
                       <<ALL OTHERS CPUS SUPPORT 1 IMB>>       <<03045>>01215000
                                                               <<03045>>01220000
                       <<INTERNAL INT. MASK MIGHT BE DEAD>>    <<03045>>01225000
                       <<USE CORE INT. MASK VALUES TO BE>>     <<03045>>01230000
                       <<SURE OF GETTING DECENT VALUES>>       <<03045>>01235000
   MASKADDR := IF MULTI'IMB &LSR(CPUNUM)                       <<m8290>>01240000
               THEN IMASK55 ELSE IMASK;  <<POINTER TO I-MASK>> <<03045>>01245000
   IMB := 0;                  <<STORE INTO TEMPMASK>>          <<03045>>01250000
   WHILE IMB <= MAXIMB DO BEGIN                                <<03045>>01255000
       TEMPMASK(IMB) := ABSOLUTE(MASKADDR);                    <<03045>>01260000
       MASKADDR := MASKADDR + 1;                               <<03045>>01265000
       IMB := IMB+1;                                           <<03045>>01270000
   END;                                                        <<03045>>01275000
                                                               <<06836>>01280000
   DO                                                                   01285000
   BEGIN << EXAMINE ALL DEVICES TO DETERMINE DISPOSITION >>             01290000
      LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;                 <<06835>>01295000
      LDT'INDEX := LDEV * SIZE'OF'LDT'ENTRY;                   <<06835>>01300000
      @DITP := LPDT'DIT'PTR;                                   <<06835>>01305000
      RESETDB(-1);                                             <<02062>>01310000
      EXCHANGEDB(LDT'DST);                                     <<06835>>01315000
      DEV'TYPE := LDT'DEVICE'TYPE;                             <<06835>>01320000
      EXCHANGEDB(0);                                           <<02062>>01325000
      SETSYSDB;         <<BACK TO SYS GLOB>>                   <<02062>>01330000
      TOS := @DITP;                                            <<00.04>>01335000
      IF <> AND NOT LPDT'VIRTUAL'DEVICE AND                    <<07305>>01340000
         ( DEV'TYPE <> INP'DEV'TYPE  OR                        <<07305>>01345000
           LPDT'DEV'OWN'STATE <> LPDT'NOT'OWNED) AND           <<D9004>>01350000
         ( DEV'TYPE <> IBM'SUBSYSTEM ) AND                     <<D9004>>01355000
         ( GET'DSDEVICE(LDEV) <= 1 ) THEN                      <<D9004>>01360000
    << THE DEVICE IS AN INP (THAT IS OWNED) OR NOT AN INP->>   <<02062>>01365000
    << SO INITIALIZE THE DEVICES*A FIX FOR CS DEVICES     >>   <<02062>>01370000
      BEGIN                                                    <<00.05>>01375000
      TOS := DITP(DILTP);                                               01380000
      TOS := PS0(ICNTRL).DRTNUMBER;  <<DRT # FROM ILT>>        <<03045>>01385000
      DELB;                     << DELTE ILT POINTER >>                 01390000
      IMB := S0.IMB'NUM;        <<EXTRACT IMB NUMBER>>         <<03045>>01395000
      CHANNUM := TOS.CHAN'NUM;  <<CHANNEL NUMBER>>             <<03676>>01400000
      TOS := TEMPMASK(IMB); <<PUT MASK WORD FOR IMB ON TOS>>   <<03045>>01405000
      X := CHANNUM;           <<CHANNEL NUMBER>>               <<03676>>01410000
      ASMB( TSBC 0,X);      <<SET BIT FOR THE CHANNEL>>        <<03045>>01415000
      TEMPMASK(IMB) := TOS;  <<STORE BACK INTO TEMP MASK>>     <<03045>>01420000
                                                               <<03045>>01425000
      IMB := MAXIMB;    <<WILL WORK FOR ALL CPU>>              <<03045>>01430000
              <<NOW STACK THE MASK WORDS FOR SETMASK>>         <<03045>>01435000
              << 4 WORDS FOR ICF/55    1 WORD ALL OTHERS>>     <<03045>>01440000
      WHILE IMB >= 0 DO                                        <<*7944>>01445000
      BEGIN                                                    <<*7944>>01450000
          TOS := TEMPMASK(IMB);                                <<03045>>01455000
          IMB := IMB-1;                                        <<03045>>01460000
      END;                                                     <<03045>>01465000
                           << IMB-0 = S-0  IMB-3=S-3>>         <<03045>>01470000
      ASSEMBLE (SMSK);                                         <<03045>>01475000
      IF < THEN SUDDENDEATH(222);  << Can't afford to fail >>  <<*7944>>01480000
                                                               <<03045>>01485000
      TOS := DITP(DDLTP); << DLT PTR >>                        <<00.04>>01490000
      QPFAIL := PS0.QPFAILS; << FLAG TO TELL DRIVER VIA ATTACHIO >>     01495000
      TOS := PS0(DINIL); << INITIALIZATION PLABEL >>           <<00.04>>01500000
      DELB;                                                    <<00.04>>01505000
      IF < AND LDEV <> SYSCONSOLE THEN ASMB(PCAL 0) ELSE DDEL; <<06835>>01510000
      CHECKLDEV(LDEV);                                         <<06835>>01515000
      IF = AND NOCARRY THEN                                             01520000
      IF QPFAIL THEN ATTACHIO(LDEV,0,0,0,PFAILURE,0,0,0,%13)   <<06835>>01525000
      ELSE                                                     <<06835>>01530000
         BEGIN     << Non disc SIO device >>                   <<06836>>01535000
ABORTSIO:                                                               01540000
         DISABLE;                                                       01545000
         IOQ'ENTRY'INDEX := DITP(DIOQP);                       <<06836>>01550000
         IF IOQ'ENTRY'INDEX <> 0 THEN                          <<06836>>01555000
            BEGIN << IOQ attached, abort the I/O >>            <<06836>>01560000
            IOQ'ABORT := 1;                                    <<06836>>01565000
            IOQ'PFAIL := 1;                                    <<06836>>01570000
            TOS := DITP; << GET FLAGS WORD OF DIT >>                    01575000
            TOS.IAK := 1;                                               01580000
            TOS.REQUEST := 1;                                           01585000
            DITP := TOS;                                                01590000
            PDISABLE;                                                   01595000
            ENABLE;                                                     01600000
            AWAKEIO(DITP,0); << HAVE DRIVER DO THE ABORT >>             01605000
            PENABLE;                                                    01610000
            END;                                               <<06836>>01615000
         ENABLE;                                                        01620000
         END;                                                  <<06836>>01625000
                                                                        01630000
      END ELSE DEL;   << Deletes DITP pushed at start of loop>><<*7944>>01635000
      IF PF <> 5 THEN GO RESTART;                              <<m8290>>01640000
   END UNTIL (LDEV := LDEV+1) > INTEGER(LPDT'MAX'ENTRIES);     <<06835>>01645000
                                                               <<06836>>01650000
   << Reset power fail flag so users will run >>               <<06836>>01655000
                                                               <<06836>>01660000
   ABS(ABS(QI)-ICS'PFAIL) := 0;                                <<06836>>01665000
   RESETDB(-1);                                                         01670000
   TOS := NEW;                                                          01675000
   TOS := 7;                                                            01680000
   LOG7; << ISSUE LOG RECORD TO RECORD POWERFAIL >>                     01685000
   SETSYSDB;                                                            01690000
                                                               <<06836>>01695000
   IF NEW THEN                                                          01700000
   BEGIN << NEW POWERFAIL, SEND MESSAGES TO TERMINALS >>                01705000
      LDEV := 0;                                               <<06835>>01710000
      IOQ'CNT := -1;                                           <<06836>>01715000
      NEW := FALSE;                                                     01720000
   END;                                                                 01725000
                                                               <<06836>>01730000
   WHILE (LDEV := LDEV+1) <= INTEGER(LPDT'MAX'ENTRIES) DO      <<06835>>01735000
      BEGIN      << Send pfail message to all active terms. >> <<06836>>01740000
      CHECKLDEV(LDEV);                                         <<06835>>01745000
      IF > THEN                                                         01750000
         BEGIN      << A terminal >>                           <<06836>>01755000
         LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;              <<06835>>01760000
         @DITP := LPDT'DIT'PTR;                                <<06835>>01765000
         IF LPDT'DEV'OWN'STATE <> LPDT'NOT'OWNED THEN          <<06835>>01770000
            BEGIN      << Send PFAIL msg to terminal >>        <<06835>>01775000
            COUNT := (IF LDEV = SYSCONSOLE THEN 1              <<06835>>01780000
                      ELSE PF'MSG'LENGTH);                     <<06835>>01785000
            RESETDB(-1);                                                01790000
            TOS := ATTACHIO(LDEV,0,0,@PFMSG,1,COUNT,0,0,%406); <<06835>>01795000
            ASSEMBLE(DEL,TEST);                                         01800000
            IF <> THEN                                         <<06836>>01805000
               IOQ'HOLDER(IOQ'CNT := IOQ'CNT+1) := TOS         <<06836>>01810000
            ELSE DEL;                                          <<06836>>01815000
            << FORGET REQUEST IF OUT OF IOQ'S >>                        01820000
            SETSYSDB;                                                   01825000
            END;                                               <<06836>>01830000
         END;                                                  <<06836>>01835000
      IF PF <> 5 THEN GO RESTART;                              <<m8290>>01840000
   END;                                                                 01845000
                                                               <<06836>>01850000
   SYSUP := 1;                                                          01855000
   RESETDB(-1);                                                         01860000
CHECKAGAIN:  << NOW ALLOW ALL THE I/O TO COMPLETE >>                    01865000
   FOR X := 0 UNTIL IOQ'CNT DO                                 <<06836>>01870000
   IF IOQ'HOLDER(X) <> 0 THEN                                  <<06836>>01875000
   BEGIN << CHECK FOR COMPLETION >>                                     01880000
      IOSTATUS(IOQ'HOLDER(X));                                 <<06836>>01885000
      IF <= THEN IOQ'HOLDER(X) := 0; << All done, clear entry>><<06836>>01890000
   END;                                                                 01895000
                                                               <<06836>>01900000
   TOS := IOQ'HOLDER(0); << See if all I/O are complete >>     <<06836>>01905000
   WHILE (X:=X+1) <= IOQ'CNT DO                                <<06836>>01910000
      TOS := TOS LOR LOGICAL(IOQ'HOLDER(X));                   <<06836>>01915000
                                                               <<06836>>01920000
   ASMB(TEST,DEL);                                                      01925000
   IF <> THEN                                                           01930000
   BEGIN << NOT ALL DONE YET >>                                         01935000
      WAIT( JUNK'IOWAIT,0);                                             01940000
      IF PF <> 5 THEN GO RESTART;                              <<m8290>>01945000
      GO CHECKAGAIN;                                                    01950000
   END;                                                                 01955000
                                                               <<06836>>01960000
   IF PF <> 5 THEN GO TO RESTART;                              <<m8290>>01965000
   PF := 0;                                                             01970000
   NEW := TRUE;                                                         01975000
                                                               <<06836>>01980000
                                                               <<06836>>01985000
WAITSOMEMORE:                                                           01990000
   MMSTAT'(240,1,NEW,PF,SYSUP,0,0);                            <<*7720>>01995000
   WAIT(JUNKWAIT,0);                                                    02000000
   IF PF <> 0 THEN GO RESTART;                                          02005000
   GO WAITSOMEMORE;                                                     02010000
   HELP;                                                                02015000
END;                                                                    02020000
   POWERUP;                                                             02025000
END.                                                                    02030000
