$CONTROL CODE,MAP,USLINIT                                      <<04600>>00010000
<<UCOP - MODULE 07>>                                                    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 MAIN= UCOP                                                     00028000
$CONTROL SEGMENT= UCOP                                                  00030000
$THIRTY                                                                 00032000
$CONTROL PRIVILEGED                                                     00034000
$CONTROL UNCALLABLE                                                     00036000
****     USER     ****                                                  00038000
****  CONTROLLER  ****                                                  00040000
****   PROGRAM    ****                                                  00042000
****  U*C*O*P*    ****                                                  00044000
                                                                        00046000
                                                                        00048000
                                                                        00050000
COMMENT: PROGRAM WORKING UNDER UCOP,IN CHARGE OF MAINTAINING,           00052000
         REGULATING AND CONTROLLING USER ACTIVITY.                      00054000
         CREATES JOB MAIN PROCESS,                                      00056000
         DELETES PROCESSES,                                             00058000
         ABORTS JOBS,                                                   00060000
         ETC......                                                      00062000
         ;                                                              00064000
                                                                        00066000
BEGIN                                                                   00068000
$PAGE "***   GENERAL EQIVALENCES   ***"                                 00070000
DEFINE                                                                  00072000
      A'        = ABSOLUTE       #,                                     00074000
      ENABLE    = ASSEMBLE(SED 1)#,                                     00076000
      DISABLE   = ASSEMBLE(SED 0)#;                                     00078000
EQUATE SYSWAITTODISPMSG=%1053;                                 <<01549>>00080000
DEFINE PHASETRANSFLAG=(3:1)#;                                  <<01549>>00082000
EQUATE RESABORTINFOWORDNUM=0,                                  <<01549>>00084000
       QUEUEINGINFOWORDNUM=%15;                                <<01549>>00086000
DEFINE CRITFLAG=(2:1)#,                                        <<01549>>00088000
       INTERACTIVEFLAG=(5:1)#;                                 <<01549>>00090000
INTEGER                                                                 00092000
      X    = X,                                                         00094000
      XREG = X,                                                         00096000
      S3= S-3,                                                          00098000
      S1 = S-1,                                                         00100000
      S0 = S-0;                                                         00102000
INTEGER ARRAY                                                           00104000
      ARRQ0 (*) = Q+0;                                                  00106000
INTEGER                                                                 00108000
      BD0= DB+0,                                                        00110000
      DB1= DB+1,                                                        00112000
      DB2= DB+2,                                                        00114000
      DB3= DB+3,                                                        00116000
      DB4= DB+4,                                                        00118000
      DB5= DB+5,                                                        00120000
      DB6= DB+6,                                                        00122000
      DB7= DB+7,                                                        00124000
      DB8= DB+8,                                                        00126000
      DB9= DB+9,                                                        00128000
      DB10= DB+10,                                                      00130000
      DB11= DB+11;                                                      00132000
INTEGER POINTER                                                         00134000
      PDB2= DB+2,                                                       00136000
      PDB4 = DB+4,                                                      00138000
      PDB3 = DB+3,                                                      00140000
      PDB12= DB+12,                                                     00142000
      PDB13= DB+13,                                                     00144000
      PS2= S-2,                                                         00146000
      PS4= S-4;                                                         00148000
BYTE POINTER                                                            00150000
      BPS0= S-0;                                                        00152000
INTEGER ARRAY                                                           00154000
      ARRDB0 (*) = DB+0,                                                00156000
      ARRDB5 (*) = DB+5,                                                00158000
      ARRDB8 (*) = DB+8,                                                00160000
      ARRDB9 (*) = DB+9,                                                00162000
      ARRDB12 (*) = DB+12;                                              00164000
INTEGER ARRAY                                                           00166000
      ARRS24 (*) = S-24,                                                00168000
      ARRS17 (*) = S-17;                                                00170000
$PAGE "***   GLOBAL CONSTANTS   ***"                                    00172000
EQUATE                                                                  00174000
   <<FIXED CELLS>>                                                      00176000
      CSTB        = 0        ,                                          00178000
      XCST        = 1        ,                                          00180000
      DSTB        = 2        ,                                          00182000
      PCBB        = 3        ,                                          00184000
      CPCB        = 4        ,                                          00186000
      QI          = 5        ,                                          00188000
   <<TABLES/DST/SIR/SIZE>>                                              00190000
      PCBSIZE     = 16       ,                                          00192000
      URLDST      = 9        ,                                          00194000
      URLSIR      = 8        ,                                          00196000
      LDTDST      = 14       ,                                          00198000
      LDTSIZE     = 5        ,                                          00200000
      JPCNTDST    = 24       ,                                          00202000
      JPCNTSIR    = 13       ,                                          00204000
      JMATDST     = 25       ,                                          00206000
      JMATSIR     = 15       ,                                          00208000
      JMATSIZE    = 26       ,                                          00210000
   <<STACK PARMS>>                                                      00212000
      MAXSIZE     = 14000, << Need room for 8K STORE buffer >> <<02544>>00214000
      LOCSIZE     = 1300     ,                                          00218000
      DLSIZE      = 0        ,                                          00220000
      PXGLOB      = 8        ,                                          00222000
       PXFIXED=80,                                             <<01549>>00224000
      PXFILE      = 200      ,                                          00226000
      PXFIXEDJN   = 19       ,                                 <<00.01>>00228000
      PCBXSIZE    = PXGLOB+PXFIXED+PXFILE+3;                            00230000
$INCLUDE INCLCIS                                               <<04735>>00232000
   <<SYSTEM GLOBAL>>                                                    00238000
EQUATE                                                                  00240000
         ABSYS          = %1000    ,                           <<01549>>00242000
         CIEXTL         = %157     ,                                    00244000
         CIINTL         = %160     ,                                    00246000
         MISCWORD       = %1121    ,                           <<01549>>00248000
            << JOBSYNCH BITS:                                           00250000
               15  DEVICE FREED BY DEALLOCATE,                          00252000
               14  JOB(S) WAITING FOR DEVICE IN UCOP,                   00254000
               13  JOB MADE READY BY STARTDEVICE                        00256000
                      (MORGUE/CLEANUPJOB).                              00258000
           5 - 12  PORT TIMEOUT BIT MAP                                 00260000
                   1 = TIMEOUT HAS OCCURRED ON THE PORT                 00262000
                       DATA SEGMENT.                                    00264000
                   0 = NO TIMEOUT EXISTS FOR THE PORT DATA SEG          00266000
            >>                                                          00268000
         UCOPSW         = %300     ;                                    00270000
DEFINE                                                                  00272000
         ABSYS'CIEXTL   = A'(ABSYS+CIEXTL)    #,                        00274000
         ABSYS'CIINTL   = A'(ABSYS+CIINTL)    #,                        00276000
         ABSYS'MISCWORD   = A'(MISCWORD)#,                     <<01549>>00278000
         JOBSYNC        = (13:3)#,                             <<01549>>00280000
         PORTIMER       = (5:8)#;                              <<01549>>00282000
   <<PCBX>>                                                             00284000
DEFINE                                                                  00286000
         PCBX'UATTR     = DB2          #,                               00288000
         PCBX'JPCNTX    = DB4.(0:8)    #,                               00290000
         PCBX'JDTDST    = DB5.(6:10)   #,                               00292000
         PCBX'RESTART   = DB6.(1:1)    #,                               00294000
         PCBX'JITDST    = DB6.(6:10)   #;                               00296000
   <<LDT>>                                                              00298000
DEFINE                                                                  00300000
         LD'MAINPIN     = 1).(0:8      #,                               00302000
         LD'DEVTYPE     = 2).(10:6     #;                               00304000
   <<JPCNT>>                                                            00306000
INTEGER  JPCNT'NUMFREE = DB+0;                                          00308000
BYTE ARRAY JPCNT (*)   = DB+1;                                          00310000
$PAGE "***   COMMON FIELDS OF JMAT, IDD, ODD   ***"                     00312000
DEFINE                                                                  00314000
   << PREFIX >>                                                         00316000
           TBL'MAXSIZE       = DB0.(0:8)         #,                     00318000
           TBL'CURSIZE       = DB0.(8:8)         #,                     00320000
              TBLQUANTUM     = 128               #,                     00322000
           TBL'ENTRYSIZE     = DB1.(8:8)         #,                     00324000
           TBL'ENTRYAREAP    = PDB2              #,                     00326000
                                                                        00328000
           << CHAINS DEFINED BY "HEAD" POINTER,                         00330000
              IMMEDIATELY FOLLOWED BY "TAIL" POINTER.                   00332000
              EACH POINTS TO WD 0 OF ENTRY.                             00334000
              NULL CHAIN:  HEAD = 0;  TAIL = @HEAD.                     00336000
              CHAIN TERMINATED BY 0 LINK.                               00338000
           >>                                                           00340000
           TTCHAINEND        = 0                 #,                     00342000
           TT'INUSEWORD      = 0                 #,                     00344000
              FREEENTRY      = 0                 #,                     00346000
           TT'JTYPE          = 1).(0:2           #,                     00348000
              SESSIONTYPE    = 1                 #,                     00350000
              BATCHTYPE      = 2                 #,                     00352000
           TT'JNUM           = 1).(2:14          #,                     00354000
           TT'JOBNUM         = 1                 #,                     00356000
           TT'UNAME          = 2                 #,                     00358000
           TT'UNAME'D        = 1                 #,                     00360000
           TT'ANAME          = 6                 #,                     00362000
           TT'JNAME          = 10                #,                     00364000
           TT'LINKP'W        = 25                #,                     00366000
           TT'LINKP          = TT'LINKP'W        #;                     00368000
$PAGE "***   JOB MASTER TABLE - JMAT   ***"                             00370000
<< JOB MASTER TABLE - JMAT >>                                           00372000
   DEFINE                                                               00374000
   << PREFIX >>                                                         00376000
           JMAT'MAXSIZE      = TBL'MAXSIZE       #,                     00378000
           JMAT'CURSIZE      = TBL'CURSIZE       #,                     00380000
           JMAT'ENTRYSIZE    = TBL'ENTRYSIZE     #,                     00382000
           JMAT'ENTRYP       = TBL'ENTRYAREAP    #,                     00384000
           JMAT'SCHEDHEADP   = PDB3              #,                     00386000
              JOBCHAINEND    = 0                 #,                     00388000
           JMAT'SCHEDTAILP   = PDB4              #,                     00390000
           JMAT'NEXTNUMS     = ARRDB5            #,                     00392000
           JMAT'NEXTJOBNUM   = DB5               #,                     00394000
           JMAT'NEXTSNUM     = DB5.(2:14)        #,                     00396000
           JMAT'NEXTSESNUM   = DB6               #,                     00398000
           JMAT'NEXTJNUM     = DB6.(2:14)        #,                     00400000
           JMAT'LOGOFF       = DB7.(0:1)         #,                     00402000
           JMAT'JOBFENCE     = DB7.(12:4)        #,                     00404000
           JMAT'JLIMITS      = ARRDB8            #,                     00406000
           JMAT'SLIMIT       = DB8               #,                     00408000
           JMAT'JCOUNTS      = ARRDB9            #,                     00410000
           JMAT'SCOUNT       = DB9               #,                     00412000
           JMAT'JLIMIT       = DB10              #,                     00414000
           JMAT'JCOUNT       = DB11              #,                     00416000
           JMAT'WORKAREA     = ARRDB12           #,                     00418000
   << ENTRY >>                                                          00420000
           JM'JSTATE         = 0).(0:6           #,                     00422000
              JOBINTRO       = 1                 #,                     00424000
              JOBWAIT        = %40               #,                     00426000
              JOBINIT        = %60               #,                     00428000
              JOBEXEC        = 2                 #,                     00430000
              JOBDONE        = 3                 #,                     00432000
              JOBSUSP        = 4                 #,                     00434000
              JOBERR         = %50               #,                     00436000
           JM'D              = 0).(6:1           #,                     00438000
           JM'ERRH           = 0).(6:1           #,                     00440000
           JM'I              = 0).(7:1           #,                     00442000
           JM'DI             = 0).(6:2           #,                     00444000
           JM'ERRC           = 0).(7:1           #,                     00446000
           JM'G              = 0).(8:1           #,                     00448000
           JM'QUIET          = 0).(8:1           #,                     00450000
           JM'A              = 0).(9:1           #,                     00452000
           JM'U              = 0).(10:1          #,                     00454000
           JM'C              = 0).(11:1          #,                     00456000
           JM'INPRI          = 0).(12:4          #,                     00458000
              JOBHIPRI       = 15                #,                     00460000
           JM'ERRLIST        = 0).(8:8           #,                     00462000
           JM'JTYPE          = TT'JTYPE          #,                     00464000
           JM'JNUM           = TT'JNUM           #,                     00466000
           JM'JOBNUM         = TT'JOBNUM         #,                     00468000
           JM'ERRPARM        = 1).(0:6           #,                     00470000
           JM'ERRNUM         = 1).(6:10          #,                     00472000
           JM'UNAME          = TT'UNAME          #,                     00474000
           JM'UNAME'D        = TT'UNAME'D        #,                     00476000
           JM'ANAME          = TT'ANAME          #,                     00478000
           JM'JNAME          = TT'JNAME          #,                     00480000
           JM'LGNAME         = 14                #,                     00482000
           JM'LGNAME'D       = 7                 #,                     00484000
           JM'JIN            = 18).(0:8          #,                     00486000
           JM'JLIST          = 18).(8:8          #,                     00488000
           JM'STARTTIME      = 19                #,                     00490000
           JM'MAINPIN        = 22).(0:8          #,                     00492000
           JM'XPRI           = 22).(8:8          #,                     00494000
           JM'TIMELIMIT      = 23                #,                     00496000
           JM'SPOOLED        = 24).(0:1          #,                     00498000
           JM'RESTART        = 24).(1:1          #,                     00500000
           JM'SEQUENCED      = 24).(2:1          #,            <<1.RAO>>00502000
           JM'CILOG          = 24).(3:2          #,            <<00.04>>00504000
           JM'OUTPRI         = 24).(5:4          #,                     00506000
           JM'NUMCOPIES      = 24).(9:7          #,                     00508000
           JM'ORIGJIN        = 25).(0:8          #,                     00510000
           JM'ORIGJLIST      = 25).(8:8          #,                     00512000
           JM'SCHEDLINKP'W   = TT'LINKP'W        #,                     00514000
           JM'SCHEDLINKP     = TT'LINKP          #;                     00516000
$PAGE "***   UCOP DECLARATIONS   ***"                                   00518000
INTEGER     REQ1    = Q+1    ,                                          00520000
            REQ2    = Q+2    ;                                          00522000
INTEGER ARRAY REQLIST(*) = DB+0;                                        00524000
DOUBLE ARRAY REQENTRY(*) = DB+0;                                        00526000
INTEGER     REQMAX  = DB+0   ,                                          00528000
            REQFREE = DB+1   ,                                          00530000
            REQNEXT = DB+2   ;                                          00532000
                                                                        00534000
<< ALLOCATE PARMS >>                                                    00536000
INTEGER ARRAY     DEVINFO (0:8);                                        00538000
BYTE ARRAY        NULLFORMS (0:1) := "..";                              00540000
INTEGER POINTER   XDDSUBP;          <<SUB ENTRY PNTR>>                  00542000
INTEGER           XDDSUBX;          <<FOR OLD ALLOCATE>>                00544000
INTEGER           UCOPPIN;          <<ALLOCATE "OWNER">>                00546000
                                                                        00548000
<< JOB ERROR PRINTING STUFF >>                                          00550000
EQUATE            CANTSTARTSESL  = 33;                         <<01029>>00552000
BYTE ARRAY        CANTSTARTSES (0: CANTSTARTSESL-1)  :=        <<01029>>00554000
                     " CAN'T INITIATE NEW SESSIONS NOW",0;     <<01029>>00556000
                                                                        00558000
LOGICAL WAITFLAGS;                                                      00560000
      << UCOP LOCAL WAIT INFORMATION:                                   00562000
         15 JOB WAITING FOR DEVICE (WILL SET JOBSYNCH BEFORE WAIT),     00564000
         0  ERROR PRINTING(S) WAITING (CHECKED BEFORE WAIT).    >>      00566000
INTEGER    COMINTLB     ,                                               00568000
           COMINTDP     ;                                               00570000
                                                                        00572000
                                                                        00574000
SWITCH SWEX := NULL, JMP, PROCOUT;                                      00576000
                                                                        00578000
                                                                        00580000
$PAGE "***   EXTERNAL PROCEDURES   ***"                                 00582000
LOGICAL PROCEDURE GETSIR(A);                                            00584000
   VALUE   A;                                                           00586000
   LOGICAL A;                                                           00588000
   OPTION EXTERNAL;                                                     00590000
                                                                        00592000
PROCEDURE RELSIR(A,B);                                                  00594000
   VALUE   A,B;                                                         00596000
   LOGICAL A,B;                                                         00598000
   OPTION EXTERNAL;                                                     00600000
                                                                        00602000
PROCEDURE RELDATASEG(A);                                                00604000
   VALUE   A;                                                           00606000
   LOGICAL A;                                                           00608000
   OPTION EXTERNAL;                                                     00610000
                                                                        00612000
PROCEDURE RETURNENTRY(A,B);                                             00614000
   VALUE   A,B;                                                         00616000
   LOGICAL A,B;                                                         00618000
   OPTION EXTERNAL;                                                     00620000
                                                                        00622000
INTEGER PROCEDURE GETDATASEG(MEMSIZE,VDSIZE);                           00624000
   VALUE   MEMSIZE,VDSIZE;                                              00626000
   INTEGER MEMSIZE,VDSIZE;                                              00628000
   OPTION EXTERNAL;                                                     00630000
                                                                        00632000
INTEGER PROCEDURE GETSTACK(MEMSIZE,VDSIZE);                             00634000
   VALUE   MEMSIZE,VDSIZE;                                              00636000
   INTEGER MEMSIZE,VDSIZE;                                              00638000
   OPTION EXTERNAL;                                                     00640000
                                                                        00642000
LOGICAL PROCEDURE GETENTRY(IX);                                         00644000
   VALUE   IX;                                                          00646000
   LOGICAL IX;                                                          00648000
   OPTION EXTERNAL;                                                     00650000
                                                                        00652000
LOGICAL PROCEDURE EXCHANGEDB(A);                                        00654000
   VALUE   A;                                                           00656000
   LOGICAL A;                                                           00658000
   OPTION EXTERNAL;                                                     00660000
                                                                        00662000
PROCEDURE AWAKE(PCBPT,N,W);                                             00664000
   VALUE   PCBPT,N,W;                                                   00666000
   INTEGER PCBPT,N,W;                                                   00668000
   OPTION EXTERNAL;                                                     00670000
                                                                        00672000
PROCEDURE WRITEDSEG(D);                                                 00674000
   VALUE   D;                                                           00676000
   INTEGER D;                                                           00678000
   OPTION EXTERNAL;                                                     00680000
                                                                        00682000
PROCEDURE PROCREATE (PIN, PLABEL, DELTAP, STACKDST, GLOBSIZE,  <<01200>>00684000
                     DLSIZE, LOCSIZE, PRI, STRING, STRINGLNTH, <<01200>>00686000
                     PARM, FLAGS, MAXSTACK, STDIN, STDLIST);   <<01200>>00688000
  VALUE PLABEL, DELTAP, STACKDST, GLOBSIZE, DLSIZE, LOCSIZE,   <<01200>>00690000
        PRI, STRING, STRINGLNTH, PARM, FLAGS, MAXSTACK;        <<01200>>00692000
  INTEGER PLABEL, DELTAP, STACKDST, GLOBSIZE, DLSIZE, LOCSIZE, <<01200>>00694000
          PRI, STRING, STRINGLNTH, PARM, PIN, MAXSTACK;        <<01200>>00696000
  LOGICAL FLAGS;                                               <<01200>>00698000
  LOGICAL ARRAY STDIN, STDLIST;                                <<01200>>00700000
  OPTION EXTERNAL;                                             <<01200>>00702000
                                                                        00704000
PROCEDURE WAIT(WF,JP);                                                  00706000
   VALUE   WF,JP;                                                       00708000
   INTEGER WF,JP;                                                       00710000
   OPTION EXTERNAL;                                                     00712000
                                                                        00714000
PROCEDURE BURRYPROC(PCBPT);                                             00716000
   VALUE   PCBPT;                                                       00718000
   INTEGER PCBPT;                                                       00720000
   OPTION EXTERNAL;                                                     00722000
                                                                        00724000
PROCEDURE BURYPROC(PCBPT);                                              00726000
   VALUE PCBPT;                                                         00728000
   INTEGER PCBPT;                                                       00730000
   OPTION EXTERNAL;                                                     00732000
                                                                        00734000
INTEGER PROCEDURE ALLOCATE                                              00736000
   (INDEX, OLD, OUTPRI, ID, JMPIN, FORMSMSG, JNUM, COPIES,              00738000
         DEVINFO, XDDSUBP, ACCESS);                                     00740000
      VALUE INDEX, OLD, OUTPRI, JMPIN, JNUM, COPIES;                    00742000
      INTEGER INDEX, OUTPRI, JMPIN, JNUM, COPIES, ACCESS;               00744000
      LOGICAL OLD;                                                      00746000
      ARRAY ID, DEVINFO;                                                00748000
      BYTE ARRAY FORMSMSG;                                              00750000
      INTEGER POINTER XDDSUBP;                                          00752000
      OPTION EXTERNAL;                                                  00754000
                                                                        00756000
PROCEDURE DEALLOCATE (DEVICE);                                          00758000
   VALUE DEVICE;                                                        00760000
   INTEGER DEVICE;                                                      00762000
   OPTION EXTERNAL;                                                     00764000
                                                                        00766000
DOUBLE PROCEDURE ATTACHIO (DEV, QM, DST, BUF, FN, CNT, P1, P2, FL);     00768000
   VALUE DEV, QM, DST, BUF, FN, CNT, P1, P2, FL;                        00770000
   INTEGER DEV, QM, DST, BUF, FN, CNT, P1, P2, FL;                      00772000
   OPTION EXTERNAL;                                                     00774000
                                                                        00776000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,A,B,C,D,E,           <<0U.EB>>00778000
      DEST,REPLY,BUFF,DST,IOTYPE);                             <<0U.EB>>00780000
   VALUE SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,           <<0U.EB>>00782000
      DST,IOTYPE;                                              <<0U.EB>>00784000
   LOGICAL SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,         <<0U.EB>>00786000
      DST,IOTYPE;                                              <<0U.EB>>00788000
   OPTION VARIABLE,EXTERNAL;                                   <<0U.EB>>00790000
                                                                        00792000
PROCEDURE ABORTPROCIO (PIN);                                            00794000
   VALUE PIN;                                                           00796000
   INTEGER PIN;                                                         00798000
   OPTION EXTERNAL;                                                     00800000
                                                                        00802000
LOGICAL PROCEDURE CILOGTABLE(C,J,L,A);                         <<00.04>>00804000
   VALUE   C,J;                                                <<00.04>>00806000
   INTEGER C,J,L;                                              <<00.04>>00808000
   INTEGER ARRAY A;                                            <<00.04>>00810000
   OPTION EXTERNAL;                                            <<00.04>>00812000
                                                               <<00.04>>00814000
PROCEDURE DELINKENTRY (HP, EP);                                         00816000
   VALUE EP;                                                            00818000
   INTEGER POINTER HP, EP;                                              00820000
   OPTION EXTERNAL;                                                     00822000
                                                                        00824000
PROCEDURE DEALLOCENTRY (EP);                                            00826000
   VALUE EP;                                                            00828000
   INTEGER POINTER EP;                                                  00830000
   OPTION EXTERNAL;                                                     00832000
                                                                        00834000
INTEGER PROCEDURE SYSPROC(LPIN);                                        00836000
   VALUE   LPIN;                                                        00838000
   INTEGER LPIN;                                                        00840000
   OPTION EXTERNAL;                                                     00842000
                                                                        00844000
PROCEDURE FCREATECB (A,B,C,D,E);                                        00846000
   VALUE A,B,C,D,E;                                                     00848000
   INTEGER B,C,D,E;                                                     00850000
   INTEGER POINTER A;                                                   00852000
   OPTION EXTERNAL;                                                     00854000
                                                               <<01549>>00856000
PROCEDURE FCPOSTIMEOUT(PORTMAP);                               <<01549>>00858000
   VALUE PORTMAP;                                              <<01549>>00860000
   INTEGER PORTMAP;                                            <<01549>>00862000
   OPTION EXTERNAL;                                            <<01549>>00864000
$PAGE "***   JOB SELECTION/LAUNCH ROUTINES   ***"                       00866000
INTEGER PROCEDURE LAUNCHJOB (JMATP);                                    00868000
   VALUE JMATP;                                                         00870000
   INTEGER POINTER JMATP;                                               00872000
   OPTION PRIVILEGED, UNCALLABLE, INTERNAL;                             00874000
<< DETERMINES WHETHER JOB <JMATP> CAN BE LAUNCHED, EXAMINING            00876000
   AVAILABILITY OF JOB-LOCAL, JOB-TYPE RELEVANT, AND                    00878000
   SYSTEM RESOURCES.  YF EVERY CONDITION SATISFIED, AND ALL             00880000
   RESOURCES ACQUIRED, LAUNCHJOB UPDATES THE JMAT ENTRY                 00882000
   AND "LAUNCHES" JOB (PROCREATE/AWAKE).    >>                          00884000
BEGIN                                                                   00886000
   INTEGER           FAILNUM   = LAUNCHJOB;   <<RETURN #>>              00888000
   EQUATE            NOFAIL   = 0,     <<SUCCESSFUL>>                   00890000
                     << JOB-SPECIFIC FAILURES: >>                       00892000
                     DEFERREDFAIL   = 8,                                00894000
                     JLISTFAIL   = 9,                                   00896000
                     JINFAIL   = 10,                                    00898000
                     << JOB-GENERIC FAILURE: >>                         00900000
                     LIMITFAIL   = 16,                                  00902000
                     << SYSTEM RESOURCE FAILURES: >>                    00904000
                     SYSFAILGROUP   = 3,                                00906000
                     STACKFAIL   = 24,                                  00908000
                     JITFAIL   = 25,                                    00910000
                     JDTFAIL   = 26,                                    00912000
                     PCBFAIL   = 27,                                    00914000
                     JPCNTFAIL   = 28,                                  00916000
                     FILEFAIL    = 29;                                  00918000
<< REQUEST PARAMETERS >>                                                00920000
   EQUATE            INITSTACKSIZE   = CIS'GLOBSTKSIZE         <<04600>>00922000
                                      +PCBXSIZE +LOCSIZE,      <<04600>>00924000
                     MAXSTACKSIZE   = MAXSIZE,                          00926000
                     INITJITSIZE   = 61,                                00928000
                     MAXJITSIZE   = 0,                                  00930000
                     INITJDTSIZE = 34,                                  00932000
                     MAXJDTSIZE   = 17*128-4; <<17 SECTORS-4 >><<00284>>00934000
   EQUATE            STACKFLAG   = 0,  <<FOR GETDATASEG>>               00936000
                     JPFREE   = %376,  <<JPCNT FREE INDICATOR>>         00938000
                     JPENDFREE   = %177776,   <<SCAN-FOR-FREE WORD>>    00940000
                     PCBCODE   = 3,    <<FOR GETENTRY>>        <<02.EB>>00942000
                     EXPCODE = 7;  << For INITJSMP >>          <<04556>>00944000
<< ACQUIRED RESOURCES >>                                                00946000
LOGICAL INTERACTIVE;                                           <<01549>>00948000
   INTEGER           JIN,              <<ALLOC'D DEVS>>                 00950000
                     JLIST,                                             00952000
                     STACKDST,         <<DATA SEG #S>>                  00954000
                     JITDST,                                            00956000
                     JDTDST,                                            00958000
                     MAINPIN,          <<PCB INDEX>>                    00960000
                     FILEDST,                                           00962000
                     PRI;              <<EXECUTION PRI (#)>>            00964000
   BYTE POINTER      JPCNTP;           << ("JPCNTX") >>                 00966000
   INTEGER POINTER   DEVINP;           <<JOB INPUT LDT PNTR>>           00968000
<< INFO PASSED TO CI  IN JIT >>                                <<02.EB>>00970000
   EQUATE            CINUMPARMS   = 4;                         <<02.EB>>00972000
   ARRAY             CIPARMS (0:CINUMPARMS-1)   = Q;                    00974000
   INTEGER POINTER   JINXDDEP   = CIPARMS;    <<JIN XDD PNTR>>          00976000
   INTEGER           JINDEVTYPE   = CIPARMS +1;    <<JIN DEVTYPE>>      00978000
   INTEGER POINTER   JLISTXDDEP   = CIPARMS +2;    <<JLIST XDD P>>      00980000
   INTEGER           JLISTALLOC   = CIPARMS +3;    <<ALLOC RETURN>>     00982000
   INTEGER POINTER   PCBXINIT;  <<UCOP STACK ADDR OF PCBX SETUP>>       00984000
<< MISC LOCALS >>                                                       00986000
   INTEGER           JOBTYPEX,         <<JOBTYPE -1 (0=S; 1=J)>>        00988000
                     ACCESS,           <<ALLOC ACCESS>>                 00990000
                     SAVESIR;          <<JPCNT SIR RETURN>>             00992000
   LOGICAL           OLD,              <<ALLOCATE OLD FLAG>>            00994000
                     << FOLLOWING VARIABLE INDICATES ALLOC ORDER:       00996000
                        (15:1) = FIRST,  (14:1) = SECOND;               00998000
                        VALUES:  TRUE => JIN,  FALSE => JLIST.  >>      01000000
                     ALLOCORDER  := 1;  <<ASSUME (JIN THEN JLIST)>>     01002000
   LOGICAL POINTER   LJMATP   = JMATP;                                  01004000
   DOUBLE POINTER    DJMATP   = JMATP;                                  01006000
   INTEGER           JMATX;                                             01008000
   EQUATE SPOOLEDCLASS = -3; <<ALLOCATE RETURN>>               <<00640>>01010000
   LOGICAL NOSTDIN   := 0,        << FOR PROCREATE CALL >>     <<01200>>01012000
           NOSTDLIST := 0;                                     <<01200>>01014000
   EQUATE  NOSTRING   = 0,                                     <<01200>>01016000
           NOSTLEN    = 0;                                     <<01200>>01018000
<< >>                                                                   01020000
LOGICAL SUBROUTINE ALLOC (OLDPARM);                                     01022000
   VALUE OLDPARM;                                                       01024000
   LOGICAL OLDPARM;    <<TRUE => JIN; FALSE => JLIST>>                  01026000
<< ALLOCATES JLIST OR JIN; SETTING <DEV>. >>                            01028000
BEGIN                                                                   01030000
   OLD := OLDPARM;    <<WON'T BE ABLE TO ACCESS S-REL.>>                01032000
   XREG := JM'UNAME'D;                                                  01034000
   DO TOS := DJMATP (XREG)    <<STACK NAMES ON TOS>>                    01036000
   UNTIL (XREG := XREG +1) = JM'LGNAME'D;                               01038000
   TOS := "$STD";                                                       01040000
   TOS := IF OLD THEN "IN  " ELSE "LIST";                               01042000
<< STACK JMAT ENTRY PARMS FOR ALLOCATE (1ST 8) >>                       01044000
   TOS := 0;    <<RETURN PARM>>                                         01046000
   << STACK DEV & OLD/NEW FLAG; SET ACCESS >>                           01048000
   IF OLD THEN                                                          01050000
      BEGIN                                                             01052000
      TOS := JMATP (JM'JIN);                                            01054000
      TOS := TRUE;                                                      01056000
      ACCESS := 0;                                                      01058000
      END                                                               01060000
   ELSE                                                                 01062000
      BEGIN                                                             01064000
      TOS := JMATP (JM'JLIST);                                          01066000
      IF LJMATP (JM'C) THEN TOS := -TOS;                                01068000
      TOS := FALSE;                                                     01070000
      ACCESS := 1;                                                      01072000
      END;                                                              01074000
   TOS := JMATP (JM'OUTPRI);                                            01076000
   TOS := 0;    <<FOR @NAMES (STACK) >>                                 01078000
   TOS := MAINPIN;   <<OWNER PIN>>                                      01080000
   TOS := 0;    <<FOR @NULLFORMS>>                                      01082000
   TOS := JMATP (JM'JOBNUM);                                            01084000
   TOS := JMATP (JM'NUMCOPIES);                                         01086000
<< COMPLETE ALLOCATE SETUP FROM STACK >>                                01088000
   EXCHANGEDB (0);                                                      01090000
   @PS4 := @ARRS24;                                                     01092000
   @PS2 := @NULLFORMS;                                                  01094000
   TOS := ALLOCATE (*, *, *, *, *, *, *, *,                             01096000
         DEVINFO, XDDSUBP, ACCESS);                                     01098000
   ASSEMBLE (STAX, SUBS 16);                                            01100000
   IF XREG = SPOOLEDCLASS THEN XREG := 0;                      <<00640>>01102000
   IF XREG <= 0 THEN                                                    01104000
      BEGIN    <<SUCCESSFUL ALLOC>>                                     01106000
      IF OLD THEN                                                       01108000
         BEGIN    << SET JIN AND CI PARMS >>                            01110000
         JIN := DEVINFO;                                                01112000
         @JINXDDEP := @XDDSUBP;                                         01114000
         JINDEVTYPE := DEVINFO (3 +LD'DEVTYPE);                         01116000
         END                                                            01118000
      ELSE                                                              01120000
         BEGIN    << SET JLIST & CI PARMS >>                            01122000
         JLISTALLOC := XREG;                                            01124000
         JLIST := DEVINFO;                                              01126000
         @JLISTXDDEP := @XDDSUBP;                                       01128000
         END;                                                           01130000
      ALLOC := TRUE;                                                    01132000
      END                                                               01134000
   ELSE                                                                 01136000
      ALLOC := FALSE;                                                   01138000
   EXCHANGEDB (JMATDST);                                                01140000
   END;    << ALLOC >>                                                  01142000
   << >>                                                                01144000
SUBROUTINE DEALLOC (DEV);                                               01146000
   VALUE DEV;                                                           01148000
   INTEGER DEV;                                                         01150000
<< DEALLOCATE DEV >>                                                    01152000
BEGIN                                                                   01154000
   EXCHANGEDB (0);                                                      01156000
   DEALLOCATE (DEV +%1400);                                             01158000
   EXCHANGEDB (JMATDST);                                                01160000
   END;    << DEALLOC >>                                                01162000
   << >>                                                                01164000
LOGICAL SUBROUTINE GETFILEDST;                                          01166000
<< ALLOCATES FILE NOBUF DST; SETS FILEDST >>                            01168000
BEGIN                                                                   01170000
   GETFILEDST := TRUE;                                                  01172000
   FILEDST := 0;                                                        01174000
   IF JMATP (JM'JTYPE) <> SESSIONTYPE THEN                              01176000
      BEGIN                                                             01178000
      EXCHANGEDB(0);                                                    01180000
      FCREATECB(0,0,-69,0,0);                                           01182000
      DDEL;                                                             01184000
      IF < THEN GETFILEDST := FALSE;                                    01186000
      FILEDST := EXCHANGEDB(JMATDST);                                   01188000
      END;                                                              01190000
   END;                                                                 01192000
   << >>                                                                01194000
SUBROUTINE RELJPCNT;                                                    01196000
<< RELEASE JPCNT ENTRY <JPCNTP>. >>                                     01198000
BEGIN                                                                   01200000
   EXCHANGEDB (JPCNTDST);                                               01202000
   SAVESIR := GETSIR (JPCNTSIR);                                        01204000
   JPCNTP := JPFREE;                                                    01206000
   JPCNT'NUMFREE := JPCNT'NUMFREE +1;                                   01208000
   RELSIR (JPCNTSIR, SAVESIR);                                          01210000
   EXCHANGEDB (JMATDST);                                                01212000
   END;    << RELJPCNT >>                                               01214000
                                                                        01216000
                                                                        01218000
   << >>                                                                01220000
LOGICAL SUBROUTINE GETJPCNT;                                            01222000
<< GET JPCNT ENTRY; AND STORE (BYTE) POINTER IN <JPCNTP>. >>            01224000
BEGIN                                                                   01226000
   EXCHANGEDB (JPCNTDST);                                               01228000
   SAVESIR := GETSIR (JPCNTSIR);                                        01230000
   SCAN JPCNT UNTIL JPENDFREE, 1;                                       01232000
   IF CARRY THEN                                                        01234000
      BEGIN    << GOT TERMINATOR B4 FREE INDICATOR >>                   01236000
      DEL;                                                              01238000
      GETJPCNT := FALSE;                                                01240000
      END                                                               01242000
   ELSE                                                                 01244000
      BEGIN    <<GOT FREE ENTRY INDICATOR BEFORE TERMINATOR>>           01246000
      BPS0 := 0;    <<INITIALIZE>>                                      01248000
      @JPCNTP := TOS;                                                   01250000
      JPCNT'NUMFREE := JPCNT'NUMFREE -1;                                01252000
      GETJPCNT := TRUE;                                                 01254000
      END;                                                              01256000
   RELSIR (JPCNTSIR, SAVESIR);                                          01258000
   EXCHANGEDB (JMATDST);                                                01260000
   END;    <<GETJPCNT>>                                                 01262000
                                                                        01264000
                                                                        01266000
<< PROCEDURE BODY >>                                                    01268000
   JOBTYPEX := (JMATP (JM'JTYPE) -1) &ASL(1);                           01270000
   FAILNUM := LIMITFAIL;                                                01272000
   IF (JMAT'JCOUNTS (JOBTYPEX) < JMAT'JLIMITS (JOBTYPEX))               01274000
   OR (JMATP (JM'INPRI) = JOBHIPRI LAND JMAT'LOGOFF = 0) THEN           01276000
      BEGIN    <<SATISFIED =LIMIT>>                                     01278000
      JMAT'JCOUNTS (JOBTYPEX) := JMAT'JCOUNTS (JOBTYPEX) +1;            01280000
      FAILNUM := DEFERREDFAIL;                                          01282000
      IF JMATP (JM'INPRI) > JMAT'JOBFENCE THEN                          01284000
         BEGIN    <<SATISFIED FENCE>>                                   01286000
         FAILNUM := PCBFAIL;                                            01288000
         IF ( MAINPIN := GETENTRY (PCBCODE) ) <> 0 THEN                 01290000
            BEGIN    <<GOT PCB>>                                        01292000
            FAILNUM := STACKFAIL;                                       01294000
            IF (STACKDST := GETSTACK(INITSTACKSIZE,MAXSTACKSIZE))       01296000
                  <> 0 THEN                                             01298000
               BEGIN    <<GOT STACK>>                                   01300000
               FAILNUM := JITFAIL;                                      01302000
               IF (JITDST := GETDATASEG (INITJITSIZE, MAXJITSIZE))      01304000
                     <> 0 THEN                                          01306000
                  BEGIN    <<GOT JIT>>                                  01308000
                  FAILNUM := JDTFAIL;                                   01310000
                  IF (JDTDST := GETDATASEG (INITJDTSIZE, MAXJDTSIZE))   01312000
                        <> 0 THEN                                       01314000
                     BEGIN    <<GOT JDT>>                               01316000
                     FAILNUM := FILEFAIL;                               01318000
                     IF GETFILEDST THEN                                 01320000
                      BEGIN  <<GOT FILE NOBUF DST>>                     01322000
                      FAILNUM := JPCNTFAIL;                             01324000
                      IF GETJPCNT THEN                                  01326000
                        BEGIN    <<GOT JPCNT ENTRY>>                    01328000
                        IF LJMATP (JM'C)                                01330000
                              OR JMATP (JM'JIN) <> JMATP (JM'JLIST) THEN01332000
                           BEGIN   <<IN <> LIST: ALLOC LIST, THEN IN>>  01334000
                           ALLOCORDER := 2;  <<LIST THEN IN SIGNAL>>    01336000
                           FAILNUM := JLISTFAIL;  <<IN CASE FAILS>>     01338000
                           END                                          01340000
                     << ELSE                                            01342000
                           JIN= JLIST: ALLOC IN, THEN LIST.             01344000
                           ALLOCORDER := 1; BY INITIALIZATION;          01346000
                           FAILNUM NOT SET,                             01348000
                              'CAUSE ALLOC (JIN) WON'T FAIL. >>;        01350000
                        IF ALLOC (ALLOCORDER) THEN                      01352000
                           BEGIN    <<GOT JOB LIST, OR IN  DEV>>        01354000
                           FAILNUM:=(IF ALLOCORDER THEN        <<SB.00>>01356000
                                     JLISTFAIL ELSE JINFAIL);  <<SB.00>>01358000
                           IF ALLOC (ALLOCORDER &LSR(1)) THEN           01360000
                              BEGIN    <<GOT EVERYTHING>>               01362000
                              << SETUP FOR JOB LAUNCH >>                01364000
                              FAILNUM := NOFAIL;                        01366000
                              DELINKENTRY (JMAT'SCHEDHEADP, JMATP);     01368000
                              << UPDATE JMAT >>                         01370000
                              JMATP (JM'JSTATE) := JOBINIT;             01372000
                              JMATP (JM'ORIGJIN) := JMATP (JM'JIN);     01374000
                              JMATP (JM'JIN) := JIN;                    01376000
                              JMATP (JM'ORIGJLIST) := JMATP (JM'JLIST); 01378000
                              JMATP (JM'JLIST) := JLIST;                01380000
                              JMATP (JM'MAINPIN) := MAINPIN;            01382000
                              << PROCREATE C.I. >>                      01384000
                              PRI := JMATP (JM'XPRI);                   01386000
                              <<SETUP CI PXGLOB (3:6)>>                 01388000
                              TOS := JIN;    <<PXGLOB(3)>>              01390000
                              TOS.(0:8):=@JMATP/JMAT'ENTRYSIZE;<<02.EB>>01392000
                              TOS := JLIST;    <<PXGLOB(4)>>            01394000
                              TOS.(0:8) := @JPCNTP;                     01396000
                              TOS := JDTDST;    <<PXGLOB(5)>>           01398000
                              TOS := JITDST;    <<PXGLOB(6)>>           01400000
                              TOS.(1:1) := JMATP (JM'RESTART);          01402000
                              TOS.(2:2) := JMATP (JM'JTYPE);            01404000
                              TOS.(4:2) := JMATP (JM'DI);               01406000
ASSEMBLE(TBC 5);                                               <<01549>>01408000
IF <> THEN INTERACTIVE:=TRUE ELSE INTERACTIVE:=FALSE;          <<01549>>01410000
                              TOS := JMATP (JM'JOBNUM);        <<00.01>>01412000
                              EXCHANGEDB (0);                           01414000
                              <<PLACE JOBNUM INTO UCOP PCBX>>  <<00.01>>01416000
                              <<PROCREATE WILL XFER JOBNUM>>   <<00.01>>01418000
                              <<INTO PJXREF DST FOR SHOWQ>>    <<00.01>>01420000
                              PUSH(Q,DL);                      <<00.01>>01422000
                              ASSEMBLE(XCH,SUB);               <<00.01>>01424000
                              X := S0 - 2;                     <<00.01>>01426000
                              TOS := TOS - ARRQ0(X);           <<00.01>>01428000
                              X := TOS + PXFIXEDJN;            <<00.01>>01430000
                              ARRQ0(X) := TOS;                 <<00.01>>01432000
                              @PCBXINIT := @S3; <<MOVE ADDR>>  <<00.01>>01434000
                              PROCREATE (                               01436000
                                  MAINPIN, COMINTLB, COMINTDP,          01438000
                                  STACKDST,                    <<04600>>01440000
                                  CIS'GLOBSTKSIZE, DLSIZE,     <<04600>>01442000
                                  LOCSIZE-128, PRI, NOSTRING,  <<01200>>01444000
                                  NOSTLEN, EXPCODE, 0,         <<04556>>01446000
                                  MAXSIZE, NOSTDIN, NOSTDLIST);<<01200>>01448000
                              << INITIALIZE PCBX >>                     01450000
                              << MOVE PXGLOB (3:6) IN >>                01452000
                              TOS := STACKDST;  <<SETUP MOVE>>          01454000
                              TOS := 3;                                 01456000
                              TOS := @PCBXINIT;                         01458000
                              TOS := 4;                                 01460000
                              ASSEMBLE (MTDS 4);                        01462000
                              ASSEMBLE (SUBS 4); <<REMOVE SETUP>>       01464000
                              << PUT COMM. INFO INTO JIT >>    <<02.EB>>01466000
                              TOS := JITDST;                   <<02.EB>>01468000
                              TOS := 0; << OFFSET IN JIT>>     <<02.EB>>01470000
                              TOS := @CIPARMS;<<SOURCE>>       <<02.EB>>01472000
                              TOS := CINUMPARMS;<<COUNT>>      <<02.EB>>01474000
                              ASSEMBLE(MTDS 4);                <<02.EB>>01476000
                              << FIND PXFILE >>                         01478000
                              << MOVE FILE NOBUF DST >>                 01480000
                              TOS := STACKDST;                          01482000
                              TOS := 0;                                 01484000
                              TOS := @S0;                               01486000
                              TOS := STACKDST;                          01488000
                              TOS := 8;                                 01490000
                              TOS := 1;                                 01492000
                              ASSEMBLE(MFDS 4);                         01494000
                              TOS := TOS+8+8;                           01496000
                              TOS := @FILEDST;                          01498000
                              TOS := 1;                                 01500000
                              ASSEMBLE(MTDS 4);                         01502000
                              EXCHANGEDB (JMATDST);                     01504000
                              << AWAKE C.I. >>                          01506000
                              TOS := MAINPIN *PCBSIZE;                  01508000
A'(S0+A'(PCBB)+RESABORTINFOWORDNUM).CRITFLAG:=1;               <<01549>>01510000
IF INTERACTIVE THEN                                            <<01549>>01512000
A'(S0+A'(PCBB)+QUEUEINGINFOWORDNUM).INTERACTIVEFLAG:=1;        <<01549>>01514000
                              AWAKE (S0, 1, 0);                         01516000
                              RETURN;    <<TO UCOP LOOP>>               01518000
                              END;    <<SUCCESSFUL LAUNCH>>             01520000
      << UNWIND ACQUISITIONS BY "UNNESTING" >>                          01522000
                           <<EITHER JIN OR JLIST FAILED>>      <<SB.00>>01524000
                           IF FAILNUM=JINFAIL THEN             <<SB.00>>01526000
                                DEALLOC(JLIST)                 <<SB.00>>01528000
                           ELSE                                <<SB.00>>01530000
                                DEALLOC(JIN);                  <<SB.00>>01532000
                           END;                                <<SB.00>>01534000
                         RELJPCNT;                                      01536000
                         END;                                           01538000
                        IF FILEDST <> 0 THEN                            01540000
                           RELDATASEG(FILEDST);                         01542000
                        END;                                            01544000
                     RELDATASEG (JDTDST);                               01546000
                     END;                                               01548000
                  RELDATASEG (JITDST);                                  01550000
                  END;                                                  01552000
               RELDATASEG (STACKDST);                                   01554000
               END;                                                     01556000
            RETURNENTRY (PCBCODE, MAINPIN);                             01558000
            END;                                                        01560000
         END;                                                           01562000
      JMAT'JCOUNTS (JOBTYPEX) := JMAT'JCOUNTS (JOBTYPEX) -1;            01564000
      END;                                                              01566000
   WRITEDSEG(JMATDST);                                                  01568000
   << FAILNUM (TYPE RETURN) CONTAINS THE FAILURE REASON >>              01570000
   << INFORM OPERATOR, IF SYSTEM RESOURCE FAILURE >>                    01572000
   IF FAILNUM.(10:3) = SYSFAILGROUP THEN                                01574000
      BEGIN    <<TELL OP OF JOB RESOURCE DEPLETION>>                    01576000
      EXCHANGEDB (0);                                                   01578000
      CASE FAILNUM.(13:3) OF                                            01580000
         BEGIN                                                          01582000
         TOS := 1;  <<STACK>>                                           01584000
         TOS := 2;  <<JIT>>                                             01586000
         TOS := 3;  <<JDT>>                                             01588000
         TOS := 0;  <<PCB>>                                             01590000
         TOS := 4;  <<JPCNT>>                                           01592000
         TOS := 5   <<FILEDST>>                                         01594000
         END;                                                           01596000
      GENMSG(1,18,%10000,S0,,,,,0);                            <<0U.EB>>01598000
      EXCHANGEDB (JMATDST);                                             01600000
      END;                                                              01602000
   END;    <<LAUNCHJOB>>                                                01604000
$PAGE                                                                   01606000
LOGICAL PROCEDURE GETJOB;                                               01608000
<< SCANS JMAT SCHEDULING QUEUE ATTEMPTING TO: 1). LAUNCH A              01610000
   QUALIFYING SESSION;  2). PRINT A PENDING JOB ERROR                   01612000
   MESSAGE;  OR 3). LAUNCH A QUALIFYING BATCH JOB.                      01614000
   REMOVES EVERY SESSION ENCOUNTERED WHICH CANNOT BE LAUNCHED           01616000
   IMMEDIATELY.  RETURNS (TRUE) AS SOON AS A JOB IS LAUNCHED.           01618000
   SETS <WAITFLAGS> AS APPROPRIATE (I.E. ERROR MESSAGE                  01620000
   WAITING FOR THE ERROR BUFFER; AND/OR ENTRY WAITING FOR A             01622000
   DEVICE).  SEE, ALSO, LAUNCHJOB.    >>                                01624000
BEGIN                                                                   01626000
<< JMAT POINTERS >>                                                     01628000
   INTEGER POINTER   JMATP,            <<ENTRY BEING CONSIDERED>>       01630000
                     NEXTENTRY;        <<NEXT ONE>>                     01632000
   LOGICAL POINTER   LJMATP   = JMATP;                                  01634000
<< LOCAL UCOP WAIT FLAGS >>                                             01636000
   LOGICAL           LWAITFLAGS;                                        01638000
   DEFINE            WAITDEV   = LWAITFLAGS.(15:1) #,                   01640000
                     WAITERRBUF   = LWAITFLAGS.(0:1) #;                 01642000
<< MISC. VARS >>                                                        01644000
   LOGICAL           STOPFLAG   := FALSE;  <<STOP SCAN FLAG>>           01646000
   INTEGER           CILOGX;                                   <<00.04>>01648000
   INTEGER           ACTION,           <<LAUNCHJOB'S ACTION>>           01650000
                     SIRRETURN;        <<JMAT SIR RETURN>>              01652000
   EQUATE            LAUNCHOK   = 0,   <<LAUNCHJOB RETURNS>>            01654000
                     SPECIFICFAIL   = 1,                                01656000
                     JINFAIL   = 10,                                    01658000
                     JLISTFAIL   = 9;                                   01660000
   << A LIST OF DEVICES WHICH CANNOT BE ALLOC'D IS KEPT ON THE STACK    01662000
      .(6:2) = 0  =>  JIN                                               01664000
             = 3  =>  JLIST CLASS (INDEX)                               01666000
             = 2  =>  JLIST DEVICE             >>                       01668000
   INTEGER ARRAY     ARRS0 (*)  = S-0; <<TO ACCESS CAN'T ALLOC LIST>>   01670000
   INTEGER           NUMCANTALLOC  := 0, <<NUM ENTRIES IN LIST>>        01672000
                     TARGET;                                            01674000
   INTEGER POINTER   DEVINP;           << JIN LDT PNTR >>               01676000
   EQUATE            TERMTYPE  = 16;   << TERM DEV TYPE >>              01678000
   INTEGER           LISTDEVICE;                               <<01029>>01680000
   << >>                                                                01682000
   GETJOB := FALSE;                                                     01684000
   LWAITFLAGS := 4;                                                     01686000
   EXCHANGEDB (JMATDST);                                                01688000
   SIRRETURN := GETSIR (JMATSIR);                                       01690000
   DISABLE;                                                    <<01549>>01692000
   TOS:=ABSYS'MISCWORD; TOS.JOBSYNC:=0; ABSOLUTE(XREG):=TOS;   <<01549>>01694000
   ENABLE;                                                     <<01549>>01696000
   @JMATP := @JMAT'SCHEDHEADP;                                          01698000
   WHILE (@JMATP <> JOBCHAINEND) AND (NOT (STOPFLAG)) DO                01700000
      BEGIN                                                             01702000
      @NEXTENTRY := JMATP (JM'SCHEDLINKP);                              01704000
      IF NUMCANTALLOC > 0 THEN                                          01706000
         BEGIN  <<CHECK 2 C IF THIS JIN/JLIST FAILED B4>>               01708000
         TARGET := LJMATP (JM'JLIST) LOR %1000;                         01710000
         IF LJMATP (JM'C) THEN TARGET.(7:1) := 1;                       01712000
         XREG := -NUMCANTALLOC +1;                                      01714000
         DO IF ARRS0 (XREG) = TARGET THEN GOTO NEXT                     01716000
         UNTIL (XREG := XREG +1) > 0;                                   01718000
         TARGET := JMATP (JM'JIN);                                      01720000
         XREG := -NUMCANTALLOC +1;                                      01722000
         DO IF ARRS0 (XREG) = TARGET THEN GOTO NEXT                     01724000
         UNTIL (XREG := XREG +1) > 0;                                   01726000
         << JIN OR JLIST HASN'T PREVIOUSLY FAILED >>                    01728000
         END;                                                           01730000
      IF (ACTION := LAUNCHJOB (JMATP)) = LAUNCHOK THEN                  01732000
         STOPFLAG := (GETJOB := TRUE)                                   01734000
      ELSE                                                              01736000
         BEGIN    <<COULDN'T LAUNCH>>                                   01738000
         IF JMATP (JM'JTYPE) = SESSIONTYPE THEN                         01740000
            BEGIN    <<COULDN'T LAUNCH SESSION: REMOVE>>                01742000
            @DEVINP := JMATP (JM'JIN) *LDTSIZE;                         01744000
            EXCHANGEDB (LDTDST);                                        01746000
            << C IF NECESSARY 2 SETUP TERMINAL DEVICE >>                01748000
            TOS := (DEVINP (LD'DEVTYPE) = TERMTYPE);                    01750000
            EXCHANGEDB (JMATDST);                                       01752000
            IF TOS THEN                                                 01754000
               ATTACHIO (JMATP (JM'JIN), 0, 0, 0, 21, 0, 1, 0, %13);    01756000
            IF (LJMATP (JM'C))                                          01758000
            OR (JMATP (JM'JIN) <> JMATP (JM'JLIST)) THEN                01760000
               BEGIN  << TELL OP 'CAUSE CAN'T TELL USER >>              01762000
               EXCHANGEDB (0);                                          01764000
               << MESSAGE >>                                            01766000
               EXCHANGEDB (JMATDST);                                    01768000
               END                                                      01770000
            ELSE                                                        01772000
               BEGIN    <<TELL USER>>                                   01774000
               LISTDEVICE := JMATP(JM'JLIST);                  <<01029>>01776000
               EXCHANGEDB (0);                                          01778000
               GENMSG(-1,@CANTSTARTSES,,,,,,,LISTDEVICE);      <<01029>>01780000
               EXCHANGEDB (JMATDST);                                    01782000
               END;                                                     01784000
            << REMOVE JMAT ENTRY >>                                     01786000
            DELINKENTRY (JMAT'SCHEDHEADP, JMATP);                       01788000
            TOS := JMATP (JM'JIN) +%3400;                               01790000
            CILOGX := JMATP (JM'CILOG);                        <<00.04>>01792000
            DEALLOCENTRY (JMATP);                                       01794000
            EXCHANGEDB (0);                                             01796000
            DEALLOCATE (S0);                                            01798000
            DEL;                                                        01800000
            IF CILOGX <> 0 THEN                                <<00.04>>01802000
                  CILOGTABLE(2,@JMATP,CILOGX,ARRS0);           <<00.04>>01804000
            EXCHANGEDB (JMATDST);                              <<00.04>>01806000
            END                                                         01808000
         ELSE                                                           01810000
            BEGIN    <<COULDN'T LAUNCH JOB>>                            01812000
            IF ACTION = JLISTFAIL THEN                                  01814000
               BEGIN    << ADD JLIST TO CANT ALLOC LIST >>              01816000
               TOS := LJMATP (JM'JLIST) LOR %1000;                      01818000
               IF LJMATP (JM'C) THEN TOS.(7:1) := 1;                    01820000
               NUMCANTALLOC := NUMCANTALLOC +1;                         01822000
               WAITDEV := TRUE;                                         01824000
               END                                                      01826000
            ELSE                                                        01828000
               IF ACTION = JINFAIL THEN                                 01830000
                  BEGIN    << ADD JIN TO CANT ALLOC LIST >>             01832000
                  TOS := JMATP (JM'JIN);                                01834000
                  NUMCANTALLOC := NUMCANTALLOC +1;                      01836000
                  WAITDEV := TRUE;                                      01838000
                  END                                                   01840000
               ELSE                                                     01842000
                  << ALL OTHER LAUNCH FAILURES WOULD CAUSE              01844000
                     ANY SUBSEQUENT JOB TO FAIL ALSO >>                 01846000
                  STOPFLAG := TRUE;                                     01848000
            END;                                                        01850000
         END;    << LAUNCH FAILURE HANDLING >>                          01852000
NEXT:                                                                   01854000
      @JMATP := @NEXTENTRY;                                             01856000
      END;                                                              01858000
   RELSIR (JMATSIR, SIRRETURN);                                         01860000
   EXCHANGEDB (0);                                                      01862000
   WAITFLAGS := LWAITFLAGS;                                             01864000
   END;    << GETJOB >>                                                 01866000
$PAGE "***   OUTER BLOCK   ***"                                         01868000
      <<INITIALISATION PHASE:SET UP UCOP REQUEST LIST>>                 01870000
                                                                        01872000
      ASSEMBLE(ADDS 17);                                                01874000
      EXCHANGEDB(URLDST);          <<SET DB TO URL>>                    01876000
      REQFREE := 2;                 <<INIT LIST POINTERS>>              01878000
      REQNEXT := 2;                                                     01880000
      EXCHANGEDB(0);                                                    01882000
      <<COMMAND INTERPRETER LABELS>>                                    01884000
      COMINTLB := ABSYS'CIEXTL.(8:8) LOR %100000;                       01886000
      COMINTDP:= ABSYS'CIINTL;                                          01888000
      A'(A'(CPCB)+9).(6:2):=3;      <<PROCESS TYPE>>                    01890000
      UCOPPIN := (A'(CPCB) -A'(PCBB)) / PCBSIZE;                        01892000
      AWAKE(SYSPROC(0),2,%20);                 <<AWAKE PROGENITOR>>     01894000
                                                                        01896000
                                                                        01898000
START:                                                                  01900000
      EXCHANGEDB(URLDST);          <<SET DB TO URL>>                    01902000
U4:   DISABLE;                                                          01904000
      IF REQNEXT = REQFREE THEN                                         01906000
      BEGIN                            <<NO MORE REQUESTS>>             01908000
U1:      ENABLE;                                                        01910000
U1':     EXCHANGEDB (0);                                                01912000
U3:      IF GETJOB THEN GOTO U1                                         01914000
         ELSE                                                           01916000
            BEGIN                      << NO READY JOB FOUND >>         01918000
            << WAIT IFF:                                                01920000
               - UCOP REQUEST QUEUE EMPTY,  AND                         01922000
               - NO "STOP" REQUESTED,  AND                              01924000
               - NO JOB(S) JUST MADE READY,  AND                        01926000
               - NO (DEV JUST MADE AVAIL AND JOB(S) WAITING),  AND      01928000
            << SETUP XREG VALUES NEEDED AFTER DISABLE >>                01930000
            TOS := MISCWORD;  <<JOB SYNCH WORD>>               <<01549>>01932000
            PUSH (Q);                                                   01934000
            TOS := -TOS +@WAITFLAGS;                                    01936000
            TOS := ABSYS+UCOPSW;  <<UCOP STOP WORD>>                    01938000
            EXCHANGEDB (URLDST);                                        01940000
            DISABLE;                      << GO >>                      01942000
            IF REQNEXT <> REQFREE THEN                                  01944000
               BEGIN                   <<UCOP REQ. Q NOT EMPTY>>        01946000
               ASSEMBLE (DDEL, DEL);                                    01948000
               GOTO U2;                                                 01950000
               END;                                                     01952000
            XREG := TOS;                                                01954000
            IF ABSOLUTE(XREG) < 0 THEN                                  01956000
               BEGIN                   <<STOP REQUESTED>>               01958000
               ENABLE;                                                  01960000
               ABORTPROCIO (0);        <<STOP ANY ERROR PRINTING>>      01962000
               AWAKE (SYSPROC(0), 2, 0);  <<AWAKE PROGEN, SIGNAL STOP>> 01964000
               WAIT (0, 0);                                             01966000
               END;                                                     01968000
            XREG := TOS;                                                01970000
            TOS := ARRQ0(XREG);        <<LOCAL WAIT INDICATORS>>        01972000
            ASSEMBLE (STBX, DUP);                                       01974000
            TOS := ABSOLUTE (XREG);    <<JOB SYNCH WORD>>               01976000
            ASSEMBLE (AND, DEL);                                        01978000
            IF <> THEN                                                  01980000
               BEGIN                   <<JOB JUST MADE READY,  OR>>     01982000
               ENABLE;                 <<DEVICE FREED AND JOB(S) WAIT>> 01984000
               DDEL;                                                    01986000
               GOTO U1';                                                01988000
               END;                                                     01990000
            <<SHIFT JOB SYNC BITS ONE TO THE LEFT TO SIGNAL>>  <<01549>>01992000
            <<IF JOBS ARE WAITING.>>                           <<01549>>01994000
            DISABLE;                                           <<01549>>01996000
            TOS:=ABSOLUTE(XREG); ASSEMBLE(XCH);                <<01549>>01998000
            TOS:=(TOS&LSL(1)).JOBSYNC;  <<ALSO CLEARS PORTS>>  <<01549>>02000000
            ABSOLUTE(XREG):=TOS;                               <<01549>>02002000
            ENABLE;                                            <<01549>>02004000
            TOS:=TOS.PORTIMER;  <<PORT TIMEOUT?>>              <<01549>>02006000
            IF <> THEN                                         <<01549>>02008000
               FCPOSTIMEOUT(*)                                 <<01549>>02010000
            ELSE                                               <<01549>>02012000
               DEL;                                            <<01549>>02014000
            WAIT (-16, 0);                                     <<01549>>02016000
            DEL;                                                        02018000
            GOTO U4;                                                    02020000
            END;                                                        02022000
      END ELSE                                                          02024000
      BEGIN                                                             02026000
                                                                        02028000
      <<THE REQUEST LIST IS NOT EMPTY>>                                 02030000
U2:      TOS := REQENTRY(REQNEXT);  <<DOUBLE REQUEST>>                  02032000
         REQNEXT := IF REQNEXT=REQMAX+2 THEN 2 ELSE REQNEXT+1;          02034000
         ENABLE;                                                        02036000
         EXCHANGEDB(0);                                                 02038000
         REQ2:=TOS;                                                     02040000
         REQ1:=TOS;                                                     02042000
         GOTO SWEX(REQ1.(12:4));                                        02044000
      END;                                                              02046000
                                                                        02048000
                                                                        02050000
NULL:                                                                   02052000
      GOTO START;                                                       02054000
                                                                        02056000
JMP:                                                                    02058000
                                                                        02060000
PROCOUT:                                                                02062000
      BURRYPROC(REQ2.(8:8) * PCBSIZE);                                  02064000
      IF A' (A' (CPCB) +5). (8:8) = 0 THEN                              02066000
         << REMOVING LAST SON >>                                        02068000
         << TRY AWAKENING PROGEN IN CASE THIS IS LOGOFF (WAIT FOR SON)>>02070000
         AWAKE (SYSPROC(0), 2, 0);                                      02072000
      GOTO START;                                                       02074000
                                                               <<01549>>02076000
                                                                        02078000
                                                                        02080000
END;        <<* * * * * * * *       U C O P           * * * * * * >>    02082000
