$CONTROL MAP,CODE,USLINIT                                               00010000
<<MEMLOGAN>>                                                            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=MEMLOGAN,SEGMENT=MEMLOGAN                                 00028000
$CONTROL PRIVILEGED,NOWARN                                              00030000
$TITLE "- ERROR CORRECTING MEMORY LOG ANALYZER"                         00032000
$THIRTY                                                                 00034000
BEGIN                                                                   00036000
                                                                        00038000
<<------------------------------------------------------------          00040000
*                                                            *          00042000
*           ERROR CORRECTING MEMORY LOG ANALYZER             *          00044000
*                                                            *          00046000
------------------------------------------------------------>>          00048000
                                                                        00050000
DEFINE                                                         <<01.01>>00052000
PTITLE = ("MEMLOGAN B01.03 (C) HEWLETT-PACKARD CO., 1980")#;   <<03020>>00054000
INTEGER S0 = S-0;                                                       00056000
                                                                        00058000
INTEGER PARM = Q-4;  <<RUN PARM PARAMETER>>                             00060000
INTEGER LOGFNUM,OUTFNUM;                                                00062000
INTEGER I,REC,CHIP,BANKS,FAULT,ERRCNT,CHECKBIT,                         00064000
        DELAY:=0,LINECNT:=0,ERRORCOUNT:=0;                     <<00.05>>00066000
INTEGER BIT,ROW,OLDROW,BANK,OLDBANK,BOARD,OLDBOARD,OLDCONTROLLER;<<2MB>>00068000
INTEGER                                                        <<03020>>00070000
  OLD'WORD = OLDROW;                                           <<03020>>00072000
                                                               <<03020>>00074000
INTEGER                                                        <<03020>>00076000
  WORD     = ROW;                                              <<03020>>00078000
                                                                        00080000
LOGICAL HEADING:=TRUE,PRINTIMES:=TRUE;                         <<00.01>>00082000
                                                                        00084000
DOUBLE STIME,UTIME,ERRTIME1,ERRTIME2;                          <<01.01>>00086000
                                                                        00088000
INTEGER CPU'TYPE;                                              <<RK2MB>>00090000
                                                               <<RK2MB>>00092000
INTEGER ARRAY NEXT'CONTROLLER(1:5) := 2, 8, 8, 16, %77777;     <<03020>>00094000
                                                               <<RK2MB>>00096000
DEFINE                                                         <<RK2MB>>00098000
     BANKNUM      = ABSOLUTE (MEMBANKNUM)#,                    <<03020>>00100000
     PRONTO       = (CPU'TYPE = 4)#,                           <<01397>>00102000
     PRONTO'2NDCNTLR = LOGICAL(MCS'STATUS.(15:1))#,            <<01397>>00104000
     RAMS'ARE'16K = (CPU'TYPE > 1)#,                           <<RK2MB>>00106000
     TP'FLAG      = (CPU'TYPE = 2)#,                           <<RK2MB>>00108000
     TWO'MB'FLAG  = (CPU'TYPE = 3)#;                           <<RK2MB>>00110000
EQUATE RECSIZE  =  4112;  <<MEMLOG REC SIZE: 2048 WORDS LOG  >><<01397>>00112000
ARRAY LOGREC(0:RECSIZE-1);                                              00114000
DOUBLE ARRAY LOGRECD(*) = LOGREC;                                       00116000
                                                                        00118000
                                                               <<01169>>00120000
DOUBLE CAPD;            << CAPABILITIES FROM WHO INTRINSIC >>  <<01169>>00122000
LOGICAL CAP=CAPD;                                              <<01169>>00124000
INTEGER MCS'STATUS;    << MEM STATUS RETURNED BY MCS >>        <<01397>>00126000
DEFINE SYSMGR = CAP.(0:1)#;                                    <<01169>>00128000
DEFINE                                                         <<01169>>00130000
SYSMGR'MSG = (" * PROGRAM REQUIRES SYS. MGR. CAPABILITY *")#;  <<01169>>00132000
                                                               <<01169>>00134000
BYTE ARRAY PBUF(0:71);                                                  00136000
BYTE ARRAY FNAME(*) = PBUF;                                             00138000
BYTE ARRAY ERRMSG(*) = PBUF;                                            00140000
ARRAY WPBUF (*) = PBUF;                                        <<01.01>>00142000
BYTE ARRAY HEAD1(0:61) :=                                               00144000
     "I       ADDRESS        I           ERROR TYPE        I ERROR I";  00146000
BYTE ARRAY HEAD2(0:61) :=                                               00148000
     "I MEMORY I  LOC  I ROW I  TYPE   BIT   BOARD   CHIP  I COUNT I";  00150000
BYTE ARRAY HEAD3(0:61) :=                                               00152000
     "--------------------------------------------------------------";  00154000
BYTE ARRAY HEAD4(0:61) :=                                               00156000
     "------------------------------------------------------       -";  00158000
BYTE ARRAY HEAD1'16K(0:61) :=                                  <<RK2MB>>00160000
     "I         ADDRESS             I      ERROR TYPE      I ERROR I";  00162000
BYTE ARRAY HEAD2'16K(0:61) :=                                  <<RK2MB>>00164000
     "I CONTROLLER    I BOARD I ROW I  TYPE   BIT   CHIP   I COUNT I";  00166000
                                                                        00168000
EQUATE                                                                  00170000
     FSERR    =     0,                                                  00172000
     SYSDB    = %1000,  << System DB offset.                >> <<03020>>00174000
     OUTYPE   =     0,  <<OUTPUT FILE TYPE - ERRMESSAGE>>               00176000
     LOGTYPE  =     1,  <<OUTPUT FILE TYPE - ERRMESSAGE>>               00178000
     LINEMAX  =    40,  <<PRINT LINES PER PAGE>>                        00180000
     MEMBANKNUM = SYSDB + %47,   << Number of memory banks. >> <<03020>>00182000
     RELEASE  =     4,  <<FCLOSE DISPOSITION VALUE>>                    00184000
     FOPTIONS = %2001,  <<FOR MEMLOG FOPEN>>                            00186000
     ICF55    =     5,  << CPU'TYPE returned by THISCPU.    >> <<03020>>00188000
     FILECODE = -1234;                                                  00190000
                                                                        00192000
EQUATE                                                                  00194000
     ROWNUM   = 8,                                                      00196000
     ROWNUM'TP= 4,                                             <<RK2MB>>00198000
     CHECKNUM = 4;                                                      00200000
                                                                        00202000
EQUATE  << FIRST AND SECOND CONTROLLER BOARDS >>                        00204000
     CONTROLLER'A  = 0,                                        <<RK2MB>>00206000
     CONTROLLER'B  = 1;                                        <<RK2MB>>00208000
                                                                        00210000
EQUATE << LOG RECORD LOCATIONS >>                                       00212000
     STARTIME  =  2048, <<DOUBLE LOCATION>>                    <<01397>>00214000
     LASTIME   =  2049, <<DOUBLE LOCATION>>                    <<01397>>00216000
     FERRTIME  =  2050, <<DOUBLE LOCATION>>                    <<01397>>00218000
     LERRTIME  =  2051, <<DOUBLE LOCATION>>                    <<01397>>00220000
     BANKNUMB  = 4104,                                         <<01397>>00222000
     DELAYLOC  = 4105;                                         <<01397>>00224000
                                                                        00226000
DEFINE TYPEF = (0:8)#;                                                  00228000
                                                                        00230000
DEFINE  << FILE INFORMATION - NUMBER AND TYPE >>                        00232000
     OUTFILE = (OUTFNUM + OUTYPE & LSL(8))#,                            00234000
     LOGFILE = (LOGFNUM + LOGTYPE & LSL(8))#;                           00236000
                                                               <<01397>>00238000
                                                               <<01397>>00240000
DEFINE MCS  =   ASSEMBLE(CON %20302;CON 7;)#;                  <<01397>>00242000
                                                               <<01397>>00244000
                                                               <<01397>>00246000
                                                                        00248000
<< FAULT CONDITION RANGES (FAULTS ARRAY VALUES)                         00250000
     0 - 15: DATA BIT ERRORS (DATA BITS 0 - 15)                         00252000
    16 - 20: CHECK BIT ERRORS (CHECK BITS A -E)                         00254000
         21: DOUBLE BIT ERROR                                           00256000
         22: READ CLOCK FAILURE                                         00258000
         23: CHECK BIT I/O DRIVER FAULT                                 00260000
         24: ERROR IN MEMORY LOGGING FIRMWARE.                          00262000
>>                                                                      00264000
                                                                        00266000
INTEGER ARRAY FAULTS(0:31) :=                                           00268000
    <<  0 >>     24,  << LOGGING SYSTEM ERROR >>                        00270000
    <<  1 >>     16,  << CHECK BIT A          >>                        00272000
    <<  2 >>     17,  << CHECK BIT B          >>                        00274000
    <<  3 >>      3,  << DATA BIT  3          >>                        00276000
    <<  4 >>     18,  << CHECK BIT C          >>                        00278000
    <<  5 >>     21,  << DOUBLE BIT ERROR     >>                        00280000
    <<  6 >>      9,  << DATA BIT  9          >>                        00282000
    <<  7 >>      0,  << DATA BIT  0          >>                        00284000
    <<  8 >>     19,  << CHECK BIT D          >>                        00286000
    <<  9 >>      6,  << DATA BIT  6          >>                        00288000
    << 10 >>     22,  << READ CLOCK FAILURE   >>                        00290000
    << 11 >>      1,  << DATA BIT  1          >>                        00292000
    << 12 >>     13,  << DATA BIT 13          >>                        00294000
    << 13 >>      4,  << DATA BIT  4          >>                        00296000
    << 14 >>      8,  << DATA BIT  8          >>                        00298000
    << 15 >>     21,  << DOUBLE BIT ERROR     >>                        00300000
    << 16 >>     20,  << CHECK BIT E          >>                        00302000
    << 17 >>      7,  << DATA BIT  7          >>                        00304000
    << 18 >>     11,  << DATA BIT 11          >>                        00306000
    << 19 >>      2,  << DATA BIT  2          >>                        00308000
    << 20 >>     14,  << DATA BIT 14          >>                        00310000
    << 21 >>      5,  << DATA BIT  5          >>                        00312000
    << 22 >>     21,  << DOUBLE BIT ERROR     >>                        00314000
    << 23 >>     21,  << DOUBLE BIT ERROR     >>                        00316000
    << 24 >>     15,  << DATA BIT 15          >>                        00318000
    << 25 >>     21,  << DOUBLE BIT ERROR     >>                        00320000
    << 26 >>     10,  << DATA BIT 10          >>                        00322000
    << 27 >>     21,  << DOUBLE BIT ERROR     >>                        00324000
    << 28 >>     12,  << DATA BIT 12          >>                        00326000
    << 29 >>     21,  << DOUBLE BIT ERROR     >>                        00328000
    << 30 >>     23,  << DRIVER FAULT         >>                        00330000
    << 31 >>     23;  << DRIVER FAULT         >>                        00332000
                                                                        00334000
INTEGER ARRAY FAULTS'TP(0:31) :=                               <<RK2MB>>00336000
    <<  0 >>     16,  << CHECK BIT 0          >>                        00338000
    <<  1 >>     21,  << CHECK BIT 5          >>                        00340000
    <<  2 >>     20,  << CHECK BIT 4          >>                        00342000
    <<  3 >>     15,  << DATA BIT  15         >>                        00344000
    <<  4 >>     19,  << CHECK BIT 3          >>                        00346000
    <<  5 >>     25,  << LOGGING SYSTEM ERROR >>                        00348000
    <<  6 >>     14,  << DATA BIT 14          >>                        00350000
    <<  7 >>     13,  << DATA BIT 13          >>                        00352000
    <<  8 >>     18,  << CHECK BIT 2          >>                        00354000
    <<  9 >>     25,  << LOGGING SYSTEM ERROR >>                        00356000
    << 10 >>     25,  << LOGGING SYSTEM ERROR >>                        00358000
    << 11 >>     12,  << DATA BIT 12          >>                        00360000
    << 12 >>     11,  << DATA BIT 11          >>                        00362000
    << 13 >>     10,  << DATA BIT 10          >>                        00364000
    << 14 >>      9,  << DATA BIT  9          >>                        00366000
    << 15 >>     25,  << LOGGING SYSTEM ERROR >>                        00368000
    << 16 >>     17,  << CHECK BIT 1          >>                        00370000
    << 17 >>      8,  << DATA BIT  8          >>                        00372000
    << 18 >>     25,  << LOGGING SYSTEM ERROR >>                        00374000
    << 19 >>      7,  << DATA BIT  7          >>                        00376000
    << 20 >>     25,  << LOGGING SYSTEM ERROR >>                        00378000
    << 21 >>      6,  << DATA BIT  6          >>                        00380000
    << 22 >>      5,  << DATA BIT 5           >>                        00382000
    << 23 >>     25,  << LOGGING SYSTEM ERROR >>                        00384000
    << 24 >>      4,  << DATA BIT  4          >>                        00386000
    << 25 >>      3,  << DATA BIT  3          >>                        00388000
    << 26 >>      2,  << DATA BIT  2          >>                        00390000
    << 27 >>     25,  << LOGGING SYSTEM ERROR >>                        00392000
    << 28 >>      1,  << DATA BIT  1          >>                        00394000
    << 29 >>     25,  << LOGGING SYSTEM ERROR >>                        00396000
    << 30 >>     25,  << LOGGING SYSTEM ERROR >>                        00398000
    << 31 >>      0;  << DATA BIT 0           >>                        00400000
                                                                        00402000
INTEGER ARRAY FAULTS'2MB(0:31) :=                              <<RK2MB>>00404000
    <<  0 >>     16,  << CHECK BIT 0          >>                        00406000
    <<  1 >>     21,  << CHECK BIT 5          >>                        00408000
    <<  2 >>     20,  << CHECK BIT 4          >>                        00410000
    <<  3 >>      3,  << DATA BIT  3          >>                        00412000
    <<  4 >>     19,  << CHECK BIT 3          >>                        00414000
    <<  5 >>     23,  << FORCED D.E.W         >>                        00416000
    <<  6 >>      9,  << DATA BIT  9          >>                        00418000
    <<  7 >>      0,  << DATA BIT  0          >>                        00420000
    <<  8 >>     18,  << CHECK BIT 2          >>                        00422000
    <<  9 >>      6,  << DATA BIT  6          >>                        00424000
    << 10 >>     24,  << MISSING ARRAY BOARD  >>                        00426000
    << 11 >>      1,  << DATA BIT  1          >>                        00428000
    << 12 >>     13,  << DATA BIT 13          >>                        00430000
    << 13 >>      4,  << DATA BIT  4          >>                        00432000
    << 14 >>      8,  << DATA BIT  8          >>                        00434000
    << 15 >>     22,  << DOUBLE BIT ERROR     >>                        00436000
    << 16 >>     17,  << CHECK BIT 1          >>                        00438000
    << 17 >>      7,  << DATA BIT  7          >>                        00440000
    << 18 >>     11,  << DATA BIT 11          >>                        00442000
    << 19 >>      2,  << DATA BIT  2          >>                        00444000
    << 20 >>     14,  << DATA BIT 14          >>                        00446000
    << 21 >>      5,  << DATA BIT  5          >>                        00448000
    << 22 >>     22,  << DOUBLE BIT ERROR     >>                        00450000
    << 23 >>     22,  << DOUBLE BIT ERROR     >>                        00452000
    << 24 >>     15,  << DATA BIT 15          >>                        00454000
    << 25 >>     22,  << DOUBLE BIT ERROR     >>                        00456000
    << 26 >>     10,  << DATA BIT 10          >>                        00458000
    << 27 >>     22,  << DOUBLE BIT ERROR     >>                        00460000
    << 28 >>     12,  << DATA BIT 12          >>                        00462000
    << 29 >>     22,  << DOUBLE BIT ERROR     >>                        00464000
    << 30 >>     22,  << DOUBLE BIT ERROR     >>                        00466000
    << 31 >>     22;  << DOUBLE BIT ERROR     >>                        00468000
                                                               <<01397>>00470000
                                                               <<01397>>00472000
INTEGER ARRAY FAULTS'PRONTO(0:63) :=                           <<01397>>00474000
    <<  0 >>     22,  << ***  >>                               <<01397>>00476000
    <<  1 >>     22,  << ***  >>                               <<01397>>00478000
    <<  2 >>     22,  << ***  >>                               <<01397>>00480000
    <<  3 >>     -9,  << DATA BIT  24         >>               <<01397>>00482000
    <<  4 >>     22,  << ***  >>                               <<01397>>00484000
    <<  5 >>     22,  << *** >>                                <<01397>>00486000
    <<  6 >>     22,  << *** >>                                <<01397>>00488000
    <<  7 >>    -13,  << DATA BIT 28 >>                        <<01397>>00490000
    <<  8 >>      2,  << DATA  BIT 2          >>               <<01397>>00492000
    <<  9 >>     22,  << *** >>                                <<01397>>00494000
    << 10 >>     22,  << *** >>                                <<01397>>00496000
    << 11 >>     22,  << *** >>                                <<01397>>00498000
    << 12 >>     22,  << *** >>                                <<01397>>00500000
    << 13 >>     -7,  << DATA BIT 22          >>               <<01397>>00502000
    << 14 >>     12,  << DATA BIT  12         >>               <<01397>>00504000
    << 15 >>    -16,  << DATA BIT 31 >>                        <<01397>>00506000
    << 16 >>     22,  << *** >>                                <<02017>>00508000
    << 17 >>     22,  << *** >>                                <<01397>>00510000
    << 18 >>     22,  << *** >>                                <<01397>>00512000
    << 19 >>    -11,  << DATA BIT  26         >>               <<01397>>00514000
    << 20 >>     22,  << *** >>                                <<01397>>00516000
    << 21 >>     -5,  << DATA BIT  20         >>               <<01397>>00518000
    << 22 >>     22,  << *** >>                                <<01397>>00520000
    << 23 >>    -15,  << DATA BIT 30 >>                        <<01397>>00522000
    << 24 >>      3,  << DATA BIT 3 >>                         <<01397>>00524000
    << 25 >>     -3,  << DATA BIT  18         >>               <<01397>>00526000
    << 26 >>     10,  << DATA BIT  10         >>               <<01397>>00528000
    << 27 >>     22,  << *** >>                                <<01397>>00530000
    << 28 >>      6,  << DATA BIT 6 >>                         <<01397>>00532000
    << 29 >>     22,  << *** >>                                <<01397>>00534000
    << 30 >>     14,  << DATA BIT 14          >>               <<01397>>00536000
    << 31 >>    -18,  << CHECK BIT 1          >>               <<01397>>00538000
    << 32 >>     01,  << DATA BIT 1 >>                         <<01397>>00540000
    << 33 >>     22,  << *** >>                                <<01397>>00542000
    << 34 >>     22,  << ***  >>                               <<01397>>00544000
    << 35 >>    -10,  << DATA BIT 25 >>                        <<01397>>00546000
    << 36 >>     22,  << *** >>                                <<01397>>00548000
    << 37 >>     22,  << *** >>                                <<01397>>00550000
    << 38 >>     22,  << *** >>                                <<01397>>00552000
    << 39 >>    -14,  << DATA BIT 29  >>                       <<01397>>00554000
    << 40 >>     22,  << *** >>                                <<01397>>00556000
    << 41 >>     -2,  << DATA BIT 17 >>                        <<01397>>00558000
    << 42 >>      9,  << DATA BIT 9 >>                         <<01397>>00560000
    << 43 >>     22,  << *** >>                                <<01397>>00562000
    << 44 >>      5,  << DATA BIT  5          >>               <<01397>>00564000
    << 45 >>     -8,  << DATA BIT 23 >>                        <<01397>>00566000
    << 46 >>     13,  << DATA BIT 13 >>                        <<01397>>00568000
    << 47 >>    -19,  << CHECK BIT 2 >>                        <<01397>>00570000
    << 48 >>     22,  << *** >>                                <<01397>>00572000
    << 49 >>     -1,  << DATA BIT  16         >>               <<01397>>00574000
    << 50 >>      8,  << DATA BIT 8 >>                         <<01397>>00576000
    << 51 >>    -12,  << DATA BIT  27         >>               <<01397>>00578000
    << 52 >>      4,  << DATA BIT 4 >>                         <<01397>>00580000
    << 53 >>     -6,  << DATA BIT 21 >>                        <<01397>>00582000
    << 54 >>     15,  << DATA BIT 15 >>                        <<01397>>00584000
    << 55 >>    -20,  << CHECK BIT 3          >>               <<01397>>00586000
    << 56 >>      0,  << DATA BIT   0         >>               <<01397>>00588000
    << 57 >>     -4,  << DATA BIT 19 >>                        <<01397>>00590000
    << 58 >>     11,  << DATA BIT 11  >>                       <<01397>>00592000
    << 59 >>    -21,  << CHECK BIT 4 >>                        <<01397>>00594000
    << 60 >>      7,  << DATA BIT  7          >>               <<01397>>00596000
    << 61 >>    -22,  << CHECK BIT 5 >>                        <<01397>>00598000
    << 62 >>    -23,  << CHECK BIT 6          >>               <<01397>>00600000
    << 63 >>    -17;  << CHECK BIT 0          >>               <<01397>>00602000
                                                               <<01397>>00604000
                                                               <<01397>>00606000
                                                               <<01397>>00608000
                                                               <<01397>>00610000
                                                                        00612000
                                                               <<03020>>00614000
COMMENT --                                                     <<03020>>00616000
  This is the faults array for the ICF55 (CPU'TYPE =  5).  The <<03020>>00618000
addresses of elements in the array correspond to the six LSB's <<03020>>00620000
of address of elements in the LOGREC array (which is the first <<03020>>00622000
record of MEMLOG.PUB.SYS).  The first 4096 elements of  MEMLOG <<03020>>00624000
contain error counts for memory IC chips.  The address of each <<03020>>00626000
of these elements is a mapping from the  address  fed  to  the <<03020>>00628000
error  logging RAM in the ICF55.  ICF55 memory is organized as <<03020>>00630000
follows:  1 to 8 memory array boards, each of which contains 4 <<03020>>00632000
39-bit "words" (this is what  the  ICF55  people  call  them). <<03020>>00634000
Each  such word consists of 39 1 x N RAM's, where N can be 16K <<03020>>00636000
or 64K.  The 39 bits are broken down into 32 data bits  and  7 <<03020>>00638000
check  bits.  The check bits are capable of detecting all mem- <<03020>>00640000
ory errors, and can be used to correct all single-bit  errors. <<03020>>00642000
Thus  one  access  to memory will access 1 bit from each of 39 <<03020>>00644000
RAM chips.  Since there are four such words per  array  board, <<03020>>00646000
each board contains 156 RAM chips.                             <<03020>>00648000
  Now back to MEMLOG.  The address of each of the  first  4096 <<03020>>00650000
elements  of  LOGREC  map  to the error logging RAM address as <<03020>>00652000
follows:  Bits (4:3) designate  one  of  the  8  memory  array <<03020>>00654000
boards.  Bits  (7:2)  specify  one  of the 4 39-bit "words" on <<03020>>00656000
that board.  The remaining seven bits (9:7) may specify a par- <<03020>>00658000
ticular chip in the word.  I say "may" because there are  only <<03020>>00660000
39  valid combinations out of 128 possibilities.  FAULTS'ICF55 <<03020>>00662000
is reduced to 64 elements by noting that  all  valid  combina- <<03020>>00664000
tions  of  bits  (9:7) possess odd parity, thus it suffices to <<03020>>00666000
check this separately and use  only  bits  (10:6)  to  address <<03020>>00668000
FAULTS'ICF55. The 25 forbidden combinations (= 64 - 39) should <<03020>>00670000
never be accessed.  If they are, or if (9:7) has even  parity, <<03020>>00672000
a "multiple-bit error" code (22) is obtained.                  <<03020>>00674000
  So much for addresses in FAULTS'ICF55.  What about the  con- <<03020>>00676000
tents?  The  contents range from -23 to 15, as well as 22, and <<03020>>00678000
are mapped to the data and check bits of a memory word as fol- <<03020>>00680000
lows:  -23 to -17 correspond to check bits 6 to 0, respective- <<03020>>00682000
ly.  -16 to -1 correspond to data bits 31 to 16.  0 to 15 cor- <<03020>>00684000
respond to data bits 0 to 15.  Finally, 22 is the no-no  which <<03020>>00686000
causes "multiple-bit error" to be displayed. (This is the same <<03020>>00688000
numbering scheme used in the FAULTS'PRONTO  array,  used  with <<03020>>00690000
CPU'TYPE  =  4, the ICF44 with PRONTO memory, although the ad- <<03020>>00692000
dresses of -23 to 15 and 22 differ in that  array).  A  number <<03020>>00694000
between  -23 and 15 obtained from this array is used, together <<03020>>00696000
with bits (7:2) of the LOGREC address, to enter the DATA'ICF55 <<03020>>00698000
array (see below) and retrieve  the  proper  U  (chip)  number <<03020>>00700000
which corresponds to THIS data bit in THIS "word". Since the U <<03020>>00702000
numbers are the same for each board, we only need one  board's <<03020>>00704000
worth of U numbers.  The board address, shown elsewhere in the <<03020>>00706000
user display, is obtained from bits (4:3) of the LOGREC array. <<03020>>00708000
;                                                              <<03020>>00710000
                                                               <<03020>>00712000
INTEGER ARRAY FAULTS'ICF55 (0:63) :=                           <<03020>>00714000
    <<  0 >>    -17,  << Check bit  0.        >>               <<03020>>00716000
    <<  1 >>    -23,  << Check bit  6.        >>               <<03020>>00718000
    <<  2 >>    -22,  << Check bit  5.        >>               <<03020>>00720000
    <<  3 >>     22,                                           <<03020>>00722000
    <<  4 >>    -21,  << Check bit  4.        >>               <<03020>>00724000
    <<  5 >>     22,                                           <<03020>>00726000
    <<  6 >>     22,                                           <<03020>>00728000
    <<  7 >>     22,                                           <<03020>>00730000
    <<  8 >>    -20,  << Check bit  3.        >>               <<03020>>00732000
    <<  9 >>     22,                                           <<03020>>00734000
    << 10 >>     22,                                           <<03020>>00736000
    << 11 >>     22,                                           <<03020>>00738000
    << 12 >>     22,                                           <<03020>>00740000
    << 13 >>     22,                                           <<03020>>00742000
    << 14 >>     22,                                           <<03020>>00744000
    << 15 >>     22,                                           <<03020>>00746000
    << 16 >>    -19,  << Check bit  2.        >>               <<03020>>00748000
    << 17 >>     22,                                           <<03020>>00750000
    << 18 >>     22,                                           <<03020>>00752000
    << 19 >>     22,                                           <<03020>>00754000
    << 20 >>     22,                                           <<03020>>00756000
    << 21 >>     22,                                           <<03020>>00758000
    << 22 >>     22,                                           <<03020>>00760000
    << 23 >>     22,                                           <<03020>>00762000
    << 24 >>      0,  << Data  bit  0.        >>               <<03020>>00764000
    << 25 >>      1,  << Data  bit  1.        >>               <<03020>>00766000
    << 26 >>      2,  << Data  bit  2.        >>               <<03020>>00768000
    << 27 >>      3,  << Data  bit  3.        >>               <<03020>>00770000
    << 28 >>      4,  << Data  bit  4.        >>               <<03020>>00772000
    << 29 >>      5,  << Data  bit  5.        >>               <<03020>>00774000
    << 30 >>      6,  << Data  bit  6.        >>               <<03020>>00776000
    << 31 >>      7,  << Data  bit  7.        >>               <<03020>>00778000
    << 32 >>    -18,  << Check bit  1.        >>               <<03020>>00780000
    << 33 >>     22,                                           <<03020>>00782000
    << 34 >>     22,                                           <<03020>>00784000
    << 35 >>     22,                                           <<03020>>00786000
    << 36 >>     22,                                           <<03020>>00788000
    << 37 >>     22,                                           <<03020>>00790000
    << 38 >>     22,                                           <<03020>>00792000
    << 39 >>     22,                                           <<03020>>00794000
    << 40 >>      8,  << Data  bit  8.        >>               <<03020>>00796000
    << 41 >>      9,  << Data  bit  9.        >>               <<03020>>00798000
    << 42 >>     10,  << Data  bit 10.        >>               <<03020>>00800000
    << 43 >>     11,  << Data  bit 11.        >>               <<03020>>00802000
    << 44 >>     12,  << Data  bit 12.        >>               <<03020>>00804000
    << 45 >>     13,  << Data  bit 13.        >>               <<03020>>00806000
    << 46 >>     14,  << Data  bit 14.        >>               <<03020>>00808000
    << 47 >>     15,  << Data  bit 15.        >>               <<03020>>00810000
    << 48 >>     -1,  << Data  bit 16.        >>               <<03020>>00812000
    << 49 >>     -2,  << Data  bit 17.        >>               <<03020>>00814000
    << 50 >>     -3,  << Data  bit 18.        >>               <<03020>>00816000
    << 51 >>     -4,  << Data  bit 19.        >>               <<03020>>00818000
    << 52 >>     -5,  << Data  bit 20.        >>               <<03020>>00820000
    << 53 >>     -6,  << Data  bit 21.        >>               <<03020>>00822000
    << 54 >>     -7,  << Data  bit 22.        >>               <<03020>>00824000
    << 55 >>     -8,  << Data  bit 23.        >>               <<03020>>00826000
    << 56 >>     -9,  << Data  bit 24.        >>               <<03020>>00828000
    << 57 >>    -10,  << Data  bit 25.        >>               <<03020>>00830000
    << 58 >>    -11,  << Data  bit 26.        >>               <<03020>>00832000
    << 59 >>    -12,  << Data  bit 27.        >>               <<03020>>00834000
    << 60 >>    -13,  << Data  bit 28.        >>               <<03020>>00836000
    << 61 >>    -14,  << Data  bit 29.        >>               <<03020>>00838000
    << 62 >>    -15,  << Data  bit 30.        >>               <<03020>>00840000
    << 63 >>    -16;  << Data  bit 31.        >>               <<03020>>00842000
                                                               <<03020>>00844000
INTEGER ARRAY DATAB(0:135) :=                                           00846000
<<                            ROW (BITS 8:3)                     >>     00848000
<<               000   001   010   011   100   101   110   111   >>     00850000
<<     FAULT     ---   ---   ---   ---   ---   ---   ---   ---   >>     00852000
                                                                        00854000
    <<  0 >>     93,   83,   73,   63,   43,   33,   23,   13,          00856000
    <<  1 >>     94,   84,   74,   64,   44,   34,   24,   14,          00858000
    <<  2 >>     95,   85,   75,   65,   45,   35,   25,   15,          00860000
    <<  3 >>     96,   86,   76,   66,   46,   36,   26,   16,          00862000
    <<  4 >>     97,   87,   77,   67,   47,   37,   27,   17,          00864000
    <<  5 >>     98,   88,   78,   68,   48,   38,   28,   18,          00866000
    <<  6 >>     99,   89,   79,   69,   49,   39,   29,   19,          00868000
    <<  7 >>    910,  810,  710,  610,  410,  310,  210,  110,          00870000
    <<  8 >>    911,  811,  711,  611,  411,  311,  211,  111,          00872000
    <<  9 >>    912,  812,  712,  612,  412,  312,  212,  112,          00874000
    << 10 >>    913,  813,  713,  613,  413,  313,  213,  113,          00876000
    << 11 >>    914,  814,  714,  614,  414,  314,  214,  114,          00878000
    << 12 >>    915,  815,  715,  615,  415,  315,  215,  115,          00880000
    << 13 >>    916,  816,  716,  616,  416,  316,  216,  116,          00882000
    << 14 >>    917,  817,  717,  617,  417,  317,  217,  117,          00884000
    << 15 >>    918,  818,  718,  618,  418,  318,  218,  118,          00886000
    <<  A >>    919,  819,  719,  619,  419,  319,  219,  119;          00888000
                                                               <<01397>>00890000
                                                               <<01397>>00892000
INTEGER ARRAY DATA'PRONTO(-23:15) :=                           <<01397>>00894000
                                                               <<01397>>00896000
<<  FAULT #    CHIP U-       BIT DESCRIPTION  >>               <<01397>>00898000
                                                               <<01397>>00900000
      <<-23>>     53,    << CHECK BIT 6>>                      <<01397>>00902000
      <<-22>>     63,    << CHECK BIT 5>>                      <<01397>>00904000
      <<-21>>     73,    << CHECK BIT 4 >>                     <<01397>>00906000
      <<-20>>     83,    << CHECK BIT 3 >>                     <<01397>>00908000
      <<-19>>     93,    << CHECK BIT 2 >>                     <<01397>>00910000
      <<-18>>    103,    << CHECK BIT 1 >>                     <<01397>>00912000
      <<-17>>    113,    << CHECK BIT 0 >>                     <<01397>>00914000
      <<-16>>    123,    << DATA BIT 31 >>                     <<01397>>00916000
      <<-15>>    133,    << DATA BIT 30 >>                     <<01397>>00918000
      <<-14>>    143,    << DATA BIT 29 >>                     <<01397>>00920000
      <<-13>>    153,    << DATA BIT 28 >>                     <<01397>>00922000
      <<-12>>    163,    << DATA BIT 27 >>                     <<01397>>00924000
      <<-11>>    173,    << DATA BIT 26 >>                     <<01397>>00926000
      <<-10>>    183,    << DATA BIT 25 >>                     <<01397>>00928000
      <<- 9>>    193,    << DATA BIT 24 >>                     <<01397>>00930000
      <<- 8>>    203,    << DATA BIT 23 >>                     <<01397>>00932000
      <<- 7>>    213,    << DATA BIT 22 >>                     <<01397>>00934000
      <<- 6>>    223,    << DATA BIT 21 >>                     <<01397>>00936000
      <<- 5>>    233,    << DATA BIT 20 >>                     <<01397>>00938000
      <<- 4>>     42,    << DATA BIT 19 >>                     <<01397>>00940000
      <<- 3>>     52,    << DATA BIT 18 >>                     <<01397>>00942000
      <<- 2>>     62,    << DATA BIT 17 >>                     <<01397>>00944000
      <<- 1>>     72,    << DATA BIT 16 >>                     <<01397>>00946000
      <<  0>>    232,    << DATA BIT  0 >>                     <<01397>>00948000
      <<  1>>    222,    << DATA BIT  1 >>                     <<01397>>00950000
      <<  2>>    212,    << DATA BIT  2 >>                     <<01397>>00952000
      <<  3>>    202,    << DATA BIT  3 >>                     <<01397>>00954000
      <<  4>>    192,    << DATA BIT  4 >>                     <<01397>>00956000
      <<  5>>    182,    << DATA BIT  5 >>                     <<01397>>00958000
      <<  6>>    172,    << DATA BIT  6 >>                     <<01397>>00960000
      <<  7>>    162,    << DATA BIT  7 >>                     <<01397>>00962000
      <<  8>>    152,    << DATA BIT  8 >>                     <<01397>>00964000
      <<  9>>    142,    << DATA BIT  9 >>                     <<01397>>00966000
      << 10>>    132,    << DATA BIT 10 >>                     <<01397>>00968000
      << 11>>    122,    << DATA BIT 11 >>                     <<01397>>00970000
      << 12>>    112,    << DATA BIT 12 >>                     <<01397>>00972000
      << 13>>    102,    << DATA BIT 13 >>                     <<01397>>00974000
      << 14>>     92,    << DATA BIT 14 >>                     <<01397>>00976000
      << 15>>     82;    << DATA BIT 15 >>                     <<01397>>00978000
                                                               <<01397>>00980000
                                                               <<01397>>00982000
                                                                        00984000
COMMENT --                                                     <<03020>>00986000
  This is the data array for the ICF55.  Its contents are  the <<03020>>00988000
U numbers of the RAM chips on a memory array board, or rather, <<03020>>00990000
one-fourth of the U numbers, the numbers for  ICF55  "word"  0 <<03020>>00992000
only.  (See  the capsule description of ICF55 memory preceding <<03020>>00994000
the FAULTS'ICF55 array).  The U number for word 1, 2 or  3  is <<03020>>00996000
obtained by adding two, four or six, respectively, to the num- <<03020>>00998000
ber obtained from word 0.  The element address for  DATA'ICF55 <<03020>>01000000
is obtained from the contents of FAULTS'ICF55  (FAULT,  below) <<03020>>01002000
and  the  word field (7:2) of the LOGREC array element address <<03020>>01004000
(WORD). The chip number is then obtained from DATA'ICF55, add- <<03020>>01006000
ing the appropriate increment if other than word 0 is  indica- <<03020>>01008000
ted.  The statement is as follows:                             <<03020>>01010000
                                                               <<03020>>01012000
     CHIP := DATA'ICF55 (FAULT) + WORD*2;                      <<03020>>01014000
                                                               <<03020>>01016000
INTEGER ARRAY DATA'ICF55 (-23:15) :=                           <<03020>>01018000
                                                               <<03020>>01020000
<<          WORD 0                                          >> <<03020>>01022000
<< FAULT    CHIP U-    DESCRIPTION                          >> <<03020>>01024000
<< -------------------------------------------------------- >> <<03020>>01026000
                                                               <<03020>>01028000
 << -23 >>   403,      << Check bit  6.                     >> <<03020>>01030000
 << -22 >>   503,      << Check bit  5.                     >> <<03020>>01032000
 << -21 >>   603,      << Check bit  4.                     >> <<03020>>01034000
 << -20 >>   703,      << Check bit  3.                     >> <<03020>>01036000
 << -19 >>   803,      << Check bit  2.                     >> <<03020>>01038000
 << -18 >>   903,      << Check bit  1.                     >> <<03020>>01040000
 << -17 >>  1003,      << Check bit  0.                     >> <<03020>>01042000
 << -16 >>  1103,      << Data  bit 31.                     >> <<03020>>01044000
 << -15 >>  1203,      << Data  bit 30.                     >> <<03020>>01046000
 << -14 >>  1303,      << Data  bit 29.                     >> <<03020>>01048000
 << -13 >>  1403,      << Data  bit 28.                     >> <<03020>>01050000
 << -12 >>  1503,      << Data  bit 27.                     >> <<03020>>01052000
 << -11 >>  1603,      << Data  bit 26.                     >> <<03020>>01054000
 << -10 >>  1703,      << Data  bit 25.                     >> <<03020>>01056000
 << - 9 >>  1803,      << Data  bit 24.                     >> <<03020>>01058000
 << - 8 >>  1903,      << Data  bit 23.                     >> <<03020>>01060000
 << - 7 >>  2003,      << Data  bit 22.                     >> <<03020>>01062000
 << - 6 >>  2103,      << Data  bit 21.                     >> <<03020>>01064000
 << - 5 >>  2203,      << Data  bit 20.                     >> <<03020>>01066000
 << - 4 >>   302,      << Data  bit 19.                     >> <<03020>>01068000
 << - 3 >>   402,      << Data  bit 18.                     >> <<03020>>01070000
 << - 2 >>   502,      << Data  bit 17.                     >> <<03020>>01072000
 << - 1 >>   602,      << Data  bit 16.                     >> <<03020>>01074000
 <<   0 >>  2202,      << Data  bit  0.                     >> <<03020>>01076000
 <<   1 >>  2102,      << Data  bit  1.                     >> <<03020>>01078000
 <<   2 >>  2002,      << Data  bit  2.                     >> <<03020>>01080000
 <<   3 >>  1902,      << Data  bit  3.                     >> <<03020>>01082000
 <<   4 >>  1802,      << Data  bit  4.                     >> <<03020>>01084000
 <<   5 >>  1702,      << Data  bit  5.                     >> <<03020>>01086000
 <<   6 >>  1602,      << Data  bit  6.                     >> <<03020>>01088000
 <<   7 >>  1502,      << Data  bit  7.                     >> <<03020>>01090000
 <<   8 >>  1402,      << Data  bit  8.                     >> <<03020>>01092000
 <<   9 >>  1302,      << Data  bit  9.                     >> <<03020>>01094000
 <<  10 >>  1202,      << Data  bit 10.                     >> <<03020>>01096000
 <<  11 >>  1102,      << Data  bit 11.                     >> <<03020>>01098000
 <<  12 >>  1002,      << Data  bit 12.                     >> <<03020>>01100000
 <<  13 >>   902,      << Data  bit 13.                     >> <<03020>>01102000
 <<  14 >>   802,      << Data  bit 14.                     >> <<03020>>01104000
 <<  15 >>   702;      << Data  bit 15.                     >> <<03020>>01106000
                                                               <<03020>>01108000
                                                               <<03020>>01110000
INTEGER ARRAY DATA'TP(0:87):=                                  <<RK2MB>>01112000
<<              ROW (BITS 9:2)             >>                           01114000
<<               000   001   010   011     >>                           01116000
<<     FAULT     ---   ---   ---   ---     >>                           01118000
                                                                        01120000
    <<  0 >>     11,   12,   13,   14,                                  01122000
    <<  1 >>     21,   22,   23,   24,                                  01124000
    <<  2 >>     31,   32,   33,   34,                                  01126000
    <<  3 >>     41,   42,   43,   44,                                  01128000
    <<  4 >>     51,   52,   53,   54,                                  01130000
    <<  5 >>     61,   62,   63,   64,                                  01132000
    <<  6 >>     91,   92,   93,   94,                                  01134000
    <<  7 >>    101,  102,  103,  104,                                  01136000
    <<  8 >>    111,  112,  113,  114,                                  01138000
    <<  9 >>    121,  122,  123,  124,                                  01140000
    << 10 >>    131,  132,  133,  134,                                  01142000
    << 11 >>    161,  162,  163,  164,                                  01144000
    << 12 >>    171,  172,  173,  174,                                  01146000
    << 13 >>    181,  182,  183,  184,                                  01148000
    << 14 >>    191,  192,  193,  194,                                  01150000
    << 15 >>    201,  202,  203,  204,                                  01152000
    << H0 >>    211,  212,  213,  214,                                  01154000
    << H1 >>    241,  242,  243,  244,                                  01156000
    << H2 >>    251,  252,  253,  254,                                  01158000
    << H3 >>    261,  262,  263,  264,                                  01160000
    << H4 >>    271,  272,  273,  274,                                  01162000
    << H5 >>    281,  282,  283,  284;                                  01164000
                                                                        01166000
INTEGER ARRAY DATA'2MB(0:175) :=                               <<RK2MB>>01168000
<<                            ROW (BITS 8:3)                            01170000
<<               000   001   010   011   100   101   110   111          01172000
<<     FAULT     ---   ---   ---   ---   ---   ---   ---   ---          01174000
                                                                        01176000
    <<  0 >>     19,   18,   17,   16,   15,   14,   13,   12,          01178000
    <<  1 >>     29,   28,   27,   26,   25,   24,   23,   22,          01180000
    <<  2 >>     39,   38,   37,   36,   35,   34,   33,   32,          01182000
    <<  3 >>     49,   48,   47,   46,   45,   44,   43,   42,          01184000
    <<  4 >>     59,   58,   57,   56,   55,   54,   53,   52,          01186000
    <<  5 >>     69,   68,   67,   66,   65,   64,   63,   62,          01188000
    <<  6 >>     79,   78,   77,   76,   75,   74,   73,   72,          01190000
    <<  7 >>     89,   88,   87,   86,   85,   84,   83,   82,          01192000
    <<  8 >>     99,   98,   97,   96,   95,   94,   93,   92,          01194000
    <<  9 >>    109,  108,  107,  106,  105,  104,  103,  102,          01196000
    << 10 >>    119,  118,  117,  116,  115,  114,  113,  112,          01198000
    << 11 >>    149,  148,  147,  146,  145,  144,  143,  142,          01200000
    << 12 >>    159,  158,  157,  156,  155,  154,  153,  152,          01202000
    << 13 >>    169,  168,  167,  166,  165,  164,  163,  162,          01204000
    << 14 >>    179,  178,  177,  176,  175,  174,  173,  172,          01206000
    << 15 >>    189,  188,  187,  186,  185,  184,  183,  182,          01208000
    << C0 >>    199,  198,  197,  196,  195,  194,  193,  192,          01210000
    << C1 >>    209,  208,  207,  206,  205,  204,  203,  202,          01212000
    << C2 >>    219,  218,  217,  216,  215,  214,  213,  212,          01214000
    << C3 >>    229,  228,  227,  226,  225,  224,  223,  222,          01216000
    << C4 >>    239,  238,  237,  236,  235,  234,  233,  232,          01218000
    << C5 >>    249,  248,  247,  246,  245,  244,  243,  242;          01220000
                                                                        01222000
INTEGER ARRAY CHECKB(0:127) :=                                          01224000
<<                   BIT B      BIT C      BIT D      BIT E      >>     01226000
<<     (6:5)         -----      -----      -----      -----      >>     01228000
                                                                        01230000
    << 00000 >>       93,        94,        95,        96,              01232000
    << 00001 >>       83,        84,        85,        86,              01234000
    << 00010 >>       73,        74,        75,        76,              01236000
    << 00011 >>       63,        64,        65,        66,              01238000
    << 00100 >>       43,        44,        45,        46,              01240000
    << 00101 >>       33,        34,        35,        36,              01242000
    << 00110 >>       23,        24,        25,        26,              01244000
    << 00111 >>       13,        14,        15,        16,              01246000
    << 01000 >>       97,        98,        99,       910,              01248000
    << 01001 >>       87,        88,        89,       810,              01250000
    << 01010 >>       77,        78,        79,       710,              01252000
    << 01011 >>       67,        68,        69,       610,              01254000
    << 01100 >>       47,        48,        49,       410,              01256000
    << 01101 >>       37,        38,        39,       310,              01258000
    << 01110 >>       27,        28,        29,       210,              01260000
    << 01111 >>       17,        18,        19,       110,              01262000
    << 10000 >>      911,       912,       913,       914,              01264000
    << 10001 >>      811,       812,       813,       814,              01266000
    << 10010 >>      711,       712,       713,       714,              01268000
    << 10011 >>      611,       612,       613,       614,              01270000
    << 10100 >>      411,       412,       413,       414,              01272000
    << 10101 >>      311,       312,       313,       314,              01274000
    << 10110 >>      211,       212,       213,       214,              01276000
    << 10111 >>      111,       112,       113,       114,              01278000
    << 11000 >>      915,       916,       917,       918,              01280000
    << 11001 >>      815,       816,       817,       818,              01282000
    << 11010 >>      715,       716,       717,       718,              01284000
    << 11011 >>      615,       616,       617,       618,              01286000
    << 11100 >>      415,       416,       417,       418,              01288000
    << 11101 >>      315,       316,       317,       318,              01290000
    << 11110 >>      215,       216,       217,       218,              01292000
    << 11111 >>      115,       116,       117,       118;              01294000
                                                                        01296000
INTRINSIC FOPEN,FCLOSE,FREADDIR,FWRITE,FWRITEDIR,              <<01.01>>01298000
          FLOCK,FUNLOCK;                                       <<01.01>>01300000
INTRINSIC PRINT,ASCII,TERMINATE,PRINT'FILE'INFO,WHO;           <<01169>>01302000
                                                                        01304000
INTEGER PROCEDURE THISCPU;                                     <<RK2MB>>01306000
OPTION EXTERNAL;                                               <<RK2MB>>01308000
                                                               <<RK2MB>>01310000
PROCEDURE HELP;                                                         01312000
 OPTION EXTERNAL;                                                       01314000
                                                                        01316000
PROCEDURE SPACE(SPACENUM);                                              01318000
VALUE SPACENUM; INTEGER SPACENUM;                                       01320000
BEGIN                                                                   01322000
     INTEGER I;                                                         01324000
     ARRAY BLANK(0:0);                                         <<01.01>>01326000
                                                                        01328000
     BLANK(0) := "  ";                                         <<01.01>>01330000
     FOR I:=1 UNTIL SPACENUM DO FWRITE(OUTFNUM,BLANK,-1,0);             01332000
END  <<SPACE >>;                                                        01334000
                                                                        01336000
PROCEDURE ERRMESSAGE(FILENUM,ERRNUMB);                                  01338000
VALUE FILENUM,ERRNUMB;                                                  01340000
INTEGER FILENUM,ERRNUMB;                                                01342000
BEGIN                                                                   01344000
     IF ERRNUMB = FSERR THEN  <<FILE SYSTEM PROBLEM>>                   01346000
     BEGIN                                                              01348000
          PRINT'FILE'INFO(FILENUM.(8:8));                               01350000
          IF FILENUM.TYPEF = OUTYPE THEN  <<OUT FILE ERROR>>            01352000
          MOVE PBUF:="* OUT",2 ELSE         <<LOG FILE ERROR>>          01354000
          MOVE PBUF:="* LOG",2;                                         01356000
          MOVE * :=" FILE ERROR *";                                     01358000
          PRINT(WPBUF,-18,0);                                  <<01.01>>01360000
     END ELSE                                                           01362000
     BEGIN                                                              01364000
          MOVE ERRMSG:="* MEMLOGAN ERROR:     *";                       01366000
          ASCII(ERRNUMB,10,ERRMSG(18));                                 01368000
          PRINT(WPBUF,-22,0);                                  <<01.01>>01370000
     END;                                                               01372000
     TERMINATE;                                                         01374000
END <<ERRMESSAGE>>;                                                     01376000
                                                                        01378000
PROCEDURE GETIMEINFO;                                          <<00.04>>01380000
BEGIN                                                          <<00.04>>01382000
     DOUBLE FTIME,LTIME;                                       <<00.04>>01384000
     INTEGER                                                   <<00.04>>01386000
          FTIME1 = FTIME,                                      <<00.04>>01388000
          LTIME1 = LTIME;                                      <<00.04>>01390000
                                                               <<00.04>>01392000
     ERRTIME1:=ERRTIME2:=0D;                                   <<00.04>>01394000
     FOR REC:=CONTROLLER'A UNTIL CONTROLLER'B DO               <<RK2MB>>01396000
     BEGIN                                                     <<00.04>>01398000
          FREADDIR(LOGFNUM,LOGREC,RECSIZE,DOUBLE(REC));        <<00.04>>01400000
          IF < THEN ERRMESSAGE(LOGFILE,FSERR);                 <<00.04>>01402000
          IF REC = CONTROLLER'A THEN <<GET START/UPDATE TIMES>><<RK2MB>>01404000
          BEGIN                                                <<00.05>>01406000
               STIME:=LOGRECD(STARTIME);  <<START TIME>>       <<00.05>>01408000
               UTIME:=LOGRECD(LASTIME);   <<LAST UPDATE>>      <<00.05>>01410000
               DELAY:=LOGREC(DELAYLOC);   <<TIMING INTERVAL>>  <<00.05>>01412000
          END;                                                 <<00.05>>01414000
          FTIME:=LOGRECD(FERRTIME);                            <<00.04>>01416000
          LTIME:=LOGRECD(LERRTIME);                            <<00.04>>01418000
          FTIME1.(0:1):=0;  <<FOR DATE COMPARISON (> 0D)>>     <<00.04>>01420000
          LTIME1.(0:1):=0;  <<FOR DATE COMPARISON (> 0D)>>     <<00.04>>01422000
          ERRTIME1:=IF FTIME = 0D THEN ERRTIME1 ELSE           <<00.04>>01424000
                    IF ERRTIME1=0D THEN LOGRECD(FERRTIME) ELSE <<00.04>>01426000
                    IF ERRTIME1 < LOGRECD(FERRTIME) THEN       <<00.05>>01428000
                    LOGRECD(FERRTIME) ELSE ERRTIME1;           <<00.05>>01430000
          ERRTIME2:=IF LTIME = 0D THEN ERRTIME2 ELSE           <<00.05>>01432000
                    IF ERRTIME2=0D THEN LOGRECD(LERRTIME) ELSE <<00.05>>01434000
                    IF ERRTIME2 > LOGRECD(LERRTIME) THEN       <<00.05>>01436000
                    LOGRECD(LERRTIME) ELSE ERRTIME2;           <<00.05>>01438000
     END;                                                      <<00.04>>01440000
END << GETIMEINFO >>;                                          <<00.04>>01442000
                                                               <<00.04>>01444000
PROCEDURE FILL'DATE'TIME(DATETIME,LOC);                        <<00.04>>01446000
VALUE DATETIME,LOC;                                            <<00.04>>01448000
DOUBLE DATETIME;                                               <<00.04>>01450000
INTEGER LOC;                                                   <<00.04>>01452000
BEGIN                                                                   01454000
                                                               <<00.04>>01456000
                                                                        01458000
     INTEGER                                                            01460000
          DATE  = DATETIME,                                             01462000
          TIME  = DATETIME + 1;                                         01464000
                                                                        01466000
     INTEGER M,D,Y;                                                     01468000
     INTEGER ARRAY DTAB(0:11)=PB:=                                      01470000
            0,  31,  59,  90, 120, 151, 181,                            01472000
          212, 243, 273, 304, 334;                                      01474000
                                                                        01476000
                                                               <<00.04>>01478000
     MOVE PBUF(LOC):="DATE:   /  /     TIME:   :0     ";                01480000
     << FILL DATE >>                                                    01482000
     Y:=DATE.(0:7);                                                     01484000
     D:=DATE.(7:9);                                                     01486000
     IF Y.(14:2) = 0 AND D >= 60 THEN D:=D-1;  <<LEAP YEAR>>            01488000
     M:=12;  <<ASSUME DECEMBER>>                                        01490000
     DO  M:=M-1 UNTIL DTAB(M) < D;  <<FIND CORRECT MONTH>>              01492000
     D:=D-DTAB(M);  <<DAY OF THE MONTH>>                                01494000
     M:=M+1;  <<FIX MONTH FOR OUTPUT PURPOSES>>                         01496000
     ASCII(M,-10,PBUF(LOC+7));                                          01498000
     ASCII(D,-10,PBUF(LOC+10));                                         01500000
     ASCII(Y,-10,PBUF(LOC+13));                                         01502000
     << FILL TIME OF DAY INFORMATION>>                                  01504000
     ASCII(TIME.(0:8),-10,PBUF(LOC+24));                                01506000
     ASCII(TIME.(8:8),-10,PBUF(LOC+27));                                01508000
     FWRITE(OUTFNUM,WPBUF,-50,0);                              <<01.01>>01510000
END << FILL'DATE'TIME >>;                                               01512000
                                                                        01514000
PROCEDURE OPEN'FILES;                                                   01516000
BEGIN                                                                   01518000
     MOVE FNAME:="MEMLOG.PUB.SYS ";                                     01520000
     LOGFNUM:=FOPEN(FNAME,FOPTIONS,%744,RECSIZE,,,,,,,,,FILECODE);      01522000
     IF <> THEN ERRMESSAGE(LOGFILE,FSERR);                              01524000
     MOVE FNAME:="OUT ";                                                01526000
     OUTFNUM:=FOPEN(FNAME,%414,%1); <<FOPT:CCTL,$STDLIST,ASCII;AOPT:WR>>01528000
     IF <> THEN ERRMESSAGE(OUTFILE,FSERR);                              01530000
END << OPEN'FILES >>;                                                   01532000
                                                                        01534000
PROCEDURE PRINT'TIMES;                                         <<00.01>>01536000
BEGIN                                                          <<00.01>>01538000
     INTEGER H,M;                                              <<00.05>>01540000
                                                               <<00.02>>01542000
     PRINTIMES:=FALSE;  <<PRINT TIME INFO ONLY ONCE>>          <<00.01>>01544000
     MOVE PBUF:="LOGGING STARTED    - ";                       <<00.01>>01546000
     FILL'DATE'TIME(STIME,21);  <<LOG START TIME>>             <<00.05>>01548000
     IF ERRTIME1 <> 0D THEN  <<AT LEAST ONE ERROR>>            <<00.04>>01550000
     BEGIN                                                     <<00.01>>01552000
          MOVE PBUF:="FIRST ERROR LOGGED - ";                  <<00.01>>01554000
          FILL'DATE'TIME(ERRTIME1,21);                         <<00.04>>01556000
          MOVE PBUF:="LAST ERROR LOGGED  - ";                  <<00.01>>01558000
          FILL'DATE'TIME(ERRTIME2,21);                         <<00.04>>01560000
     END;                                                      <<00.01>>01562000
     MOVE PBUF:="LAST LOG UPDATE    - ";                       <<00.01>>01564000
     FILL'DATE'TIME(UTIME,21);  <<LAST UPDATE TIME>>           <<00.05>>01566000
     MOVE PBUF:="TIMING INTERVAL    -  0:00:00 ";              <<00.01>>01568000
                                                               <<00.05>>01570000
     H:=DELAY/3600;          <<HOURS >>                        <<00.01>>01572000
     DELAY:=DELAY-(H * 3600);                                  <<00.01>>01574000
     M:=DELAY/60;            <<MINUTES>>                       <<00.01>>01576000
     DELAY:=DELAY-(M * 60);  <<SECONDS>>                       <<00.01>>01578000
     ASCII(H,-10,PBUF(22));                                    <<00.01>>01580000
     ASCII(M,-10,PBUF(25));                                    <<00.01>>01582000
     ASCII(DELAY,-10,PBUF(28));                                <<00.01>>01584000
     FWRITE(OUTFNUM,WPBUF,-29,0);                              <<01.01>>01586000
     SPACE(2);  <<DOUBLE SPACE OUTPUT DEVICE>>                 <<00.01>>01588000
END <<PRINT'TIMES>>;                                           <<00.01>>01590000
                                                               <<00.01>>01592000
PROCEDURE PRINT'HEADING;                                                01594000
BEGIN                                                                   01596000
                                                                        01598000
     MOVE PBUF:=HEAD3,(62);                                             01600000
     FWRITE(OUTFNUM,WPBUF,-62,0);                              <<01.01>>01602000
     IF RAMS'ARE'16K THEN                                      <<RK2MB>>01604000
     MOVE PBUF:=HEAD1'16K,(62) ELSE                            <<RK2MB>>01606000
     MOVE PBUF:=HEAD1,(62);                                             01608000
     FWRITE(OUTFNUM,WPBUF,-62,0);                              <<01.01>>01610000
     MOVE PBUF:=HEAD4,(62);                                             01612000
     FWRITE(OUTFNUM,WPBUF,-62,0);                              <<01.01>>01614000
     IF RAMS'ARE'16K THEN                                      <<RK2MB>>01616000
     MOVE PBUF:=HEAD2'16K,(62) ELSE                            <<RK2MB>>01618000
     MOVE PBUF:=HEAD2,(62);                                             01620000
     FWRITE(OUTFNUM,WPBUF,-62,0);                              <<01.01>>01622000
     MOVE PBUF:=HEAD3,(62);                                             01624000
     FWRITE(OUTFNUM,WPBUF,-62,0);                              <<01.01>>01626000
     PBUF:=" "; MOVE PBUF(1):=PBUF,(71);                                01628000
     IF RAMS'ARE'16K THEN                                      <<RK2MB>>01630000
     PBUF:=PBUF(16):=PBUF(24):=PBUF(30):=PBUF(53):=PBUF(61):="I" <<2MB>>01632000
     ELSE                                                      <<RK2MB>>01634000
     PBUF:=PBUF(9):=PBUF(17):=PBUF(23):=PBUF(53):=PBUF(61):="I";        01636000
END <<PRINT'HEADING>>;                                                  01638000
$PAGE                                                          <<03020>>01640000
PROCEDURE PRINT'HEAD'ICF55;                                    <<03020>>01642000
BEGIN COMMENT                                                  <<03020>>01644000
  PRINT'HEAD'ICF55 is, as its name suggests, analogous to  the <<03020>>01646000
PRINT'HEADING procedure, but for the ICF55. It has been made a <<03020>>01648000
separate procedure because all the record lengths and spacings <<03020>>01650000
are  different,  and I felt that this was more straightforward <<03020>>01652000
than including a bunch of special-case code in PRINT'HEADING.  <<03020>>01654000
;                                                              <<03020>>01656000
MOVE PBUF := HEAD3, (47);   << "--------...---------------" >> <<03020>>01658000
FWRITE (OUTFNUM, WPBUF, -47, 0);                               <<03020>>01660000
                                                               <<03020>>01662000
MOVE PBUF := "I    ADDRESS   I      ERROR TYPE      I ERROR I";<<03020>>01664000
                                                                        01666000
FWRITE (OUTFNUM, WPBUF, -47, 0);                               <<03020>>01668000
                                                               <<03020>>01670000
MOVE PBUF := HEAD4(15), (47);                                  <<03020>>01672000
FWRITE (OUTFNUM, WPBUF, -47, 0);                               <<03020>>01674000
                                                               <<03020>>01676000
MOVE PBUF := "I BOARD I WORD I  TYPE   BIT   CHIP   I COUNT I";<<03020>>01678000
FWRITE (OUTFNUM, WPBUF, -47, 0);                               <<03020>>01680000
                                                               <<03020>>01682000
MOVE PBUF := HEAD3, (47);                                      <<03020>>01684000
FWRITE (OUTFNUM, WPBUF, -47, 0);                               <<03020>>01686000
END;   << of PRINT'HEAD'ICF55.                              >> <<03020>>01688000
$PAGE                                                          <<03020>>01690000
PROCEDURE PRINT'LOGREC(MEMREC);                                         01692000
VALUE MEMREC; INTEGER MEMREC;                                           01694000
BEGIN                                                                   01696000
                                                               <<00.01>>01698000
     BYTE ARRAY DATAERR(0:1)=PB:=    "DATA                     ";       01700000
     BYTE ARRAY CHECKERR(0:1)=PB:=   "CHECK                    ";       01702000
     BYTE ARRAY MULTIPLERR(0:1)=PB:= "MULTIPLE BIT ERROR       ";       01704000
     BYTE ARRAY CLOCKERR(0:1)=PB:=   "READ CLOCK FAILURE       ";       01706000
     BYTE ARRAY DRIVERR(0:1)=PB:=    "I/O DRIVER FAULT         ";       01708000
     BYTE ARRAY LOGSYSERR(0:1)=PB:=  "LOGGING SYSTEM ERROR     ";       01710000
                                                                        01712000
     ERRCNT:=0;                                                         01714000
     IF MEMREC = 0 THEN  <<FIRST RECORD - PRINT TIME STAMP>>            01716000
     IF LOGRECD(STARTIME) = 0D THEN  <<NULL LOG>>                       01718000
     BEGIN                                                              01720000
          MOVE PBUF:="* NO ENTRIES IN MEMLOG FILE *";                   01722000
          FWRITE(OUTFNUM,WPBUF,-29,0);                         <<01.01>>01724000
          REC:=CONTROLLER'B;  << STOP OUTER BLOCK LOOP >>      <<RK2MB>>01726000
          ERRORCOUNT:=-1;  <<FOR CLEANUPOUTPUT PROCEDURE>>     <<00.01>>01728000
     END;                                                      <<00.01>>01730000
     IF LOGRECD(STARTIME) = 0D THEN RETURN;  <<NULL RECORD>>            01732000
     FOR I:=0 UNTIL 1023 DO                                             01734000
     IF LOGREC(I) <> 0 THEN  <<ERROR OCCURRED AT ADDRESS I>>            01736000
     BEGIN                                                              01738000
          ERRCNT:=ERRCNT+1;                                             01740000
          ERRORCOUNT:=ERRORCOUNT+1;  <<BOTH CONTROLLERS>>      <<RK2MB>>01742000
     END;                                                               01744000
     IF ERRCNT <> 0 THEN  <<ERRORS LOGGED>>                             01746000
     BEGIN                                                              01748000
          IF PRINTIMES THEN PRINT'TIMES;                       <<00.01>>01750000
          OLDBANK:=OLDBOARD:=OLDROW:=-1;                                01752000
          FOR I:=0 UNTIL 1023 DO                                        01754000
          BEGIN                                                         01756000
               IF LOGREC(I) <> 0 THEN  <<ERRORS OCCURRED>>              01758000
               BEGIN                                                    01760000
                    IF HEADING THEN                                     01762000
                    BEGIN                                               01764000
                         HEADING:=FALSE;                                01766000
                         PRINT'HEADING;                                 01768000
                    END;                                                01770000
                    IF (BOARD:=I.(6:2)) <> OLDBOARD THEN                01772000
                    BEGIN                                               01774000
                         OLDBOARD:=BOARD;                               01776000
                         BANK:=(BOARD & LSR(1)) + (MEMREC & LSL(1));    01778000
                         IF BANK <> OLDBANK THEN                        01780000
                         BEGIN                                          01782000
                              OLDBANK:=BANK;                            01784000
                              MOVE PBUF(2):="BANK  ";                   01786000
                              ASCII(BANK,10,PBUF(7));                   01788000
                         END ELSE                                       01790000
                         MOVE PBUF(2):="      ";  <<BLANK BANK NO.>>    01792000
                         MOVE PBUF(13):="32K";                          01794000
                         PBUF(12):=IF LOGICAL(BOARD) THEN "U" ELSE "L"; 01796000
                    END ELSE                                            01798000
                    BEGIN                                               01800000
                         MOVE PBUF(2):="      ";  <<BLANK BANK NUMBER>> 01802000
                         MOVE PBUF(12):="    ";  <<BLANK 32K NUMBER>>   01804000
                    END;                                                01806000
                    ROW:=I.(8:3);                                       01808000
                    FAULT:=FAULTS(I.(11:5));                            01810000
                    IF (0<=FAULT<=20) THEN  <<DATA/CHECK BIT ERROR>>    01812000
                    BEGIN                                               01814000
                         IF (0<=FAULT<=16) THEN  <<DATA/CHECK A ERROR>> 01816000
                         BEGIN                                          01818000
                              CHIP:=DATAB((FAULT*ROWNUM)+ROW);          01820000
                              IF FAULT = 16 THEN  <<CHECK BIT A>>       01822000
                              BEGIN                                     01824000
                                   MOVE PBUF(26):=CHECKERR,(25);        01826000
                                   PBUF(35):="A";                       01828000
                              END ELSE                                  01830000
                              BEGIN                                     01832000
                                   MOVE PBUF(26):=DATAERR,(25);         01834000
                                   ASCII(FAULT,-10,PBUF(35));           01836000
                              END;                                      01838000
                         END ELSE  <<CHECK BITS B,C,D, OR E>>           01840000
                         BEGIN                                          01842000
                              CHECKBIT:=FAULT-17;                       01844000
                              CHIP:=CHECKB((I.(6:5)*CHECKNUM)+CHECKBIT);01846000
                              MOVE PBUF(26):=CHECKERR,(25);             01848000
                              PBUF(35):=(FAULT-16) + %101;  <<ASCII>>   01850000
                         END;                                           01852000
                         IF (0<=FAULT<=16) THEN                         01854000
                         MOVE PBUF(40):="SMA" ELSE                      01856000
                         MOVE PBUF(40):="FCA";                          01858000
                         PBUF(47):="U";                                 01860000
                         ASCII(CHIP,10,PBUF(48));                       01862000
                    END ELSE                                            01864000
                    CASE * (FAULT-21) OF                                01866000
                    BEGIN                                               01868000
                         MOVE PBUF(26):=MULTIPLERR,(25);                01870000
                         MOVE PBUF(26):=CLOCKERR,(25);                  01872000
                         MOVE PBUF(26):=DRIVERR,(25);                   01874000
                         MOVE PBUF(26):=LOGSYSERR,(25);                 01876000
                    END  <<CASE STATEMENT>>;                            01878000
                    MOVE PBUF(19):="   ";  <<BLANK ROW NUMBER>>         01880000
                    MOVE PBUF(55):="    "; <<BLANK ERROR COUNT>>        01882000
                    ASCII(ROW,-10,PBUF(21));                            01884000
                    ASCII(LOGREC(I),-10,PBUF(59));                      01886000
                    FWRITE(OUTFNUM,WPBUF,-62,0);               <<01.01>>01888000
                    IF (LINECNT:=LINECNT+1) = LINEMAX THEN              01890000
                    BEGIN                                               01892000
                         LINECNT:=0;                                    01894000
                         MOVE PBUF:=HEAD3,(62);                         01896000
                         FWRITE(OUTFNUM,WPBUF,-62,%61);        <<01.01>>01898000
                         HEADING:=TRUE;                                 01900000
                         OLDBANK:=OLDBOARD:=-1;                         01902000
                    END;                                                01904000
               END;                                                     01906000
          END;                                                          01908000
     END;                                                               01910000
END  << PRINT'LOGREC >>;                                                01912000
LOGICAL PROCEDURE ODD'PARITY(I);                               <<01397>>01914000
 VALUE I;                                                      <<01397>>01916000
 LOGICAL I;                                                    <<01397>>01918000
 BEGIN;                                                        <<01397>>01920000
  TOS := I;                                                    <<01397>>01922000
  ASSEMBLE(  DUP;                                              <<01397>>01924000
             CSR  4;                                           <<01397>>01926000
             XOR,DUP;                                          <<01397>>01928000
             CSR  2;                                           <<01397>>01930000
             XOR,DUP;                                          <<01397>>01932000
             CSR 1;                                            <<01397>>01934000
             XOR,DUP;                                          <<01397>>01936000
             CSR 8;                                            <<01397>>01938000
             XOR;);                                            <<01397>>01940000
  ODD'PARITY := TOS;                                           <<01397>>01942000
 END;                                                          <<01397>>01944000
                                                               <<RK2MB>>01946000
PROCEDURE PRINT'LOGREC'16K(MEMREC);                            <<RK2MB>>01948000
VALUE MEMREC; INTEGER MEMREC;                                           01950000
BEGIN                                                                   01952000
                                                                        01954000
     EQUATE MULTIPLE'BIT'ERR = 22;                             <<01397>>01956000
     EQUATE LOG'SYS'ERR = 25;                                  <<02017>>01958000
                                                               <<01397>>01960000
      INTEGER PRONTO'FAULT;                                    <<01397>>01962000
     BYTE ARRAY DATAERR(0:1)=PB:=    "DATA                ";            01964000
     BYTE ARRAY CHECKERR(0:1)=PB:=   "CHECK               ";            01966000
     BYTE ARRAY MULTIPLERR(0:1)=PB:= "MULTIPLE BIT ERROR  ";            01968000
     BYTE ARRAY DEWERR(0:1)=PB:=     "FORCED D.E.W.       ";            01970000
     BYTE ARRAY NOBOARDERR(0:1)=PB:= "MISSING ARRAY BOARD ";            01972000
     BYTE ARRAY LOGSYSERR(0:1)=PB:=  "LOGGING SYSTEM ERROR";            01974000
     INTEGER ARRAY MLA'HIGH'ADR(0:4)=PB :=                     <<01397>>01976000
                    1023,1023,4095,1023,4095;                  <<01397>>01978000
                                                                        01980000
     ERRCNT:=0;                                                         01982000
     IF MEMREC = 0 THEN  <<FIRST RECORD - PRINT TIME STAMP>>            01984000
     IF LOGRECD(STARTIME) = 0D THEN  <<NULL LOG>>                       01986000
     BEGIN                                                              01988000
          MOVE PBUF:="* NO ENTRIES IN MEMLOG FILE *";                   01990000
          FWRITE(OUTFNUM,WPBUF,-29,0);                                  01992000
          REC:=CONTROLLER'B;  << STOP OUTER BLOCK LOOP >>               01994000
          ERRORCOUNT:=-1;  <<FOR CLEANUPOUTPUT PROCEDURE>>              01996000
     END;                                                               01998000
     IF LOGRECD(STARTIME) = 0D THEN RETURN;  <<NULL RECORD>>            02000000
     FOR I:=0 UNTIL MLA'HIGH'ADR(CPU'TYPE)  DO                 <<01397>>02002000
     IF LOGREC(I) <> 0 THEN  <<ERROR OCCURRED AT ADDRESS I>>            02004000
     BEGIN                                                              02006000
          ERRCNT:=ERRCNT+1;                                             02008000
          ERRORCOUNT:=ERRORCOUNT+1;  <<CONTROLLER A AND B >>            02010000
     END;                                                               02012000
     IF ERRCNT <> 0 THEN  <<ERRORS LOGGED>>                             02014000
     BEGIN                                                              02016000
          IF PRINTIMES THEN PRINT'TIMES;                                02018000
          OLDCONTROLLER:=OLDBOARD:=OLDROW:=-1;                          02020000
          FOR I:=0 UNTIL MLA'HIGH'ADR(CPU'TYPE)  DO            <<01397>>02022000
          BEGIN                                                         02024000
               IF LOGREC(I) <> 0 THEN  <<ERRORS OCCURRED>>              02026000
               BEGIN                                                    02028000
                    IF HEADING THEN                                     02030000
                    BEGIN                                               02032000
                         HEADING:=FALSE;                                02034000
                         PRINT'HEADING;                                 02036000
                    END;                                                02038000
                    BOARD:=IF TP'FLAG THEN I.(6:3) ELSE I.(6:2);        02040000
                    IF PRONTO THEN   BOARD := I.(4:3);         <<01397>>02042000
                    IF BOARD <> OLDBOARD THEN                           02044000
                    BEGIN                                               02046000
                         OLDBOARD:=BOARD;                               02048000
                         ASCII(BOARD,10,PBUF(20));                      02050000
                         IF MEMREC <> OLDCONTROLLER THEN                02052000
                         BEGIN                                          02054000
                              OLDCONTROLLER:=MEMREC;                    02056000
                              MOVE PBUF(2):="CONTROLLER   ";            02058000
                              PBUF(13):=%101+MEMREC;<<A OR B>>          02060000
                         END ELSE                                       02062000
                         MOVE PBUF(2):="             ";                 02064000
                    END ELSE                                            02066000
                    BEGIN                                               02068000
                         MOVE PBUF(2):="            ";                  02070000
                         MOVE PBUF(20):="  ";<<BLANK BOARD #>>          02072000
                    END;                                                02074000
                    ROW:=IF TP'FLAG THEN I.(9:2) ELSE I.(8:3);          02076000
                    IF PRONTO THEN   ROW := I.(7:2);           <<01397>>02078000
                    FAULT:=IF TP'FLAG THEN FAULTS'TP(I.(11:5))          02080000
                           ELSE FAULTS'2MB(I.(11:5));                   02082000
                    IF PRONTO THEN                             <<01397>>02084000
                       IF ODD'PARITY(I.(9:7))                  <<01397>>02086000
                         THEN FAULT := MULTIPLE'BIT'ERR        <<01397>>02088000
                         ELSE FAULT := FAULTS'PRONTO(I.(10:6));<<01397>>02090000
                    IF PRONTO AND I.(9:7)=%177                 <<02017>>02092000
                      THEN FAULT := LOG'SYS'ERR;               <<02017>>02094000
                    PRONTO'FAULT := FAULT;                     <<01397>>02096000
                    IF (-23<=FAULT<=21) THEN <<DATA/CHK ERROR>><<01397>>02098000
                    BEGIN                                               02100000
                         IF FAULT >= 16  OR   <<CHECK BIT>>    <<01397>>02102000
                  FAULT < -16  THEN <<PRONTO C. BIT>>          <<01397>>02104000
                         BEGIN                                          02106000
                              MOVE PBUF(33):=CHECKERR,(20);             02108000
                     IF FAULT<-16 THEN FAULT:= -FAULT-1;       <<01397>>02110000
                              ASCII((FAULT-16),-10,PBUF(42));           02112000
                         END ELSE                                       02114000
                         BEGIN                                          02116000
                     IF FAULT < 0 THEN FAULT:=-FAULT+15;       <<01397>>02118000
                              MOVE PBUF(33):=DATAERR,(20);              02120000
                              ASCII(FAULT,-10,PBUF(42));                02122000
                         END;                                           02124000
                         PBUF(46):="U";                                 02126000
                         CHIP:=IF TP'FLAG THEN                          02128000
                               DATA'TP((FAULT*ROWNUM'TP)+ROW)           02130000
                          ELSE DATA'2MB((FAULT*ROWNUM)+ROW);            02132000
                    IF PRONTO THEN                             <<01397>>02134000
                      CHIP := DATA'PRONTO(PRONTO'FAULT)+ROW*2; <<01397>>02136000
                         ASCII(CHIP,10,PBUF(47));                       02138000
                    END ELSE                                            02140000
                    CASE  (FAULT-22) OF                                 02142000
                    BEGIN                                               02144000
                         MOVE PBUF(33):=MULTIPLERR,(20);                02146000
                         MOVE PBUF(33):=DEWERR,(20);                    02148000
                         MOVE PBUF(33):=NOBOARDERR,(20);                02150000
                         MOVE PBUF(33):=LOGSYSERR,(20);                 02152000
                    END  <<CASE STATEMENT>>;                            02154000
                    MOVE PBUF(26):="   ";  <<BLANK ROW NUMBER>>         02156000
                    MOVE PBUF(55):="     "; <<BLANK ERR COUNT>>         02158000
                    ASCII(ROW,-10,PBUF(27));                            02160000
                    ASCII(LOGREC(I),-10,PBUF(59));                      02162000
                    FWRITE(OUTFNUM,WPBUF,-62,0);                        02164000
                    IF (LINECNT:=LINECNT+1) = LINEMAX THEN              02166000
                    BEGIN                                               02168000
                         LINECNT:=0;                                    02170000
                         MOVE PBUF:=HEAD3,(62);                         02172000
                         FWRITE(OUTFNUM,WPBUF,-62,%61);<<EJECT>>        02174000
                         HEADING:=TRUE;                                 02176000
                         OLDCONTROLLER:=OLDBOARD:=-1;                   02178000
                    END;                                                02180000
               END;                                                     02182000
          END;                                                          02184000
     END;                                                               02186000
END; << PRINT'LOGREC'16K >>                                    <<03020>>02188000
$PAGE                                                          <<03020>>02190000
PROCEDURE PRINT'LOGREC'ICF55;                                  <<03020>>02192000
BEGIN COMMENT --                                               <<03020>>02194000
  As with PRINT'HEAD'ICF55, PRINT'LOGREC'ICF55 has been made a <<03020>>02196000
separate procedure to avoid further cluttering  of  PRINT'LOG- <<03020>>02198000
REC'16K. I at first thought to restructure PRINT'LOGREC'16K as <<03020>>02200000
a CASE statement based on CPU'TYPE. ICF55 would then be a log- <<03020>>02202000
ical extension of this construct.  The idea fell through  when <<03020>>02204000
the  display  record length was shortened from 62 to 47 bytes. <<03020>>02206000
The flow in here is similar to earlier  PRINT'LOG'REC's,  with <<03020>>02208000
allowances  for  a  different  display record length, only one <<03020>>02210000
memory controller, and such as that.                           <<03020>>02212000
;                                                              <<03020>>02214000
EQUATE                                                         <<03020>>02216000
  MULTIPLE'BIT'ERR = 22;                                       <<03020>>02218000
                                                               <<03020>>02220000
IF LOGRECD (STARTIME) = 0D THEN                                <<03020>>02222000
   BEGIN   << Null log.                                     >> <<03020>>02224000
   MOVE PBUF := "* NO ENTRIES IN MEMLOG FILE *";               <<03020>>02226000
   FWRITE (OUTFNUM, WPBUF, -29, 0);                            <<03020>>02228000
   ERRORCOUNT := -1;   << for CLEANUPOUTPUT procedure.      >> <<03020>>02230000
   RETURN;                                                     <<03020>>02232000
   END;                                                        <<03020>>02234000
FOR I := 0 UNTIL 4095 DO                                       <<03020>>02236000
  IF LOGREC(I) <> 0 THEN ERRORCOUNT := ERRORCOUNT + 1;         <<03020>>02238000
IF ERRORCOUNT <> 0 THEN                                        <<03020>>02240000
   BEGIN   << Got at least one error.                       >> <<03020>>02242000
   IF PRINTIMES THEN PRINT'TIMES;                              <<03020>>02244000
   OLDBOARD := OLD'WORD := -1;                                 <<03020>>02246000
   FOR I := 0 UNTIL 4095 DO                                    <<03020>>02248000
     IF LOGREC(I) <> 0 THEN                                    <<03020>>02250000
      BEGIN   << At least one error at this address.        >> <<03020>>02252000
      IF HEADING THEN                                          <<03020>>02254000
         BEGIN   << New page, print a new heading.          >> <<03020>>02256000
         HEADING := FALSE;                                     <<03020>>02258000
         PRINT'HEAD'ICF55;                                     <<03020>>02260000
         END;                                                  <<03020>>02262000
      PBUF := " ";  MOVE PBUF(1) := PBUF, (61);                <<03020>>02264000
      PBUF := PBUF(8) := PBUF(15) := PBUF(38) := PBUF(46)      <<03020>>02266000
        := "I";                                                <<03020>>02268000
      IF (BOARD := I.(4:3)) <> OLDBOARD THEN                   <<03020>>02270000
         BEGIN   << Board number changed, add to display.   >> <<03020>>02272000
         OLDBOARD := BOARD;   << So we don't repeat display >> <<03020>>02274000
         ASCII (BOARD, 10, PBUF(4));                           <<03020>>02276000
         END;                                                  <<03020>>02278000
      IF (WORD := I.(7:2)) <> OLD'WORD THEN                    <<03020>>02280000
         BEGIN   << Word number changed, add to display.    >> <<03020>>02282000
         OLD'WORD := WORD;   << So we don't repeat display. >> <<03020>>02284000
         ASCII (WORD, 10, PBUF(11));                           <<03020>>02286000
         END;                                                  <<03020>>02288000
      IF ODD'PARITY (I.(9:7))                                  <<03020>>02290000
        THEN FAULT := FAULTS'ICF55 (I.(10:6))                  <<03020>>02292000
        ELSE FAULT := MULTIPLE'BIT'ERR;                        <<03020>>02294000
      IF FAULT = MULTIPLE'BIT'ERR                              <<03020>>02296000
        THEN MOVE PBUF(18) := "MULTIPLE BIT ERROR"             <<03020>>02298000
        ELSE                                                   <<03020>>02300000
         BEGIN  << Single-bit error, get type, bit and chip >> <<03020>>02302000
                                                               <<03020>>02304000
<< See comments at the declaration of DATA'ICF55 for an ex- >> <<03020>>02306000
<< planation of how we arrive at the following statement.   >> <<03020>>02308000
                                                               <<03020>>02310000
         CHIP := DATA'ICF55 (FAULT) + WORD*2;                  <<03020>>02312000
         IF -23 <= FAULT <= -17                                <<03020>>02314000
           THEN                                                <<03020>>02316000
            BEGIN   << Check bit failed.                    >> <<03020>>02318000
            MOVE PBUF(18) := "CHECK";                          <<03020>>02320000
            FAULT := -FAULT - 17;                              <<03020>>02322000
            END                                                <<03020>>02324000
           ELSE                                                <<03020>>02326000
            BEGIN   << Data bit failed.                     >> <<03020>>02328000
            MOVE PBUF(18) := "DATA";                           <<03020>>02330000
            IF FAULT < 0 THEN FAULT := -FAULT + 15;            <<03020>>02332000
            END;                                               <<03020>>02334000
         ASCII (FAULT, -10, PBUF(27));                         <<03020>>02336000
         ASCII (CHIP,  -10, PBUF(35));                         <<03020>>02338000
         PBUF(31) := "U";                                      <<03020>>02340000
         ASCII (LOGREC(I), -10, PBUF(44));                     <<03020>>02342000
         FWRITE (OUTFNUM, WPBUF, -47, 0);                      <<03020>>02344000
         IF (LINECNT := LINECNT + 1) >= LINEMAX THEN           <<03020>>02346000
            BEGIN   << Time to start a new page.            >> <<03020>>02348000
            LINECNT := 0;                                      <<03020>>02350000
            MOVE PBUF := HEAD3, (47);                          <<03020>>02352000
            FWRITE (OUTFNUM, WPBUF, -47, %61);                 <<03020>>02354000
            HEADING := TRUE;                                   <<03020>>02356000
            OLDBOARD := OLD'WORD := -1;                        <<03020>>02358000
            END;   << of starting new page.                 >> <<03020>>02360000
         END;      << of single-bit error.                  >> <<03020>>02362000
      END;         << of <> 0 error count in this LOGREC(I) >> <<03020>>02364000
   END;            << of at least one error.                >> <<03020>>02366000
END;               << of PRINT'LOGREC'ICF55.                >> <<03020>>02368000
$PAGE                                                          <<03020>>02370000
PROCEDURE CLEANUPOUTPUT;                                                02372000
BEGIN                                                                   02374000
                                                               <<03020>>02376000
INTEGER                                                        <<03020>>02378000
  LENGTH;                                                      <<03020>>02380000
                                                               <<03020>>02382000
     IF ERRORCOUNT = 0 THEN  <<NO ERRORS FOUND IN ANY BANK>>            02384000
     BEGIN                                                              02386000
          PRINT'TIMES;  <<PRINT TIME INFO>>                    <<00.01>>02388000
          MOVE PBUF:="*** NO ERRORS LOGGED ***";                        02390000
          FWRITE(OUTFNUM,WPBUF,-24,0);                         <<01.01>>02392000
     END ELSE                                                           02394000
     IF ERRORCOUNT > 0 THEN  <<SOME ERRORS FOUND>>                      02396000
     BEGIN                                                              02398000
          LENGTH := IF CPU'TYPE = ICF55 THEN 47 ELSE 62;       <<03020>>02400000
          MOVE PBUF := HEAD3, (LENGTH);                        <<03020>>02402000
          FWRITE (OUTFNUM, WPBUF, -LENGTH, 0);                 <<03020>>02404000
     END;                                                               02406000
END  << CLEANUPOUTPUT >>;                                      <<00.04>>02408000
     MOVE PBUF := PTITLE,2;                                    <<01.01>>02412000
     I := TOS-@PBUF;                                           <<01.01>>02414000
     PRINT(WPBUF,-I,%60);                                      <<01.01>>02416000
                                                               <<01169>>02418000
     WHO(,CAPD);                                               <<01169>>02420000
     IF NOT SYSMGR THEN                                        <<01169>>02422000
       BEGIN                                                   <<01169>>02424000
       MOVE PBUF := SYSMGR'MSG,2;                              <<01169>>02426000
       I := TOS - @PBUF;                                       <<01169>>02428000
       PRINT(WPBUF,-I,0);                                      <<01169>>02430000
       TERMINATE;                                              <<01169>>02432000
       END;                                                    <<01169>>02434000
     OPEN'FILES;                                               <<00.03>>02436000
     FLOCK(LOGFNUM,1);                                                  02438000
     IF < THEN ERRMESSAGE(LOGFILE,1);                                   02440000
     GETIMEINFO;                                               <<00.04>>02442000
     FOR REC:=CONTROLLER'A UNTIL CONTROLLER'B DO               <<RK2MB>>02444000
     BEGIN                                                              02446000
          FREADDIR(LOGFNUM,LOGREC,RECSIZE,DOUBLE(REC));                 02448000
          IF < THEN ERRMESSAGE(LOGFILE,FSERR);                          02450000
          BANKS:=LOGREC(BANKNUMB);                                      02452000
     CPU'TYPE := THISCPU;                                      <<02017>>02454000
     IF CPU'TYPE = 2 OR CPU'TYPE = 4                           <<03020>>02456000
       THEN                                                    <<02017>>02458000
        BEGIN                                                  <<02017>>02460000
         IF BANKNUM >= NEXT'CONTROLLER (4)                     <<03020>>02462000
          THEN TOS := %4000000D                                <<02017>>02464000
          ELSE TOS := %0D;                                     <<02017>>02466000
         MCS;                                                  <<02017>>02468000
         MCS'STATUS := TOS;  << SAVE STATUS RETURNED BY MCS >> <<02017>>02470000
         IF 8<=MCS'STATUS.(12:4)<=9 THEN CPU'TYPE:=4 <<PRONTO>><<02017>>02472000
          ELSE CPU'TYPE := 2;  << AMIGO MEMORY >>              <<02017>>02474000
         ASSEMBLE(DDEL;);                                      <<02017>>02476000
        END;                                                   <<02017>>02478000
          IF CPU'TYPE = ICF55                                  <<03020>>02480000
            THEN PRINT'LOGREC'ICF55                            <<03020>>02482000
            ELSE                                               <<03020>>02484000
          IF RAMS'ARE'16K THEN                                 <<RK2MB>>02486000
          PRINT'LOGREC'16K(REC) ELSE                           <<RK2MB>>02488000
          PRINT'LOGREC(REC);                                            02490000
          IF PARM = 1 THEN  <<RESET LOGGING INFO>>                      02492000
          BEGIN                                                         02494000
               LOGRECD(STARTIME):=0D;  <<FOR LOGGING PROCESS>>          02496000
               FOR I:=0 UNTIL (RECSIZE-1) DO LOGREC(I):=0;              02498000
               FWRITEDIR(LOGFNUM,LOGREC,RECSIZE,DOUBLE(REC));           02500000
               IF < THEN ERRMESSAGE(LOGFILE,FSERR);                     02502000
          END;                                                          02504000
          IF BANKS < NEXT'CONTROLLER(CPU'TYPE) THEN            <<RK2MB>>02506000
             REC:=CONTROLLER'B;                                <<RK2MB>>02508000
          IF PRONTO AND NOT PRONTO'2NDCNTLR <<ONLY ONE CNTLR>> <<01397>>02510000
             THEN REC:=CONTROLLER'B;                           <<01397>>02512000
     END;                                                               02514000
     FUNLOCK(LOGFNUM);                                                  02516000
     IF < THEN ERRMESSAGE(LOGFILE,2);                                   02518000
     CLEANUPOUTPUT;                                                     02520000
END.                                                                    02524000
