$CONTROL MAP,CODE,USLINIT                                               00010000
<<LOG - MODULE 12>>                                                     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
$ TITLE "   HP-3000 SYSTEM LOGGING PROCESS "                   <<01700>>00028000
$ THIRTY                                                                00030000
$ CONTROL PRIVILEGED,UNCALLABLE,MAIN=LOG,SEGMENT=LOG                    00032000
BEGIN                                                                   00034000
                                                                        00036000
<<----------------------------------------------------------------------00038000
*                                                                      *00040000
*                     3000/30 LOGGING PROCESS                          *00042000
*                                                                      *00044000
---------------------------------------------------------------------->>00046000
                                                                        00048000
                                                               <<01549>>00050000
INTEGER S0 = S-0;                                                       00052000
                                                               <<01549>>00054000
INTEGER S2 = S-2;                                                       00056000
INTEGER S3 = S-3;                                                       00058000
LOGICAL LS0 = S-0;                                                      00060000
LOGICAL LS1 = S-1;                                                      00062000
LOGICAL LS2 = S-2;                                                      00064000
LOGICAL LS3 = S-3;                                                      00066000
INTEGER X = X;                                                          00068000
                                                                        00070000
DEFINE ENABLE = ASSEMBLE(SED 1)#;                                       00072000
DEFINE DISABLE = ASSEMBLE(SED 0)#;                                      00074000
                                                                        00076000
<<----------------------------------------------------------------------00078000
*                                                                      *00080000
*  SYSGLOB DEFINITIONS                                                 *00082000
*                                                                      *00084000
---------------------------------------------------------------------->>00086000
                                                                        00088000
EQUATE                                                                  00090000
SYSDISC     = 1,           <<LDEV OF SYSTEM DISC>>                      00092000
INFOSECTOR  = 28,          <<COLDLOAD INFO SECTORS>>                    00094000
SYSDB       = 512,         <<SYSTEM DB OFFSET>>                         00096000
SYSUP       = SYSDB+%73,   <<SYSTEM UP FLAG>>                           00098000
PROGENPINX  = SYSDB+%141,  <<PROGEN PCB INDEX>>                         00100000
LOGINFO     = SYSDB+%167,  <<LOGGING AREA>>                             00102000
BUF0X       = SYSDB+%172,  <<BUFFER 0 DST NR.>>                         00104000
BUFSIZEX    = SYSDB+%174,  <<BUFFER SIZE (SECTORS)>>                    00106000
                                                               <<01549>>00108000
FLAGX       = SYSDB+%176,  <<FLAG WORD>>                                00110000
LOGREC0X    = SYSDB+%177,  <<BUFFER 0 RECORDS WRITTEN>>                 00112000
FILESIZE0X  = SYSDB+%203,  <<FILE SIZE (BLOCKS) - 1ST HALF>>            00114000
FNX         = SYSDB+%205,  <<FILE NUMBER>>                              00116000
BLOCKS0X    = SYSDB+%206,  <<BLOCKS WRITTEN - 1ST HALF>>                00118000
BLOCKS1X    = SYSDB+%207,  <<BLOCKS WRITTEN - 2ND HALF>>                00120000
LOST0X      = SYSDB+%210,  <<TOTAL RECORDS LOST - 1ST HALF>>            00122000
STOPBITS    = SYSDB+%300;  <<SHUTDOWN STOP BITS>>                       00124000
                                                                        00126000
<<----------------------------------------------------------------------00128000
*                                                                      *00130000
*  LOGGING DEFINITIONS AND VARIABLES                                   *00132000
*                                                                      *00134000
---------------------------------------------------------------------->>00136000
                                                                        00138000
EQUATE LOGLIM=9999,FOPT=%2100,AOPT=%504,                       <<01549>>00140000
   EMPTY=0,CURRENT=1,FULL=2;                                            00142000
                                                                        00144000
INTEGER SAVEDB; << For saving DB ... obviously  >>               <<LJC>>00146000
INTEGER T;  <<UTILITY INTEGER>>                                         00148000
INTEGER ARRAY BUF (0:127);  <<UTILITY BUFFER>>                          00150000
INTEGER ARRAY LBUF(*)=DB+0;  <<LOG BUFFER PTR>>                <<01549>>00152000
LOGICAL DUMMY;                                                 <<01549>>00154000
LOGICAL INIT;  <<INITIALIZATION PHASE FLAG>>                            00156000
BYTE ARRAY LOGFNAME (0:8) := "LOG     ";  <<LOG FILE NAME>>             00158000
BYTE ARRAY LOGNUMBER (*) = LOGFNAME(3);                                 00160000
BYTE ARRAY TEMP (0:4);                                                  00162000
INTEGER LFN;  <<LOG FILE NUMBER>>                                       00164000
BYTE ARRAY BA34 (0:4) := "3/4",0;                                       00166000
BYTE ARRAY BA12 (0:4) := "1/2",0;                                       00168000
LOGICAL ARRAY NEWSECMATRIX(0:1); <<  New security matrix  >>     <<LJC>>00170000
ARRAY NULL (0:1) := 0;                                                  00172000
LOGICAL FNEW,FLAGS,FOPTN,F12,F34;                              <<01549>>00174000
INTEGER ERRN;                                                           00176000
LOGICAL FER;                                                            00178000
INTEGER FILENUM,BUFSIZE,FILESIZE1,FILESIZE2,BUFDST,BX;                  00180000
DOUBLE FILESIZE = FILESIZE1;                                            00182000
DOUBLE WBLOCKCT;                                               <<01700>>00184000
                                                                        00186000
<<----------------------------------------------------------------------00188000
*                                                                      *00190000
*  EXTERNAL PROCEDURE DECLARATIONS                                     *00192000
*                                                                      *00194000
---------------------------------------------------------------------->>00196000
                                                                        00198000
INTRINSIC FOPEN,ASCII,FWRITE,FCONTROL,FCHECK,FCLOSE;           <<01700>>00200000
                                                                        00202000
DOUBLE PROCEDURE ATTACHIO (LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS);  00204000
   VALUE LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                     00206000
   INTEGER LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                   00208000
   OPTION EXTERNAL;                                                     00210000
PROCEDURE AWAKE (P,A,W);                                                00212000
   VALUE P,A,W;                                                         00214000
   INTEGER P,A,W;                                                       00216000
   OPTION EXTERNAL;                                                     00218000
INTEGER PROCEDURE EXCHANGEDB (A);                                       00220000
   VALUE A;                                                             00222000
   INTEGER A;                                                           00224000
   OPTION EXTERNAL;                                                     00226000
PROCEDURE LOG;                                                          00228000
   OPTION EXTERNAL;                                                     00230000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,A,B,C,D,E,           <<0U.EB>>00232000
      DEST,REPLY,BUFF,DST,IOTYPE);                             <<0U.EB>>00234000
   VALUE SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,           <<0U.EB>>00236000
      DST,IOTYPE;                                              <<0U.EB>>00238000
   LOGICAL SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,         <<0U.EB>>00240000
      DST,IOTYPE;                                              <<0U.EB>>00242000
   OPTION VARIABLE,EXTERNAL;                                   <<0U.EB>>00244000
                                                               <<0U.EB>>00246000
PROCEDURE SUDDENDEATH (N);                                              00248000
   VALUE N;                                                             00250000
   INTEGER N;                                                           00252000
   OPTION EXTERNAL;                                                     00254000
PROCEDURE WAIT (W,D);                                                   00256000
   VALUE W,D;                                                           00258000
   INTEGER W,D;                                                         00260000
   OPTION EXTERNAL;                                                     00262000
PROCEDURE FALTSEC(FILENUM,NEWSECUREFLAG,NEWMATRIX,OLDFLAG,       <<LJC>>00264000
                  OLDMATRIX,EXCOND);                             <<LJC>>00266000
          VALUE FILENUM;                                         <<LJC>>00268000
          LOGICAL FILENUM,NEWSECUREFLAG,OLDFLAG,EXCOND;          <<LJC>>00270000
          ARRAY NEWMATRIX,OLDMATRIX;                             <<LJC>>00272000
          OPTION VARIABLE,EXTERNAL;                              <<LJC>>00274000
$ PAGE "  HP-3000 SYSTEM LOGGING PROCESS "                     <<01700>>00276000
                                                                        00278000
<<------------------------------------------------------------------->> 00280000
                                                                        00282000
SUBROUTINE OK;                                                          00284000
   BEGIN                                                                00286000
   IF FER THEN  <<ERROR?>>                                              00288000
      BEGIN                                                             00290000
      DISABLE;                                                          00292000
      ABSOLUTE(LOGINFO).(15:1) := 1;  <<TURN ON LOGGING>>               00294000
      ABSOLUTE(FLAGX).(11:1) := 0;  <<TURN OFF SUSPENDED>>              00296000
      ENABLE;                                                           00298000
      GENMSG(1,205,%10000,LFN);                                <<0U.EB>>00300000
      <<EMIT LOG ERROR RECORD>>                                         00302000
      TOS := ABSOLUTE(LOST0X);  <<TOTAL RECORDS LOST - 1ST HALF>>       00304000
      TOS := ABSOLUTE(X := X+1);  <<TOTAL RECORDS LOST - 2ND HALF>>     00306000
      TOS := ABSOLUTE(X := X+1);  <<RECORDS LOST - JOB INITIATION>>     00308000
      TOS := ABSOLUTE(X := X+1);  <<RECORDS LOST - JOB TERMINATION>>    00310000
      TOS := 0;  <<RECORD TYPE>>                                        00312000
      LOG;  <<EMIT LOG RECORD>>                                         00314000
      ASSEMBLE(ZERO);                                                   00316000
      ABSOLUTE(X) := TOS;                                               00318000
      ASSEMBLE(ZERO,DECX);                                              00320000
      ABSOLUTE(X) := TOS;                                               00322000
      ASSEMBLE(ZERO,DECX);                                              00324000
      ABSOLUTE(X) := TOS;                                               00326000
      ASSEMBLE(ZERO,DECX);                                              00328000
      ABSOLUTE(X) := TOS                                                00330000
      END                                                               00332000
   END;     <<  O K  >>                                                 00334000
                                                                        00336000
<<------------------------------------------------------------------->> 00338000
                                                                        00340000
SUBROUTINE ERROR (ERRN);                                                00342000
   <<CHECKS THE RECOVERABILITY OF THE SPECIFIED ERROR.                  00344000
                                                                        00346000
     INPUT VARIABLES:                                                   00348000
         ERRN - ERROR NUMBER                                            00350000
                                                                        00352000
     RETURNS TO THE CALLER ONLY IF THE ERROR IS RECOVERABLE>>           00354000
   VALUE ERRN;                                                          00356000
   INTEGER ERRN;                                                        00358000
   BEGIN                                                                00360000
   IF ERRN = 46 OR (61 <= ERRN <= 62) OR ERRN=100 THEN         <<01905>>00362000
      BEGIN     << RECOVERY IS POSSIBLE >>                     <<01905>>00364000
      GENMSG(1,204,%11000,LFN,ERRN);                           <<0U.EB>>00366000
      DISABLE;                                                          00368000
      ABSOLUTE(LOGINFO).(15:1) := 0;  <<TURN OFF LOGGING>>              00370000
      ABSOLUTE(FLAGX).(11:1) := 1;  <<SUSPENDED>>                       00372000
      FER := TRUE;  <<SET ERROR FLAG>>                                  00374000
      IF ABSOLUTE(SYSUP) THEN                                           00376000
         WAIT(%20,0)                                                    00378000
      ELSE                                                              00380000
         AWAKE(ABSOLUTE(PROGENPINX),2,%20);  <<AWAKEN PROGEN>>          00382000
      <<RESTARTS ON RESUMELOG ACTION>>                                  00384000
      ENABLE                                                            00386000
      END                                                               00388000
   ELSE  <<NOT RECOVERABLE>>                                            00390000
      BEGIN                                                             00392000
      GENMSG(1,203,%11000,LFN,ERRN);                           <<0U.EB>>00394000
      DISABLE;                                                          00396000
      ABSOLUTE(LOGINFO).(15:1) := 0;  <<TURN OFF LOGGING>>              00398000
      ABSOLUTE(FLAGX).(12:1) := 1;  <<STOPPED>>                         00400000
B:    IF ABSOLUTE(SYSUP) THEN                                           00402000
         WAIT(%4000,0)                                                  00404000
      ELSE                                                              00406000
         AWAKE(ABSOLUTE(PROGENPINX),2,%4000);  <<AWAKEN PROGEN>>        00408000
      GOTO B                                                            00410000
      END                                                               00412000
   END;     <<  E R R O R  >>                                           00414000
                                                                        00416000
<<------------------------------------------------------------------->> 00418000
                                                                        00420000
INTEGER SUBROUTINE LFNUMBER (DUF);                                      00422000
<< Gets the Log file number from SYSDB and checks its validity.         00424000
If DUF = TRUE, increments the Log file number and updates both          00426000
SYSDB and the system disc (sector 18, word 11).                         00428000
                                                                        00430000
     INPUT VARIABLES:                                                   00432000
         DUF - NEW FILE NUMBER FLAG                                     00434000
                                                                        00436000
     OUTPUT VARIABLES:                                                  00438000
         LFNUMBER - LOG FILE NUMBER                                     00440000
                                                                        00442000
   >>                                                                   00444000
   VALUE DUF;                                                           00446000
   LOGICAL DUF;                                                         00448000
   BEGIN                                                                00450000
   TOS := ABSOLUTE(FNX);  <<FILE NUMBER>>                               00452000
   IF LS2 THEN TOS := TOS+1;  <<INCREMENT FILE NR.>>                    00454000
   ASSEMBLE(DUP,DUP);                                                   00456000
   IF TOS > LOGLIM THEN ASSEMBLE(DDEL,DZRO);                            00458000
   ABSOLUTE(X) := TOS;  <<UPDATE FILE NR.>>                             00460000
   S3 := TOS;  <<FILE NUMBER>>                                          00462000
   IF DUF THEN  <<UPDATE SYSTEM DISC?>>                                 00464000
      BEGIN                                                             00466000
      TOS := ATTACHIO(SYSDISC,0,0,@BUF,0,128,0,INFOSECTOR,1);  <<READ>> 00468000
      DEL;                                                              00470000
      IF TOS.(13:3) <> 1 THEN ERROR(1);  <<BAD READ?>>                  00472000
      BUF(11) := S2;  <<UPDATE FILE NR.>>                               00474000
      TOS := ATTACHIO(SYSDISC,0,0,@BUF,1,128,0,INFOSECTOR,1);  <<WRITE>>00476000
      DEL;                                                              00478000
      IF TOS.(13:3) <> 1 THEN ERROR(1)  <<BAD WRITE?>>                  00480000
      END                                                               00482000
   END;  << L F N U M B E R >>                                          00484000
                                                                        00486000
<<------------------------------------------------------------------->> 00488000
                                                                        00490000
LOGICAL SUBROUTINE LOGOUTPUT;                                           00492000
                                                                        00494000
COMMENT                                                        <<01905>>00496000
<< Outputs one physical block to the Log file, returning                00498000
TRUE if the file is full.  Updates the number of blocks                 00500000
written to the file, and outputs console messages if the                00502000
file becomes 1/2 full or 3/4 full.                                      00504000
                                                                        00506000
In previous versions of the operating system, the log file     <<01905>>00508000
extents were pre-allocated.  Therefore, LOGOUTPUT would        <<01905>>00510000
never fail because of a lack of space.  On these systems, a    <<01905>>00512000
return value of TRUE meant that the block just output          <<01905>>00514000
filled the file.  Starting with this system, extents are       <<01905>>00516000
not pre-allocated.  However, a manual check of WBLOCKCT        <<01905>>00518000
against FILESIZE is made to determine if the file was          <<01905>>00520000
filled by the last FWRITE.  If so, LOGOUTPUT returns TRUE      <<01905>>00522000
to indicate that a new logfile should be opened.               <<01905>>00524000
                                                               <<01905>>00526000
During a SWITCHLOG or a SHUTDOWN, it is possible for a         <<01905>>00528000
buffer to be marked full even though no records have been      <<01905>>00530000
logged into the buffer.  (The "CURRENT" buffer is marked       <<01905>>00532000
full regardless of its current state.)  To prevent a           <<01905>>00534000
duplicate block from being written into the log file,          <<01905>>00536000
LOGOUTPUT marks the buffer as EMPTY and returns.               <<01905>>00538000
                                                               <<01905>>00540000
     OUTPUT VARIABLES:                                                  00542000
         LOGOUTPUT - FILE CAPACITY STATUS                               00544000
            FALSE - FILL IS NOT FULL                                    00546000
            TRUE - FILE IS FULL                                         00548000
                                                                        00550000
   >>                                                                   00552000
;  << end of header comment >>                                 <<01905>>00554000
   BEGIN                                                                00556000
   LOGOUTPUT := FALSE;                                                  00558000
                                                               <<01905>>00560000
   DISABLE;                                                    <<01905>>00562000
   IF ABSOLUTE(LOGREC0X+BX) = 0 THEN                           <<01905>>00564000
      BEGIN                                                    <<01905>>00566000
      ABSOLUTE(BUF0X+BX).(4:2) := EMPTY;                       <<01905>>00568000
      ENABLE;                                                  <<01905>>00570000
      RETURN;  << NO SENSE GOING ON. >>                        <<01905>>00572000
      END;                                                     <<01905>>00574000
   ENABLE;                                                     <<01905>>00576000
                                                               <<01905>>00578000
   FER := FALSE;                                               <<01905>>00580000
                                                               <<01905>>00582000
LP8: TOS := FILENUM;                                           <<01905>>00584000
     TOS := @LBUF;                                             <<01905>>00586000
   TOS := BUFSIZE&LSL(7);  TOS := 0;  << FWRITE PARMS >>       <<01549>>00588000
   EXCHANGEDB(BUFDST);                                         <<01549>>00590000
   FWRITE(*,*,*,*);                                            <<01549>>00592000
                                                               <<01905>>00594000
   << BRING DB BACK TO STACK, BUT SAVE CURRENT CC. >>          <<01905>>00596000
   PUSH(STATUS);                                               <<01905>>00598000
   EXCHANGEDB(0);                                              <<01905>>00600000
   SET(STATUS);                                                <<01905>>00602000
                                                               <<01905>>00604000
   IF > THEN  << EOF, SHOULDN'T HAPPEN. >>                     <<01905>>00606000
      ERROR(2)                                                 <<01905>>00608000
   ELSE IF < THEN << MAYBE A RECOVERABLE ERROR. >>             <<01905>>00610000
      BEGIN                                                    <<01905>>00612000
      FCHECK(FILENUM,ERRN);                                    <<01905>>00614000
      ERROR(ERRN);                                             <<01905>>00616000
      GO LP8;                                                  <<01905>>00618000
      END;                                                     <<01905>>00620000
   OK;                                                         <<01905>>00622000
                                                               <<01905>>00624000
   DISABLE;                                                             00626000
   ABSOLUTE(BUF0X+BX).(4:2) := EMPTY;  <<MAKE IT EMPTY>>                00628000
   ABSOLUTE(LOGREC0X+BX) := 0;  << reset buffer record count >><<01700>>00630000
   ENABLE;                                                     <<01700>>00632000
   FCONTROL(FILENUM,6,DUMMY);   << post EOF in label >>        <<01700>>00634000
   IF < THEN ERROR(2);                                         <<01905>>00636000
   TOS := WBLOCKCT;                                                     00638000
   TOS := 1D;                                                           00640000
   ASSEMBLE(DADD,DDUP);                                        <<01905>>00642000
   WBLOCKCT := TOS;       << Update # of blocks written >>     <<01700>>00644000
   ABSOLUTE(BLOCKS1X) := TOS;   << update SYSGLOB block cnt >> <<01700>>00646000
   ABSOLUTE(X := X-1) := TOS;                                           00648000
                                                               <<01905>>00650000
   << THE NUMBER OF BLOCKS RECORDED IN 'BLOCKCT' AND >>        <<01905>>00652000
   << 'FILESIZE' INCLUDES THE FILE LABEL BLOCK.      >>        <<01905>>00654000
                                                               <<01905>>00656000
   IF WBLOCKCT = FILESIZE THEN  << FILE FULL? >>               <<01905>>00658000
      BEGIN                                                    <<01905>>00660000
      GENMSG(1,202,%10000,LFN,@NULL&LSL(1));                   <<01905>>00662000
      LOGOUTPUT := TRUE;                                       <<01905>>00664000
      RETURN;                                                  <<01905>>00666000
      END;                                                     <<01905>>00668000
                                                               <<01905>>00670000
   TOS := WBLOCKCT - 1D;  << SUBTRACT OFF FILE LABEL. >>       <<01905>>00672000
   ASSEMBLE(DDUP);                                             <<01905>>00674000
   IF F34 THEN                                                          00676000
      ASSEMBLE(DDEL,DDEL)                                               00678000
   ELSE                                                                 00680000
      BEGIN                                                             00682000
      TOS := FILESIZE - 1D;  << SUBTRACT OFF FILE LABEL. >>    <<01905>>00684000
      ASSEMBLE(DDUP;DLSR 2;DSUB;DCMP);                         <<01905>>00686000
      IF >= THEN  <<FILE IS 3/4 FULL?>>                                 00688000
         BEGIN                                                          00690000
         GENMSG(1,202,%10000,LFN,@BA34);                       <<0U.EB>>00692000
         F34 := TRUE;                                                   00694000
         DDEL                                                           00696000
         END                                                            00698000
      ELSE                                                              00700000
         BEGIN                                                          00702000
         IF F12 THEN                                                    00704000
            DDEL                                                        00706000
         ELSE                                                           00708000
            BEGIN                                                       00710000
            TOS := FILESIZE; << THIS WORKS FOR 50% CHECK. >>   <<01905>>00712000
            ASSEMBLE(DLSR 1; DCMP);                                     00714000
            IF >= THEN  <<FILE IS 1/2 FULL?>>                           00716000
               BEGIN                                                    00718000
               GENMSG(1,202,%10000,LFN,@BA12);                 <<0U.EB>>00720000
               F12 := TRUE                                              00722000
               END                                                      00724000
            END                                                         00726000
         END                                                            00728000
      END                                                               00730000
   END;  << L O G O U T P U T >>                                        00732000
                                                                        00734000
<<------------------------------------------------------------------->> 00736000
                                                                        00738000
SUBROUTINE LOGFOPEN;                                                    00740000
<< Opens a new Log file, and initializes global variables. >>  <<01700>>00742000
                                                               <<01700>>00744000
      BEGIN                                                             00746000
      FNEW := TRUE;                                            <<01700>>00748000
      LOGNUMBER := "0";                                        <<01700>>00750000
      MOVE LOGNUMBER(1) := LOGNUMBER,(3);  << zero file nr.>>  <<01700>>00752000
      T := ASCII(LFN,10,TEMP);                                          00754000
      MOVE LOGNUMBER(3) := TEMP(T-1),(-T);                              00756000
      <<OPEN FILE NEW>>                                                 00758000
      BUFSIZE := ABSOLUTE(BUFSIZEX);  <<BUFFER SIZE>>                   00760000
      FILESIZE1 := ABSOLUTE(FILESIZE0X);  <<FILE SIZE - 1ST HALF>>      00762000
      FILESIZE2 := ABSOLUTE(X := X+1);  <<FILE SIZE - 2ND HALF>>        00764000
ST:   FOPTN := FOPT LOR (NOT (FNEW) LAND 1);                            00766000
      FER := FALSE;                                                     00768000
AG:   FILENUM :=                                                        00770000
      FOPEN(LOGFNAME,FOPTN,AOPT,                               <<01700>>00772000
         BUFSIZE&LSL(7)-2,,,,,,FILESIZE-1D,16,1);              <<01700>>00774000
      IF <> THEN  <<ERROR?>>                                            00776000
         BEGIN                                                          00778000
         FCHECK(0,ERRN);                                                00780000
         ERROR(ERRN);                                                   00782000
         GO AG                                                          00784000
         END;                                                           00786000
      OK;                                                               00788000
      IF FNEW THEN                                             <<01700>>00790000
         BEGIN    << FCLOSE Permanent: make directory entry. >><<01700>>00792000
         FER := FALSE;                                                  00794000
AG1:     FCLOSE(FILENUM,1,0);  << Close with Save disposition>><<01700>>00796000
         IF < THEN  <<ERROR?>>                                          00798000
            BEGIN                                                       00800000
            FCHECK(FILENUM,ERRN);                                       00802000
            ERROR(ERRN);                                                00804000
            GO AG1                                                      00806000
            END;                                                        00808000
         OK;                                                            00810000
         GENMSG(1,201,%10000,LFN);      <<LOG FILE NR.@CONS>>  <<0U.EB>>00812000
         FNEW := FALSE;                                        <<01700>>00814000
         GOTO ST;  << Re-open the file, this time as Old. >>   <<01700>>00816000
         END;                                                           00818000
      FNEW := TRUE;                                                     00820000
      WBLOCKCT := 1D;                                                   00822000
      <<RESET WBLOCKCT IN GLOBAL AREA>>                                 00824000
      ABSOLUTE(BLOCKS0X) := 0;                                          00826000
      ABSOLUTE(X := X+1) := 1;                                          00828000
      F12 := FALSE;                                                     00830000
      F34 := FALSE;                                                     00832000
      END;  << L O G F O P E N >>                                       00834000
                                                                        00836000
<<------------------------------------------------------------------->> 00838000
                                                                        00840000
INTEGER SUBROUTINE OTHERBUF;                                            00842000
   <<COMPLEMENTS BX, UPDATES BUFDST ACCORDINGLY AND RETURNS THE         00844000
     BUFFER STATE FROM SYSDB.                                           00846000
                                                                        00848000
     OUTPUT VARIABLES:                                                  00850000
         OTHERBUF - BUFFER STATE                                        00852000
                                                                        00854000
   >>                                                                   00856000
   BEGIN                                                                00858000
   BX := (BX+1).(15:1);  <<COMPLEMENT BX>>                              00860000
   TOS := ABSOLUTE(BUF0X+BX);                                           00862000
   ASSEMBLE(DUP);                                                       00864000
   BUFDST := TOS LAND %1777;                                            00866000
   S2 := TOS.(4:2)  <<STATE>>                                           00868000
   END;  << O T H E R B U F >>                                          00870000
                                                                        00872000
<<------------------------------------------------------------------->> 00874000
                                                                        00876000
<<  Main procedure begins here  >>                             <<01700>>00878000
                                                                        00880000
      INIT := TRUE;  <<SET INITIALIZATION FLAG>>                        00882000
      LFN := LFNUMBER(FALSE);  <<GET LOG FILE NUMBER>>                  00884000
      LOGFOPEN;  <<OPEN LOG FILE>>                                      00886000
      IF INIT THEN  <<INITIALIZATION PHASE?>>                           00888000
         BEGIN                                                          00890000
         IF ABSOLUTE(SYSUP) THEN  <<PROGEN NOT WAITING>>                00892000
            WAIT(%20,0)                                                 00894000
         ELSE                                                           00896000
            BEGIN                                              <<03781>>00898000
            AWAKE(ABSOLUTE(PROGENPINX),2,0);                   <<03781>>00900000
            BX := ABSOLUTE(FLAGX).(15:1); << current >>        <<03781>>00902000
            IF ABSOLUTE(BUF0X + BX).(4:2) = FULL AND           <<03781>>00904000
               ABSOLUTE(LOGINFO) THEN                          <<03781>>00906000
               << will have to go to work >>                   <<03781>>00908000
            ELSE                                               <<03781>>00910000
               << wait a while >>                              <<03781>>00912000
               WAIT(%20,0);                                    <<03781>>00914000
            END;                                               <<03781>>00916000
         INIT := FALSE  <<CLEAR INITIALIZATION FLAG>>                   00918000
         END;                                                           00920000
                                                                        00922000
      <<COMMAND LOOP>>                                                  00924000
                                                                        00926000
LP1:  DISABLE;                                                          00928000
      TOS := ABSOLUTE(FLAGX);                                           00930000
      FLAGS := S0;  <<SAVE COPY OF FLAGS>>                              00932000
      FLAGS.(15:1) := ABSOLUTE(STOPBITS).(1:1);  <<SHUTDOWN>>           00934000
      BX := TOS.(13:1);  <<CURRENT BUFFER>>                             00936000
      IF OTHERBUF = FULL THEN  <<OTHER BUFFER FULL?>>                   00938000
         BEGIN                                                          00940000
LP3:     ENABLE;                                                        00942000
         IF LOGOUTPUT THEN GOTO LP2;  << FILE FULL. >>         <<01905>>00944000
LP4:     DISABLE;                                              <<01905>>00946000
         IF OTHERBUF = FULL THEN GOTO LP3;                              00948000
         IF OTHERBUF = FULL THEN GOTO LP3;                              00950000
         FLAGS.(15:1) := ABSOLUTE(STOPBITS).(1:1);<<SHUTDOWN>> <<01905>>00952000
         IF FLAGS.(14:2) <> 0 THEN GOTO LP6;                            00954000
         WAIT(%20,0);                                                   00956000
                                                                        00958000
         <<SLEEP UNTIL NEXT AWAKENING>>                                 00960000
                                                                        00962000
         GOTO LP1                                                       00964000
         END;                                                           00966000
      << THE NON CURRENT IS NOT FULL>>                                  00968000
      IF FLAGS.(14:2) = 0 THEN SUDDENDEATH(30);                         00970000
LP6:  OTHERBUF;  <<LP6: SWITCH TO "CURRENT" BUFFER (NOT FULL)>>         00972000
      ABSOLUTE(BUF0X+BX).(4:2) := FULL;  <<MARK BUFFER FULL>>           00974000
      BX := (BX+1).(15:1);  <<COMPLEMENT BX>>                           00976000
      IF ABSOLUTE(BUF0X+BX).(4:2) = EMPTY THEN                          00978000
         BEGIN                                                          00980000
         ABSOLUTE(X).(4:2) := CURRENT;                                  00982000
         ABSOLUTE(FLAGX).(13:1) := BX;                                  00984000
         ABSOLUTE(X := X-1) := 0  <<ZERO FREE POINTER>>                 00986000
         END                                                            00988000
      ELSE  <<OTHER BUFFER NON-EMPTY?>>                                 00990000
         SUDDENDEATH(31);                                               00992000
      BX := (BX+1).(15:1);  <<RESET BX>>                                00994000
      ENABLE;                                                           00996000
      LOGOUTPUT;                                                        00998000
LP2:  FER := FALSE;                                            <<01905>>01000000
  << Set the log file's security to be accessed by the >>        <<LJC>>01002000
  << creator only                                      >>        <<LJC>>01004000
LP7: NEWSECMATRIX(0):=%040000;<< Give file 'CREATOR ONLY' >>     <<LJC>>01006000
     NEWSECMATRIX(1):=%000000;<< security                 >>     <<LJC>>01008000
     T:=1;  << NEWSECUREFLAG >>                                  <<LJC>>01010000
     SAVEDB:=EXCHANGEDB(0); << Save prev DB if split-stack >>    <<LJC>>01012000
     FALTSEC(FILENUM,T,NEWSECMATRIX,,,ERRN);                     <<LJC>>01014000
     IF < THEN                                                   <<LJC>>01016000
          BEGIN                                                  <<LJC>>01018000
          FCHECK(FILENUM,T);                                     <<LJC>>01020000
          GENMSG(1,450,%010000,T,-2); << Big FALTSEC err >>      <<LJC>>01022000
          END;                                                   <<LJC>>01024000
     EXCHANGEDB(SAVEDB);  << Restore DB >>                       <<LJC>>01026000
     FCLOSE(FILENUM,0,0); << Close file >>                       <<LJC>>01028000
      IF < THEN  <<ERROR?>>                                             01030000
         BEGIN                                                          01032000
         FCHECK(FILENUM,ERRN);                                          01034000
         ERROR(ERRN);                                                   01036000
         GO LP7                                                         01038000
         END;                                                           01040000
      OK;                                                               01042000
      IF FLAGS THEN AWAKE(ABSOLUTE(PROGENPINX),2,%4000);  <<SHUTDOWN>>  01044000
      LFN := LFNUMBER(TRUE);  <<INCREMENT FILE NUMBER>>                 01046000
      DISABLE;                                                          01048000
      ABSOLUTE(FLAGX).(14:1) := 0;  <<RESET FILE CHANGE FLAG>>          01050000
      ENABLE;                                                           01052000
      LOGFOPEN;                                                         01054000
      FLAGS.(14:1) := 0;                                       <<01905>>01056000
      GOTO LP4                                                          01058000
END.         << System Logging >>                              <<01700>>01060000
