<< LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION>>               00005000
$CONTROL MAP,CODE,USLINIT                                               00010000
<<LOG - MODULE 12>>                                                     00015000
<< HP32002C MPE SOURCE C.00.00 >>                                       00020000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00025000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00030000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00035000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00040000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00045000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00050000
$ TITLE "   HP-3000 SYSTEM LOGGING PROCESS "                   <<01700>>00055000
$ THIRTY                                                                00060000
$ CONTROL PRIVILEGED,UNCALLABLE,MAIN=LOG,SEGMENT=LOG                    00065000
BEGIN                                                                   00070000
                                                                        00075000
<<----------------------------------------------------------------------00080000
*                                                                      *00085000
*                     3000/30 LOGGING PROCESS                          *00090000
*                                                                      *00095000
---------------------------------------------------------------------->>00100000
                                                                        00105000
                                                               <<01549>>00110000
INTEGER S0 = S-0;                                                       00115000
                                                               <<01549>>00120000
INTEGER S2 = S-2;                                                       00125000
INTEGER S3 = S-3;                                                       00130000
LOGICAL LS0 = S-0;                                                      00135000
LOGICAL LS1 = S-1;                                                      00140000
LOGICAL LS2 = S-2;                                                      00145000
LOGICAL LS3 = S-3;                                                      00150000
INTEGER X = X;                                                          00155000
                                                                        00160000
DEFINE ENABLE = ASSEMBLE(SED 1)#;                                       00165000
DEFINE DISABLE = ASSEMBLE(SED 0)#;                                      00170000
DEFINE STATE = (0:2)#;                                         <<06831>>00175000
                                                                        00180000
<<----------------------------------------------------------------------00185000
*                                                                      *00190000
*  SYSGLOB DEFINITIONS                                                 *00195000
*                                                                      *00200000
---------------------------------------------------------------------->>00205000
                                                                        00210000
EQUATE                                                                  00215000
LOGWORD     = 21,          <<word of LOG # in cold load ext.>> <<06832>>00220000
WRITEFUNC   = 1,           <<used w/ PROCESS'COLD'LOAD'INFO>>  <<06832>>00225000
SYSDB       = 512,         <<SYSTEM DB OFFSET>>                         00230000
SYSUP       = SYSDB+%73,   <<SYSTEM UP FLAG>>                           00235000
PROGENPINX  = SYSDB+%141,  <<PROGEN PCB INDEX>>                         00240000
LOGINFO     = SYSDB+%167,  <<LOGGING AREA>>                             00245000
BUF0X       = SYSDB+%172,  <<BUFFER 0 DST NR.>>                         00250000
BUFSIZEX    = SYSDB+%174,  <<BUFFER SIZE (SECTORS)>>                    00255000
                                                               <<01549>>00260000
FLAGX       = SYSDB+%176,  <<FLAG WORD>>                                00265000
LOGREC0X    = SYSDB+%177,  <<BUFFER 0 RECORDS WRITTEN>>                 00270000
FILESIZE0X  = SYSDB+%203,  <<FILE SIZE (BLOCKS) - 1ST HALF>>            00275000
FNX         = SYSDB+%205,  <<FILE NUMBER>>                              00280000
BLOCKS0X    = SYSDB+%206,  <<BLOCKS WRITTEN - 1ST HALF>>                00285000
BLOCKS1X    = SYSDB+%207,  <<BLOCKS WRITTEN - 2ND HALF>>                00290000
LOST0X      = SYSDB+%210,  <<TOTAL RECORDS LOST - 1ST HALF>>            00295000
STOPBITS    = SYSDB+%300;  <<SHUTDOWN STOP BITS>>                       00300000
                                                                        00305000
<<----------------------------------------------------------------------00310000
*                                                                      *00315000
*  LOGGING DEFINITIONS AND VARIABLES                                   *00320000
*                                                                      *00325000
---------------------------------------------------------------------->>00330000
                                                                        00335000
EQUATE LOGLIM=9999,FOPT=%2100,AOPT=%504,                       <<01549>>00340000
   EMPTY=0,CURRENT=1,FULL=2;                                            00345000
                                                                        00350000
INTEGER SAVEDB; << For saving DB ... obviously  >>               <<LJC>>00355000
INTEGER T;  <<UTILITY INTEGER>>                                         00360000
INTEGER ARRAY BUF (0:127);  <<UTILITY BUFFER>>                          00365000
INTEGER ARRAY LBUF(*)=DB+0;  <<LOG BUFFER PTR>>                <<01549>>00370000
LOGICAL DUMMY;                                                 <<01549>>00375000
LOGICAL INIT;  <<INITIALIZATION PHASE FLAG>>                            00380000
BYTE ARRAY LOGFNAME (0:8) := "LOG     ";  <<LOG FILE NAME>>             00385000
BYTE ARRAY LOGNUMBER (*) = LOGFNAME(3);                                 00390000
BYTE ARRAY TEMP (0:4);                                                  00395000
INTEGER LFN;  <<LOG FILE NUMBER>>                                       00400000
BYTE ARRAY BA34 (0:4) := "3/4",0;                                       00405000
BYTE ARRAY BA12 (0:4) := "1/2",0;                                       00410000
LOGICAL ARRAY NEWSECMATRIX(0:1); <<  New security matrix  >>     <<LJC>>00415000
ARRAY NULL (0:1) := 0;                                                  00420000
LOGICAL FNEW,FLAGS,FOPTN,F12,F34;                              <<01549>>00425000
INTEGER                                                        <<06832>>00430000
        LOGFILENUMBER,   << from SYSGLOB cell >>               <<06832>>00435000
        ERRN,                                                  <<06832>>00440000
        RETURNCODE;                                            <<06832>>00445000
LOGICAL                                                        <<06832>>00450000
        LOGNUM;                                                <<06832>>00455000
LOGICAL FER;                                                            00460000
INTEGER FILENUM,BUFSIZE,FILESIZE1,FILESIZE2,BUFDST,BX;                  00465000
DOUBLE FILESIZE = FILESIZE1;                                            00470000
DOUBLE WBLOCKCT;                                               <<01700>>00475000
                                                                        00480000
<<----------------------------------------------------------------------00485000
*                                                                      *00490000
*  EXTERNAL PROCEDURE DECLARATIONS                                     *00495000
*                                                                      *00500000
---------------------------------------------------------------------->>00505000
                                                                        00510000
INTRINSIC FOPEN,ASCII,FWRITE,FCONTROL,FCHECK,FCLOSE;           <<01700>>00515000
                                                                        00520000
DOUBLE PROCEDURE ATTACHIO (LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS);  00525000
   VALUE LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                     00530000
   INTEGER LDEV,QMISC,DSTX,ADDR,FUNC,CNT,P1,P2,FLAGS;                   00535000
   OPTION EXTERNAL;                                                     00540000
PROCEDURE AWAKE (P,A,W);                                                00545000
   VALUE P,A,W;                                                         00550000
   INTEGER P,A,W;                                                       00555000
   OPTION EXTERNAL;                                                     00560000
INTEGER PROCEDURE EXCHANGEDB (A);                                       00565000
   VALUE A;                                                             00570000
   INTEGER A;                                                           00575000
   OPTION EXTERNAL;                                                     00580000
PROCEDURE LOG;                                                          00585000
   OPTION EXTERNAL;                                                     00590000
INTEGER PROCEDURE GENMSG(SETNO,MSGNO,MASK,A,B,C,D,E,           <<0U.EB>>00595000
      DEST,REPLY,BUFF,DST,IOTYPE);                             <<0U.EB>>00600000
   VALUE SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,           <<0U.EB>>00605000
      DST,IOTYPE;                                              <<0U.EB>>00610000
   LOGICAL SETNO,MSGNO,MASK,A,B,C,D,E,DEST,REPLY,BUFF,         <<0U.EB>>00615000
      DST,IOTYPE;                                              <<0U.EB>>00620000
   OPTION VARIABLE,EXTERNAL;                                   <<0U.EB>>00625000
                                                               <<0U.EB>>00630000
PROCEDURE SUDDENDEATH (N);                                              00635000
   VALUE N;                                                             00640000
   INTEGER N;                                                           00645000
   OPTION EXTERNAL;                                                     00650000
INTEGER PROCEDURE PROCESS'COLD'LOAD'INFO(FUNC,WORD,            <<06832>>00655000
                  PARM1,PARM2,PARM3);                          <<06832>>00660000
   VALUE FUNC,WORD;                                            <<06832>>00665000
   INTEGER FUNC,WORD;                                          <<06832>>00670000
   LOGICAL PARM1,PARM2,PARM3;                                  <<06832>>00675000
   OPTION VARIABLE,EXTERNAL;                                   <<06832>>00680000
PROCEDURE WAIT (W,D);                                                   00685000
   VALUE W,D;                                                           00690000
   INTEGER W,D;                                                         00695000
   OPTION EXTERNAL;                                                     00700000
PROCEDURE FALTSEC(FILENUM,NEWSECUREFLAG,NEWMATRIX,OLDFLAG,       <<LJC>>00705000
                  OLDMATRIX,EXCOND);                             <<LJC>>00710000
          VALUE FILENUM;                                         <<LJC>>00715000
          LOGICAL FILENUM,NEWSECUREFLAG,OLDFLAG,EXCOND;          <<LJC>>00720000
          ARRAY NEWMATRIX,OLDMATRIX;                             <<LJC>>00725000
          OPTION VARIABLE,EXTERNAL;                              <<LJC>>00730000
$ PAGE "  HP-3000 SYSTEM LOGGING PROCESS "                     <<01700>>00735000
                                                                        00740000
<<------------------------------------------------------------------->> 00745000
                                                                        00750000
SUBROUTINE OK;                                                          00755000
   BEGIN                                                                00760000
   IF FER THEN  <<ERROR?>>                                              00765000
      BEGIN                                                             00770000
      DISABLE;                                                          00775000
      ABSOLUTE(LOGINFO).(15:1) := 1;  <<TURN ON LOGGING>>               00780000
      ABSOLUTE(FLAGX).(11:1) := 0;  <<TURN OFF SUSPENDED>>              00785000
      ENABLE;                                                           00790000
      GENMSG(1,205,%10000,LFN);                                <<0U.EB>>00795000
      <<EMIT LOG ERROR RECORD>>                                         00800000
      TOS := ABSOLUTE(LOST0X);  <<TOTAL RECORDS LOST - 1ST HALF>>       00805000
      TOS := ABSOLUTE(X := X+1);  <<TOTAL RECORDS LOST - 2ND HALF>>     00810000
      TOS := ABSOLUTE(X := X+1);  <<RECORDS LOST - JOB INITIATION>>     00815000
      TOS := ABSOLUTE(X := X+1);  <<RECORDS LOST - JOB TERMINATION>>    00820000
      TOS := 0;  <<RECORD TYPE>>                                        00825000
      LOG;  <<EMIT LOG RECORD>>                                         00830000
      ASSEMBLE(ZERO);                                                   00835000
      ABSOLUTE(X) := TOS;                                               00840000
      ASSEMBLE(ZERO,DECX);                                              00845000
      ABSOLUTE(X) := TOS;                                               00850000
      ASSEMBLE(ZERO,DECX);                                              00855000
      ABSOLUTE(X) := TOS;                                               00860000
      ASSEMBLE(ZERO,DECX);                                              00865000
      ABSOLUTE(X) := TOS                                                00870000
      END                                                               00875000
   END;     <<  O K  >>                                                 00880000
                                                                        00885000
<<------------------------------------------------------------------->> 00890000
                                                                        00895000
SUBROUTINE ERROR (ERRN);                                                00900000
   <<CHECKS THE RECOVERABILITY OF THE SPECIFIED ERROR.                  00905000
                                                                        00910000
     INPUT VARIABLES:                                                   00915000
         ERRN - ERROR NUMBER                                            00920000
                                                                        00925000
     RETURNS TO THE CALLER ONLY IF THE ERROR IS RECOVERABLE>>           00930000
   VALUE ERRN;                                                          00935000
   INTEGER ERRN;                                                        00940000
   BEGIN                                                                00945000
   IF ERRN = 46 OR (61 <= ERRN <= 62) OR ERRN=100 THEN         <<01905>>00950000
      BEGIN     << RECOVERY IS POSSIBLE >>                     <<01905>>00955000
      GENMSG(1,204,%11000,LFN,ERRN);                           <<0U.EB>>00960000
      DISABLE;                                                          00965000
      ABSOLUTE(LOGINFO).(15:1) := 0;  <<TURN OFF LOGGING>>              00970000
      ABSOLUTE(FLAGX).(11:1) := 1;  <<SUSPENDED>>                       00975000
      FER := TRUE;  <<SET ERROR FLAG>>                                  00980000
      IF ABSOLUTE(SYSUP) THEN                                           00985000
         WAIT(%20,0)                                                    00990000
      ELSE                                                              00995000
         AWAKE(ABSOLUTE(PROGENPINX),2,%20);  <<AWAKEN PROGEN>>          01000000
      <<RESTARTS ON RESUMELOG ACTION>>                                  01005000
      ENABLE                                                            01010000
      END                                                               01015000
   ELSE  <<NOT RECOVERABLE>>                                            01020000
      BEGIN                                                             01025000
      GENMSG(1,203,%11000,LFN,ERRN);                           <<0U.EB>>01030000
      DISABLE;                                                          01035000
      ABSOLUTE(LOGINFO).(15:1) := 0;  <<TURN OFF LOGGING>>              01040000
      ABSOLUTE(FLAGX).(12:1) := 1;  <<STOPPED>>                         01045000
B:    IF ABSOLUTE(SYSUP) THEN                                           01050000
         WAIT(%4000,0)                                                  01055000
      ELSE                                                              01060000
         AWAKE(ABSOLUTE(PROGENPINX),2,%4000);  <<AWAKEN PROGEN>>        01065000
      GOTO B                                                            01070000
      END                                                               01075000
   END;     <<  E R R O R  >>                                           01080000
                                                                        01085000
<<------------------------------------------------------------------->> 01090000
                                                                        01095000
INTEGER SUBROUTINE LFNUMBER (DUF);                                      01100000
<< Gets the Log file number from SYSDB and checks its validity.         01105000
If DUF = TRUE, increments the Log file number and updates both          01110000
SYSDB and the system disc (sector 18, word 11).                         01115000
                                                                        01120000
     INPUT VARIABLES:                                                   01125000
         DUF - NEW FILE NUMBER FLAG                                     01130000
                                                                        01135000
     OUTPUT VARIABLES:                                                  01140000
         LFNUMBER - LOG FILE NUMBER                                     01145000
                                                                        01150000
   >>                                                                   01155000
   VALUE DUF;                                                           01160000
   LOGICAL DUF;                                                         01165000
   BEGIN                                                                01170000
   LOGFILENUMBER := ABSOLUTE(FNX); << file # from SYSGLOB>>    <<06832>>01175000
   IF DUF THEN LOGFILENUMBER := LOGFILENUMBER + 1;             <<06832>>01180000
   IF LOGFILENUMBER > LOGLIM THEN LOGFILENUMBER := 0;          <<06832>>01185000
                                                               <<06832>>01190000
   ABSOLUTE(FNX) := LOGFILENUMBER; << update SYSGLOB>>         <<06832>>01195000
   LFNUMBER:= LOGFILENUMBER;  <<file number to be returned >>  <<06832>>01200000
   IF DUF THEN  <<UPDATE SYSTEM DISC?>>                                 01205000
      BEGIN                                                             01210000
      LOGNUM := LOGFILENUMBER;   << new log file number >>     <<06832>>01215000
      RETURNCODE := PROCESS'COLD'LOAD'INFO(WRITEFUNC,LOGWORD,  <<06832>>01220000
                                       LOGNUM); <<WRITE>>      <<06832>>01225000
      IF RETURNCODE <> 0 THEN ERROR(1);  <<something happened w<<06832>>01230000
         <<when trying to update the logfile number on disc>>  <<06832>>01235000
      END                                                               01240000
   END;  << L F N U M B E R >>                                          01245000
                                                                        01250000
<<------------------------------------------------------------------->> 01255000
                                                                        01260000
LOGICAL SUBROUTINE LOGOUTPUT;                                           01265000
                                                                        01270000
COMMENT                                                        <<01905>>01275000
<< Outputs one physical block to the Log file, returning                01280000
TRUE if the file is full.  Updates the number of blocks                 01285000
written to the file, and outputs console messages if the                01290000
file becomes 1/2 full or 3/4 full.                                      01295000
                                                                        01300000
In previous versions of the operating system, the log file     <<01905>>01305000
extents were pre-allocated.  Therefore, LOGOUTPUT would        <<01905>>01310000
never fail because of a lack of space.  On these systems, a    <<01905>>01315000
return value of TRUE meant that the block just output          <<01905>>01320000
filled the file.  Starting with this system, extents are       <<01905>>01325000
not pre-allocated.  However, a manual check of WBLOCKCT        <<01905>>01330000
against FILESIZE is made to determine if the file was          <<01905>>01335000
filled by the last FWRITE.  If so, LOGOUTPUT returns TRUE      <<01905>>01340000
to indicate that a new logfile should be opened.               <<01905>>01345000
                                                               <<01905>>01350000
During a SWITCHLOG or a SHUTDOWN, it is possible for a         <<01905>>01355000
buffer to be marked full even though no records have been      <<01905>>01360000
logged into the buffer.  (The "CURRENT" buffer is marked       <<01905>>01365000
full regardless of its current state.)  To prevent a           <<01905>>01370000
duplicate block from being written into the log file,          <<01905>>01375000
LOGOUTPUT marks the buffer as EMPTY and returns.               <<01905>>01380000
                                                               <<01905>>01385000
     OUTPUT VARIABLES:                                                  01390000
         LOGOUTPUT - FILE CAPACITY STATUS                               01395000
            FALSE - FILL IS NOT FULL                                    01400000
            TRUE - FILE IS FULL                                         01405000
                                                                        01410000
   >>                                                                   01415000
;  << end of header comment >>                                 <<01905>>01420000
   BEGIN                                                                01425000
   LOGOUTPUT := FALSE;                                                  01430000
                                                               <<01905>>01435000
   DISABLE;                                                    <<01905>>01440000
   IF ABSOLUTE(LOGREC0X+BX) = 0 THEN                           <<01905>>01445000
      BEGIN                                                    <<01905>>01450000
      ABSOLUTE(BUF0X+BX).STATE := EMPTY;                       <<06831>>01455000
      ENABLE;                                                  <<01905>>01460000
      RETURN;  << NO SENSE GOING ON. >>                        <<01905>>01465000
      END;                                                     <<01905>>01470000
   ENABLE;                                                     <<01905>>01475000
                                                               <<01905>>01480000
   FER := FALSE;                                               <<01905>>01485000
                                                               <<01905>>01490000
LP8: TOS := FILENUM;                                           <<01905>>01495000
     TOS := @LBUF;                                             <<01905>>01500000
   TOS := BUFSIZE&LSL(7);  TOS := 0;  << FWRITE PARMS >>       <<01549>>01505000
   EXCHANGEDB(BUFDST);                                         <<01549>>01510000
   FWRITE(*,*,*,*);                                            <<01549>>01515000
                                                               <<01905>>01520000
   << BRING DB BACK TO STACK, BUT SAVE CURRENT CC. >>          <<01905>>01525000
   PUSH(STATUS);                                               <<01905>>01530000
   EXCHANGEDB(0);                                              <<01905>>01535000
   SET(STATUS);                                                <<01905>>01540000
                                                               <<01905>>01545000
   IF > THEN  << EOF, SHOULDN'T HAPPEN. >>                     <<01905>>01550000
      ERROR(2)                                                 <<01905>>01555000
   ELSE IF < THEN << MAYBE A RECOVERABLE ERROR. >>             <<01905>>01560000
      BEGIN                                                    <<01905>>01565000
      FCHECK(FILENUM,ERRN);                                    <<01905>>01570000
      ERROR(ERRN);                                             <<01905>>01575000
      GO LP8;                                                  <<01905>>01580000
      END;                                                     <<01905>>01585000
   OK;                                                         <<01905>>01590000
                                                               <<01905>>01595000
   DISABLE;                                                             01600000
   ABSOLUTE(BUF0X+BX).STATE := EMPTY;  <<MAKE IT EMPTY>>       <<06831>>01605000
   ABSOLUTE(LOGREC0X+BX) := 0;  << reset buffer record count >><<01700>>01610000
   ENABLE;                                                     <<01700>>01615000
   FCONTROL(FILENUM,6,DUMMY);   << post EOF in label >>        <<01700>>01620000
   IF < THEN ERROR(2);                                         <<01905>>01625000
   TOS := WBLOCKCT;                                                     01630000
   TOS := 1D;                                                           01635000
   ASSEMBLE(DADD,DDUP);                                        <<01905>>01640000
   WBLOCKCT := TOS;       << Update # of blocks written >>     <<01700>>01645000
   ABSOLUTE(BLOCKS1X) := TOS;   << update SYSGLOB block cnt >> <<01700>>01650000
   ABSOLUTE(X := X-1) := TOS;                                           01655000
                                                               <<01905>>01660000
   << THE NUMBER OF BLOCKS RECORDED IN 'BLOCKCT' AND >>        <<01905>>01665000
   << 'FILESIZE' INCLUDES THE FILE LABEL BLOCK.      >>        <<01905>>01670000
                                                               <<01905>>01675000
   IF WBLOCKCT = FILESIZE THEN  << FILE FULL? >>               <<01905>>01680000
      BEGIN                                                    <<01905>>01685000
      GENMSG(1,202,%10000,LFN,@NULL&LSL(1));                   <<01905>>01690000
      LOGOUTPUT := TRUE;                                       <<01905>>01695000
      RETURN;                                                  <<01905>>01700000
      END;                                                     <<01905>>01705000
                                                               <<01905>>01710000
   TOS := WBLOCKCT - 1D;  << SUBTRACT OFF FILE LABEL. >>       <<01905>>01715000
   ASSEMBLE(DDUP);                                             <<01905>>01720000
   IF F34 THEN                                                          01725000
      ASSEMBLE(DDEL,DDEL)                                               01730000
   ELSE                                                                 01735000
      BEGIN                                                             01740000
      TOS := FILESIZE - 1D;  << SUBTRACT OFF FILE LABEL. >>    <<01905>>01745000
      ASSEMBLE(DDUP;DLSR 2;DSUB;DCMP);                         <<01905>>01750000
      IF >= THEN  <<FILE IS 3/4 FULL?>>                                 01755000
         BEGIN                                                          01760000
         GENMSG(1,202,%10000,LFN,@BA34);                       <<0U.EB>>01765000
         F34 := TRUE;                                                   01770000
         DDEL                                                           01775000
         END                                                            01780000
      ELSE                                                              01785000
         BEGIN                                                          01790000
         IF F12 THEN                                                    01795000
            DDEL                                                        01800000
         ELSE                                                           01805000
            BEGIN                                                       01810000
            TOS := FILESIZE; << THIS WORKS FOR 50% CHECK. >>   <<01905>>01815000
            ASSEMBLE(DLSR 1; DCMP);                                     01820000
            IF >= THEN  <<FILE IS 1/2 FULL?>>                           01825000
               BEGIN                                                    01830000
               GENMSG(1,202,%10000,LFN,@BA12);                 <<0U.EB>>01835000
               F12 := TRUE                                              01840000
               END                                                      01845000
            END                                                         01850000
         END                                                            01855000
      END                                                               01860000
   END;  << L O G O U T P U T >>                                        01865000
                                                                        01870000
<<------------------------------------------------------------------->> 01875000
                                                                        01880000
SUBROUTINE LOGFOPEN;                                                    01885000
<< Opens a new Log file, and initializes global variables. >>  <<01700>>01890000
                                                               <<01700>>01895000
      BEGIN                                                             01900000
      FNEW := TRUE;                                            <<01700>>01905000
      LOGNUMBER := "0";                                        <<01700>>01910000
      MOVE LOGNUMBER(1) := LOGNUMBER,(3);  << zero file nr.>>  <<01700>>01915000
      T := ASCII(LFN,10,TEMP);                                          01920000
      MOVE LOGNUMBER(3) := TEMP(T-1),(-T);                              01925000
      <<OPEN FILE NEW>>                                                 01930000
      BUFSIZE := ABSOLUTE(BUFSIZEX);  <<BUFFER SIZE>>                   01935000
      FILESIZE1 := ABSOLUTE(FILESIZE0X);  <<FILE SIZE - 1ST HALF>>      01940000
      FILESIZE2 := ABSOLUTE(X := X+1);  <<FILE SIZE - 2ND HALF>>        01945000
ST:   FOPTN := FOPT LOR (NOT (FNEW) LAND 1);                            01950000
      FER := FALSE;                                                     01955000
AG:   FILENUM :=                                                        01960000
      FOPEN(LOGFNAME,FOPTN,AOPT,                               <<01700>>01965000
         BUFSIZE&LSL(7)-2,,,,,,FILESIZE-1D,16,1);              <<01700>>01970000
      IF <> THEN  <<ERROR?>>                                            01975000
         BEGIN                                                          01980000
         FCHECK(0,ERRN);                                                01985000
         ERROR(ERRN);                                                   01990000
         GO AG                                                          01995000
         END;                                                           02000000
      OK;                                                               02005000
      IF FNEW THEN                                             <<01700>>02010000
         BEGIN    << FCLOSE Permanent: make directory entry. >><<01700>>02015000
         FER := FALSE;                                                  02020000
AG1:     FCLOSE(FILENUM,1,0);  << Close with Save disposition>><<01700>>02025000
         IF < THEN  <<ERROR?>>                                          02030000
            BEGIN                                                       02035000
            FCHECK(FILENUM,ERRN);                                       02040000
            ERROR(ERRN);                                                02045000
            GO AG1                                                      02050000
            END;                                                        02055000
         OK;                                                            02060000
         GENMSG(1,201,%10000,LFN);      <<LOG FILE NR.@CONS>>  <<0U.EB>>02065000
         FNEW := FALSE;                                        <<01700>>02070000
         GOTO ST;  << Re-open the file, this time as Old. >>   <<01700>>02075000
         END;                                                           02080000
      FNEW := TRUE;                                                     02085000
      WBLOCKCT := 1D;                                                   02090000
      <<RESET WBLOCKCT IN GLOBAL AREA>>                                 02095000
      ABSOLUTE(BLOCKS0X) := 0;                                          02100000
      ABSOLUTE(X := X+1) := 1;                                          02105000
      F12 := FALSE;                                                     02110000
      F34 := FALSE;                                                     02115000
      END;  << L O G F O P E N >>                                       02120000
                                                                        02125000
<<------------------------------------------------------------------->> 02130000
                                                                        02135000
INTEGER SUBROUTINE OTHERBUF;                                            02140000
   <<COMPLEMENTS BX, UPDATES BUFDST ACCORDINGLY AND RETURNS THE         02145000
     BUFFER STATE FROM SYSDB.                                           02150000
                                                                        02155000
     OUTPUT VARIABLES:                                                  02160000
         OTHERBUF - BUFFER STATE                                        02165000
                                                                        02170000
   >>                                                                   02175000
   BEGIN                                                                02180000
   BX := (BX+1).(15:1);  <<COMPLEMENT BX>>                              02185000
   TOS := ABSOLUTE(BUF0X+BX);                                           02190000
   ASSEMBLE(DUP);                                                       02195000
   BUFDST := TOS LAND %37777;                                  <<06831>>02200000
   S2 := TOS.STATE;                                            <<06831>>02205000
   END;  << O T H E R B U F >>                                          02210000
                                                                        02215000
<<------------------------------------------------------------------->> 02220000
                                                                        02225000
<<  Main procedure begins here  >>                             <<01700>>02230000
                                                                        02235000
      INIT := TRUE;  <<SET INITIALIZATION FLAG>>                        02240000
      LFN := LFNUMBER(FALSE);  <<GET LOG FILE NUMBER>>                  02245000
      LOGFOPEN;  <<OPEN LOG FILE>>                                      02250000
      IF INIT THEN  <<INITIALIZATION PHASE?>>                           02255000
         BEGIN                                                          02260000
         IF ABSOLUTE(SYSUP) THEN  <<PROGEN NOT WAITING>>                02265000
            WAIT(%20,0)                                                 02270000
         ELSE                                                           02275000
            BEGIN                                              <<03781>>02280000
            AWAKE(ABSOLUTE(PROGENPINX),2,0);                   <<03781>>02285000
            BX := ABSOLUTE(FLAGX).(15:1); << current >>        <<03781>>02290000
            IF ABSOLUTE(BUF0X + BX).STATE = FULL AND           <<06831>>02295000
               ABSOLUTE(LOGINFO) THEN                          <<03781>>02300000
               << will have to go to work >>                   <<03781>>02305000
            ELSE                                               <<03781>>02310000
               << wait a while >>                              <<03781>>02315000
               WAIT(%20,0);                                    <<03781>>02320000
            END;                                               <<03781>>02325000
         INIT := FALSE  <<CLEAR INITIALIZATION FLAG>>                   02330000
         END;                                                           02335000
                                                                        02340000
      <<COMMAND LOOP>>                                                  02345000
                                                                        02350000
LP1:  DISABLE;                                                          02355000
      TOS := ABSOLUTE(FLAGX);                                           02360000
      FLAGS := S0;  <<SAVE COPY OF FLAGS>>                              02365000
      FLAGS.(15:1) := ABSOLUTE(STOPBITS).(1:1);  <<SHUTDOWN>>           02370000
      BX := TOS.(13:1);  <<CURRENT BUFFER>>                             02375000
      IF OTHERBUF = FULL THEN  <<OTHER BUFFER FULL?>>                   02380000
         BEGIN                                                          02385000
LP3:     ENABLE;                                                        02390000
         IF LOGOUTPUT THEN GOTO LP2;  << FILE FULL. >>         <<01905>>02395000
LP4:     DISABLE;                                              <<01905>>02400000
         IF OTHERBUF = FULL THEN GOTO LP3;                              02405000
         IF OTHERBUF = FULL THEN GOTO LP3;                              02410000
         FLAGS.(15:1) := ABSOLUTE(STOPBITS).(1:1);<<SHUTDOWN>> <<01905>>02415000
         IF FLAGS.(14:2) <> 0 THEN GOTO LP6;                            02420000
         WAIT(%20,0);                                                   02425000
                                                                        02430000
         <<SLEEP UNTIL NEXT AWAKENING>>                                 02435000
                                                                        02440000
         GOTO LP1                                                       02445000
         END;                                                           02450000
      << THE NON CURRENT IS NOT FULL>>                                  02455000
      IF FLAGS.(14:2) = 0 THEN SUDDENDEATH(30);                         02460000
LP6:  OTHERBUF;  <<LP6: SWITCH TO "CURRENT" BUFFER (NOT FULL)>>         02465000
      ABSOLUTE(BUF0X+BX).STATE := FULL;  <<MARK BUFFER FULL>>  <<06831>>02470000
      BX := (BX+1).(15:1);  <<COMPLEMENT BX>>                           02475000
      IF ABSOLUTE(BUF0X+BX).STATE = EMPTY THEN                 <<06831>>02480000
         BEGIN                                                          02485000
         ABSOLUTE(X).STATE := CURRENT;                         <<06831>>02490000
         ABSOLUTE(FLAGX).(13:1) := BX;                                  02495000
         ABSOLUTE(X := X-1) := 0  <<ZERO FREE POINTER>>                 02500000
         END                                                            02505000
      ELSE  <<OTHER BUFFER NON-EMPTY?>>                                 02510000
         SUDDENDEATH(31);                                               02515000
      BX := (BX+1).(15:1);  <<RESET BX>>                                02520000
      ENABLE;                                                           02525000
      LOGOUTPUT;                                                        02530000
LP2:  FER := FALSE;                                            <<01905>>02535000
  << Set the log file's security to be accessed by the >>        <<LJC>>02540000
  << creator only                                      >>        <<LJC>>02545000
LP7: NEWSECMATRIX(0):=%040000;<< Give file 'CREATOR ONLY' >>     <<LJC>>02550000
     NEWSECMATRIX(1):=%000000;<< security                 >>     <<LJC>>02555000
     T:=1;  << NEWSECUREFLAG >>                                  <<LJC>>02560000
     SAVEDB:=EXCHANGEDB(0); << Save prev DB if split-stack >>    <<LJC>>02565000
     FALTSEC(FILENUM,T,NEWSECMATRIX,,,ERRN);                     <<LJC>>02570000
     IF < THEN                                                   <<LJC>>02575000
          BEGIN                                                  <<LJC>>02580000
          FCHECK(FILENUM,T);                                     <<LJC>>02585000
          GENMSG(1,450,%010000,T,-2); << Big FALTSEC err >>      <<LJC>>02590000
          END;                                                   <<LJC>>02595000
     EXCHANGEDB(SAVEDB);  << Restore DB >>                       <<LJC>>02600000
     FCLOSE(FILENUM,0,0); << Close file >>                       <<LJC>>02605000
      IF < THEN  <<ERROR?>>                                             02610000
         BEGIN                                                          02615000
         FCHECK(FILENUM,ERRN);                                          02620000
         ERROR(ERRN);                                                   02625000
         GO LP7                                                         02630000
         END;                                                           02635000
      OK;                                                               02640000
      IF FLAGS THEN AWAKE(ABSOLUTE(PROGENPINX),2,%4000);  <<SHUTDOWN>>  02645000
      LFN := LFNUMBER(TRUE);  <<INCREMENT FILE NUMBER>>                 02650000
      DISABLE;                                                          02655000
      ABSOLUTE(FLAGX).(14:1) := 0;  <<RESET FILE CHANGE FLAG>>          02660000
      ENABLE;                                                           02665000
      LOGFOPEN;                                                         02670000
      FLAGS.(14:1) := 0;                                       <<01905>>02675000
      GOTO LP4                                                          02680000
END.         << System Logging >>                              <<01700>>02685000
