$CONTROL MAP,CODE,USLINIT                                               00010000
<< ININ -- MODULE 10 >>                                        <<1040>> 00012000
<<HP32033C 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
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$CONTROL MAIN=ININ                                                      00030000
$TP                                                                     00032000
BEGIN                                                                   00034000
<<                                                                      00036000
                                                                        00038000
      INTERNAL INTERRUPT SEGMENT                                        00040000
                                                                        00042000
>>                                                                      00044000
                                                                        00046000
DEFINE  ASMB = ASSEMBLE#,                                               00048000
        CC   = (6:2)#,                                                  00050000
        F = ABSOLUTE#,                                                  00052000
        ABS=ABSOLUTE#,                                         <<01809>>00054000
        PDISABLE=ASMB(PSDB)#,                                  <<MPEIV>>00056000
        PENABLE=ASMB(PSEB)#,                                   <<MPEIV>>00058000
        INIT = CON %20302;CON 6#,                                       00060000
        DISABLE = ASMB( SED 0 )#,                                       00062000
        ENABLE = ASMB( SED 1 )#,                                        00064000
        LMEM = ASMB( LSEA )#,                                  <<1040>> 00066000
        RCCR = CON %20104;CON 0#,                                       00068000
        SCLR = CON %20104;CON 1#,                                       00070000
        TON  = CON %20104;CON 3#,                                       00072000
        SINC = CON %20104;CON %10#,                                     00074000
        CBKP = CON %36160#;                                             00076000
DEFINE  TRAPSOFF = PUSH(STATUS);                               <<01858>>00078000
                   TOS.(2:1) := 0;                             <<01858>>00080000
                   SET(STATUS)#;                               <<01858>>00082000
$INCLUDE INCLMEAS                                              <<MPEIV>>00084000
                                                                        00086000
$INCLUDE INCLMIFT                                              <<04106>>00088000
EQUATE  PCBSIZE = 16,                                                   00090000
        PXGLOBSIZE=8,                                          <<01809>>00092000
        CCE  = 2,                                                       00094000
        CCG  = 0,                                                       00096000
        CCL  = 1,                                                       00098000
        CPCB = 4,                                                       00100000
        IFLAGMASKWORD = %100177, <<WORD USED TO CLEAR>>        <<03008>>00102000
                                 <<DESIRED FLAGS>>             <<03008>>00104000
                                 << OF IFLAG OF ILT ON POWER UP >>      00106000
        PCBB = 3,                                                       00110000
        DSTB = 2,                                              <<1040>> 00112000
        SYSTRL = %1012,                                                 00114000
        SYSDB  = %1000,                                                 00116000
        TRACELABEL = %1257,                                             00118000
        QI = 5,                                                         00120000
        ZI = 6;                                                         00122000
$INCLUDE INCLICS                                               <<MPEIV>>00124000
                                                               <<MPEIV>>00126000
                                                                        00128000
INTEGER  X = X,                                                         00130000
         P = Q-2,     << STACK MARKER P VALUE >>                        00132000
         DELTAQ = Q+0,                                                  00134000
         STATUS = Q-1,<< STACK MARKER STATUS >>                         00136000
         PARAM = Q+1; << INTERRUPT PARAMETER >>                         00138000
                                                               <<1040>> 00140000
INTEGER POINTER DSTI' = DSTB;                                  <<1040>> 00142000
                                                                        00144000
EQUATE ICS'QI=5;                                               <<MPEIV>>00146000
EQUATE SYSBASE=%1000,                                          <<MPEIV>>00148000
       SLIX=1,                                                 <<MPEIV>>00150000
       SYSXL=SYSBASE+SLIX,                                     <<MPEIV>>00152000
       DSTIX=2,                                                <<MPEIV>>00154000
       SYSDST=SYSBASE+DSTIX,                                   <<MPEIV>>00156000
       PCBIX=3,                                                <<MPEIV>>00158000
       SYSPCB=SYSBASE+PCBIX,                                   <<MPEIV>>00160000
       DFCIX=%32,                                              <<MPEIV>>00162000
       SYSDFC=SYSBASE+DFCIX,                                   <<MPEIV>>00164000
       ICSIX=7,                                                <<MPEIV>>00166000
       SYSICS=SYSBASE+ICSIX,                                   <<MPEIV>>00168000
       CSTXBLKIX=%51,                                          <<MPEIV>>00170000
       SYSCSTXBLK=SYSBASE+CSTXBLKIX,                           <<MPEIV>>00172000
       SYSWAITTODISPMSG=%1053;                                 <<MPEIV>>00174000
                                                               <<MPEIV>>00176000
DEFINE MEMTRAPFLAG=(4:1)#;                                     <<MPEIV>>00178000
                                                               <<MPEIV>>00180000
<<SYSTEM TABLE PTRS FOR LST ACCESS>>                           <<MPEIV>>00182000
                                                               <<MPEIV>>00184000
INTEGER POINTER DST=DSTIX,                                     <<MPEIV>>00186000
                PCB=PCBIX,                                     <<MPEIV>>00188000
                CSTXBLK=CSTXBLKIX,                             <<MPEIV>>00190000
               ICS=ICSIX;                                      <<MPEIV>>00192000
                                                               <<MPEIV>>00194000
INTEGER DSTSYSBASEINX=DB+DSTIX,                                <<MPEIV>>00196000
        SLSYSBASEINX=DB+SLIX,                                  <<MPEIV>>00198000
                DFC=DB+DFCIX;                                  <<MPEIV>>00200000
$INCLUDE INCLST                                                <<MPEIV>>00202000
$INCLUDE INCLPCB                                               <<MPEIV>>00204000
                                                               <<MPEIV>>00206000
<<WAIT/AWAKE PARAMETER DEFINITIONS>>                           <<MPEIV>>00208000
EQUATE NOINFO=0,                                               <<MPEIV>>00210000
       MEMORYWAITCODE=%10000,                                  <<MPEIV>>00212000
       JUNKWAITCODE=%20,                                       <<MPEIV>>00214000
       MEMORYTRAP=%4000,                                       <<MPEIV>>00216000
       NOWAIT=0;                                               <<MPEIV>>00218000
                                                               <<MPEIV>>00220000
$INCLUDE INCLMSG                                               <<MPEIV>>00222000
                                                               <<MPEIV>>00224000
                                                               <<MPEIV>>00226000
<<SEGMENT IDENTIFIER FORMAT>>                                  <<MPEIV>>00228000
                                                               <<MPEIV>>00230000
EQUATE SEGIDDATATYPE=0,                                        <<MPEIV>>00232000
       SEGIDSLTYPE=1;  <<PROGRAM TYPE =2 OR 3>>                <<MPEIV>>00234000
DEFINE SEGIDTYPEFIELD=(0:2)#,                                  <<MPEIV>>00236000
       SEGIDPBXFLAG=(0:1)#,                                    <<MPEIV>>00238000
       SEGIDPBXFIELD=(1:7)#,                                   <<MPEIV>>00240000
       SEGIDLOGSEGFIELD=(8:8)#;                                <<MPEIV>>00242000
DEFINE SETALLOCFLAG=(8:1)#;                                    <<MPEIV>>00244000
EQUATE UNCALLABLEBIT=1;                                        <<MPEIV>>00246000
PROCEDURE  ABORT(MODE,CODE,PARAM);                                      00248000
   VALUE MODE,CODE,PARAM;                                               00250000
   LOGICAL MODE,CODE,PARAM;                                             00252000
   OPTION EXTERNAL;                                                     00254000
                                                                        00256000
PROCEDURE ABORTPROC(PROCINX,ABORTCODE);                        <<MPEIV>>00258000
VALUE PROCINX,ABORTCODE;                                       <<MPEIV>>00260000
INTEGER PROCINX,ABORTCODE;                                     <<MPEIV>>00262000
OPTION EXTERNAL;                                               <<MPEIV>>00264000
                                                               <<MPEIV>>00266000
PROCEDURE WAIT(EVENTTYPE,SPECIALINFO);                         <<MPEIV>>00268000
VALUE EVENTTYPE,SPECIALINFO;                                   <<MPEIV>>00270000
INTEGER EVENTTYPE,SPECIALINFO;                                 <<MPEIV>>00272000
OPTION EXTERNAL;                                               <<MPEIV>>00274000
                                                               <<MPEIV>>00276000
PROCEDURE QUEUEONSEGMENT(SEGIDENTIFIER);                       <<MPEIV>>00278000
VALUE SEGIDENTIFIER;                                           <<MPEIV>>00280000
INTEGER SEGIDENTIFIER;                                         <<MPEIV>>00282000
OPTION EXTERNAL;                                               <<MPEIV>>00284000
                                                               <<MPEIV>>00286000
PROCEDURE SET'PSIF(PCBPT,FLAGS);                               <<MPEIV>>00288000
VALUE PCBPT,FLAGS;                                             <<MPEIV>>00290000
INTEGER PCBPT,FLAGS;                                           <<MPEIV>>00292000
OPTION EXTERNAL;                                               <<MPEIV>>00294000
                                                               <<MPEIV>>00296000
PROCEDURE RECOVEROC(SEGIDENTIFIER,DESCSTINX);                  <<MPEIV>>00298000
VALUE SEGIDENTIFIER,DESCSTINX;                                 <<MPEIV>>00300000
INTEGER SEGIDENTIFIER,DESCSTINX;                               <<MPEIV>>00302000
OPTION EXTERNAL;                                               <<MPEIV>>00304000
                                                               <<MPEIV>>00306000
                                                               <<MPEIV>>00308000
PROCEDURE GETDATASEGCHANGESTATE(SEGNUM);                       <<MPEIV>>00310000
VALUE SEGNUM;                                                  <<MPEIV>>00312000
INTEGER SEGNUM;                                                <<MPEIV>>00314000
OPTION EXTERNAL;                                               <<MPEIV>>00316000
                                                               <<MPEIV>>00318000
                                                               <<MPEIV>>00320000
PROCEDURE GENSPECREQ(DSTNUM,NEWSIZE,READDISP,MOVELENGTH);      <<MPEIV>>00322000
VALUE DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                      <<MPEIV>>00324000
INTEGER DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                    <<MPEIV>>00326000
OPTION EXTERNAL;                                               <<MPEIV>>00328000
                                                               <<MPEIV>>00330000
PROCEDURE SENDMSG(DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS);        <<MPEIV>>00332000
VALUE DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS;                     <<MPEIV>>00334000
INTEGER DESTPIN,DESTPORTNUM,MSGLENGTH;                         <<MPEIV>>00336000
LOGICAL FLAGS;                                                 <<MPEIV>>00338000
OPTION EXTERNAL;                                               <<MPEIV>>00340000
INTEGER PROCEDURE BUILDSEGID(SEGTYPE,SEGNUMBER,PIN);           <<MPEIV>>00342000
VALUE SEGTYPE,SEGNUMBER,PIN;                                   <<MPEIV>>00344000
INTEGER SEGTYPE,SEGNUMBER,PIN;                                 <<MPEIV>>00346000
OPTION EXTERNAL;                                               <<MPEIV>>00348000
                                                               <<MPEIV>>00350000
INTEGER PROCEDURE CONVSEGIDTOSTINX(SEGIDENTIFIER);             <<MPEIV>>00352000
VALUE SEGIDENTIFIER;                                           <<MPEIV>>00354000
LOGICAL SEGIDENTIFIER;                                         <<MPEIV>>00356000
OPTION EXTERNAL;                                               <<MPEIV>>00358000
                                                               <<03094>>00360000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,      <<03094>>00362000
     P5,DEST,REPLY,OFFSET,DITP,IOTYPE);                        <<03094>>00364000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,              <<03094>>00366000
     OFFSET,DITP,IOTYPE;                                       <<03094>>00368000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,            <<03094>>00370000
     OFFSET,IOTYPE;                                            <<03094>>00372000
INTEGER POINTER DITP;                                          <<03094>>00374000
OPTION VARIABLE,EXTERNAL;                                      <<03094>>00376000
                                                               <<03094>>00378000
                                                               <<04184>>00380000
PROCEDURE DCU'REQUEST(MSGSTATE);                               <<04184>>00382000
VALUE MSGSTATE;                                                <<04184>>00384000
LOGICAL MSGSTATE;                                              <<04184>>00386000
OPTION EXTERNAL;                                               <<04184>>00388000
                                                               <<04184>>00390000
                                                               <<03650>>00392000
PROCEDURE LYNX'PF'CHECK;    OPTION EXTERNAL;                   <<03650>>00394000
                                                               <<03650>>00396000
PROCEDURE  AWAKE(PCBPT,N,WAITF);                                        00398000
   VALUE PCBPT,N,WAITF;                                                 00400000
   INTEGER PCBPT,N,WAITF;                                               00402000
   OPTION EXTERNAL;                                                     00404000
                                                                        00406000
PROCEDURE DELAYEDINT; OPTION EXTERNAL;                         <<03040>>00408000
                                                                        00410000
PROCEDURE  EADD; OPTION EXTERNAL;                                       00412000
                                                                        00414000
PROCEDURE  ESUB; OPTION EXTERNAL;                                       00416000
                                                                        00418000
PROCEDURE  EMPY; OPTION EXTERNAL;                                       00420000
                                                                        00422000
PROCEDURE  EDIV; OPTION EXTERNAL;                                       00424000
                                                                        00426000
PROCEDURE  ENEG; OPTION EXTERNAL;                                       00428000
                                                                        00430000
PROCEDURE  ECMP; OPTION EXTERNAL;                                       00432000
                                                                        00434000
PROCEDURE  QADD;  OPTION EXTERNAL;                                      00436000
                                                                        00438000
PROCEDURE  QSUB;  OPTION EXTERNAL;                                      00440000
                                                                        00442000
PROCEDURE  QMPY;  OPTION EXTERNAL;                                      00444000
                                                                        00446000
PROCEDURE  QDIV;  OPTION EXTERNAL;                                      00448000
                                                                        00450000
PROCEDURE  QNEG;  OPTION EXTERNAL;                                      00452000
                                                                        00454000
PROCEDURE  QCMP;  OPTION EXTERNAL;                                      00456000
                                                                        00458000
PROCEDURE  QASL;  OPTION EXTERNAL;                                      00460000
                                                                        00462000
PROCEDURE  QASR;  OPTION EXTERNAL;                                      00464000
                                                                        00466000
PROCEDURE  DIMPY; OPTION EXTERNAL;                                      00468000
                                                                        00470000
PROCEDURE  DIDIV; OPTION EXTERNAL;                                      00472000
                                                                        00474000
PROCEDURE  HELP; OPTION EXTERNAL;                                       00476000
                                                                        00478000
PROCEDURE  DMUL; OPTION EXTERNAL;                                       00480000
                                                                        00482000
PROCEDURE  CVAD; OPTION EXTERNAL;                                       00484000
                                                                        00486000
PROCEDURE  CVDA; OPTION EXTERNAL;                                       00488000
                                                                        00490000
PROCEDURE  CVBD; OPTION EXTERNAL;                                       00492000
                                                                        00494000
PROCEDURE  CVDB; OPTION EXTERNAL;                                       00496000
                                                                        00498000
PROCEDURE  SLD; OPTION EXTERNAL;                                        00500000
                                                                        00502000
PROCEDURE  NSLD; OPTION EXTERNAL;                                       00504000
                                                                        00506000
PROCEDURE  SRD; OPTION EXTERNAL;                                        00508000
                                                                        00510000
PROCEDURE  CMPD; OPTION EXTERNAL;                                       00512000
                                                                        00514000
PROCEDURE  ADDD; OPTION EXTERNAL;                                       00516000
                                                                        00518000
PROCEDURE  SUBD; OPTION EXTERNAL;                                       00520000
                                                                        00522000
PROCEDURE MPYDSIM; OPTION EXTERNAL;                                     00524000
                                                                        00526000
procedure STUNSIM; option external;                            <<01744>>00528000
                                                               <<01744>>00530000
                                                                        00532000
PROCEDURE TICK; OPTION EXTERNAL;                                        00534000
                                                                        00536000
INTEGER PROCEDURE  TESTSTOP(S,P,PINX);                                  00538000
   VALUE S,P,PINX;                                                      00540000
   INTEGER S,P,PINX;                                                    00542000
   OPTION EXTERNAL;                                                     00544000
                                                                        00546000
PROCEDURE  DEBUG; OPTION EXTERNAL;                                      00548000
                                                                        00550000
LOGICAL PROCEDURE SETSYSDB;                                             00552000
   OPTION EXTERNAL;                                                     00554000
                                                                        00556000
PROCEDURE RESETDB(IX);                                                  00558000
   VALUE IX;                                                            00560000
   INTEGER IX;                                                          00562000
   OPTION EXTERNAL;                                                     00564000
                                                                        00566000
PROCEDURE  SUDDENDEATH(A);                                              00568000
   VALUE  A;                                                            00570000
   INTEGER  A;                                                          00572000
   OPTION  EXTERNAL;                                                    00574000
                                                                        00576000
PROCEDURE IOUNFREEZE(EN,TYPE,PIN);                                      00578000
VALUE EN,TYPE,PIN;                                                      00580000
INTEGER EN,TYPE,PIN;                                                    00582000
OPTION EXTERNAL;                                                        00584000
                                                                        00586000
PROCEDURE MASTERCLEARHPIB(DITP);                               <<01301>>00588000
VALUE DITP;                                                             00590000
POINTER DITP;                                                           00592000
OPTION EXTERNAL;                                                        00594000
                                                                        00596000
PROCEDURE BCONVERT(WORD);                                               00598000
VALUE WORD;                                                             00600000
INTEGER WORD;                                                           00602000
OPTION EXTERNAL;                                                        00604000
                                                                        00606000
PROCEDURE DCONVERT(WORD);                                               00608000
VALUE WORD;                                                             00610000
INTEGER WORD;                                                           00612000
OPTION EXTERNAL;                                                        00614000
                                                                        00616000
PROCEDURE MPXCONTROL(OP,DITP);                                          00618000
VALUE OP,DITP;                                                          00620000
INTEGER OP;                                                             00622000
POINTER DITP;                                                           00624000
OPTION EXTERNAL;                                                        00626000
                                                                        00628000
PROCEDURE WRITE2(WORD);                                                 00630000
VALUE WORD;                                                             00632000
INTEGER WORD;                                                           00634000
OPTION EXTERNAL;                                                        00636000
                                                                        00638000
PROCEDURE AWAKEIO(DITP,FLAGS);                                          00640000
VALUE DITP,FLAGS;                                                       00642000
POINTER DITP;                                                           00644000
INTEGER FLAGS;                                                          00646000
OPTION EXTERNAL;                                                        00648000
                                                                        00650000
PROCEDURE CHECKLDEV(DEV);                                               00652000
VALUE DEV;                                                              00654000
INTEGER DEV;                                                            00656000
OPTION EXTERNAL;                                                        00658000
                                                                        00660000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QN);                                00662000
VALUE LINKINDEX,QN;                                                     00664000
INTEGER LINKINDEX,QN;                                                   00666000
OPTION EXTERNAL;                                                        00668000
                                                                        00670000
PROCEDURE IOFAILURE(DRTN,DITP);                                         00672000
VALUE DRTN,DITP;                                                        00674000
INTEGER DRTN;                                                           00676000
INTEGER POINTER DITP;                                                   00678000
OPTION EXTERNAL;                                                        00680000
                                                                        00682000
INTEGER PROCEDURE SEG'ID'TYPE (SEG);                           <<01659>>00684000
   VALUE SEG;                                                  <<01659>>00686000
   INTEGER SEG;                                                <<01659>>00688000
   OPTION EXTERNAL;                                            <<01659>>00690000
PROCEDURE MMSTAT(P1,P2,P3,P4);                                 <<01564>>00692000
VALUE P1,P2,P3,P4;                                             <<01564>>00694000
INTEGER P1,P2,P3,P4;                                           <<01564>>00696000
OPTION EXTERNAL;                                               <<01564>>00698000
                                                                        00700000
INTEGER PROCEDURE GET'DSDEVICE (LDEV);                         <<01775>>00702000
VALUE LDEV;                                                    <<01775>>00704000
INTEGER LDEV;                                                  <<01775>>00706000
OPTION EXTERNAL;                                               <<01775>>00708000
                                                                        00710000
LOGICAL PROCEDURE TESTCRUNCH(CALLER);                                   00712000
   VALUE CALLER;                                                        00714000
   INTEGER CALLER;                                                      00716000
   OPTION PRIVILEGED,UNCALLABLE;                                        00718000
   BEGIN                                                                00720000
   LOGICAL POINTER  CST = 1;                                            00722000
   LOGICAL LS0=S-0;                                                     00724000
   EQUATE TRPLBL=%100001,CLEARSTT=%100377,GETSTT=%77400;                00726000
   EQUATE SERIES33 = 8;                                        <<02021>>00728000
   INTEGER  S0 = S-0;                                                   00730000
   INTEGER ARRAY  ARRQ(*) = Q+0;                                        00732000
   EQUATE BADREF = 8;                                                   00734000
   TOS := X;  <<SAVE INSTRUCTION ON WHICH TRAP OCCURRED>>               00736000
                                                                        00738000
   TOS := ARRQ(-ARRQ-1); <<GET STATUS OF TRAPPED PROCEDURE>>            00740000
   IF < THEN BEGIN <<PRIVILEGED MODE WHEN TRAPPED>>                     00742000
                                                                        00744000
COMMENT THE FOLLOWING CODE IS INCLUDED TO AVERT SD#10 IN                00746000
        THE CASE THAT TWO INTERNAL INTERRUPTS ARE GENERATED             00748000
        BY A SINGLE VIOLATION, E.G., BNDS VIOL IS FOLLOWED              00750000
        BY ILL ADR IN PARTIAL MEMORY SYSTEM.  THE FOLLOWING             00752000
        CODE WILL SET TESTCRUNCH TRUE AND RETURN, IGNORING              00754000
        THE ILL ADR;                                                    00756000
   IF S0=TRPLBL THEN                                                    00758000
     BEGIN                                                              00760000
     TOS := ARRQ(X:=X-3);<<IS THIS EXT TRAP LBL? CHECK:>>               00762000
     IF (LS0 LAND CLEARSTT)=TRPLBL THEN                                 00764000
       BEGIN <<CHECK IF DELTA P IS ENTRY FOR STT IN LBL>>               00766000
       TOS := TOS.(1:7); <<STT>>                                        00768000
       TOS := CST(7);  <<ABSOLUTE LOC OF ININ>>                         00770000
       ASMB(XCH,SUB);                                                   00772000
       TOS := CST(4).(4:12)&LSL(2); <<LEN OF ININ>>                     00774000
       TOS := TOS+TOS-1;   <<TOS:=@ OF STT ENTRY FROM BLKLBL>> <<02087>>00776000
       TOS := CST(6);      <<TOS:=BANK OF ININ>>               <<02087>>00778000
       ASMB(XCH;LSEA);     <<TOS:=STT ENTRY OF BLKLBL>>        <<02087>>00780000
       ASMB(DELB,DELB);    <<PITCH DOBLE ADDR OF STT ENTRY>>   <<02087>>00782000
       TOS := TOS.(2:14);  <<TOS:=DELTAP OF TRAPPED PROC>>     <<02087>>00784000
       TOS := ARRQ(-ARRQ-2); <<DELTA P AT TRAP TIME>>                   00786000
       IF TOS=TOS THEN                                                  00788000
         BEGIN <<DOUBLE INTERNAL INTERRUPT! IGNORE!>>                   00790000
         TESTCRUNCH := TRUE;                                            00792000
         RETURN;                                                        00794000
         END;                                                           00796000
       END                                                     <<01923>>00798000
       ELSE DEL;                                               <<01923>>00800000
     END;                                                               00802000
   TOS := TOS LAND %377;                                                00804000
   IF S0<%300 AND CST(S0&LSL(2)+1).SYSTEMFLAG                  <<MPEIV>>00806000
   THEN                                                                 00808000
     BEGIN << IN PRIVILEGED SYSTEM CODE >>                              00810000
   << THE CODE ADDED HERE IN THE SERIES 3 VERSION IS NOT  >>   <<01923>>00812000
   << NECESSARY FOR THE SERIES 33 VERSION (DUE TO MICRO-  >>   <<01923>>00814000
   << CODE). THIS ALREADY CHECKS TO SEE IF THE BOUNDS VIO >>   <<01923>>00816000
   << THAT OCCURRED WAS CAUSED BY AN EXIT TO A DESTROYED  >>   <<01923>>00818000
   << USER STACK MARKER.  IF SO, ABORT PROCESS ELSE SF10  >>   <<01923>>00820000
   << THE CODE MUST BE ADDED FOR THE SERIES 44 AND 55>>        <<02021>>00822000
       ASSEMBLE(PCN);     <<CPU NUMBER>>                       <<02021>>00824000
       IF TOS = SERIES33 THEN                                  <<02021>>00826000
         BEGIN                                                 <<02021>>00828000
            X := ARRQ(-2) + %111; <<PMAP REL LOC OF CALLER>>   <<02021>>00830000
            SUDDENDEATH(CALLER+BADREF);                        <<02021>>00832000
         END                                                   <<02021>>00834000
        ELSE            <<ICF'44 AND ICF'55>>                  <<02021>>00836000
         BEGIN                                                 <<02021>>00838000
            DEL;                                               <<02021>>00840000
            IF (TOS LAND %177400)<> %31400 <<NOT EXIT INST>>   <<02021>>00842000
             OR CALLER<>2 THEN      <<NOT BOUNDS VIO>>         <<02021>>00844000
              BEGIN                                            <<02021>>00846000
DIE:           X:=ARRQ(-2)+%111;  <<PMAP REL LOC OF CALLER>>   <<02021>>00848000
               SUDDENDEATH(CALLER+BADREF);        <<DIE>>      <<02021>>00850000
              END ELSE                                         <<02021>>00852000
               BEGIN                                           <<02021>>00854000
                TOS:=ARRQ((-ARRQ(-ARRQ)-ARRQ)-1);              <<02021>>00856000
                <<STATUS MARKER BEFORE TRAP PROCEDURE>>        <<02021>>00858000
                IF (TOS LAND %377)<%300 THEN GO DIE;           <<02021>>00860000
              <<NOT A TRAP ON EXIT TO A BAD USER SEGMENT>>     <<02021>>00862000
               END                                             <<02021>>00864000
         END                                                   <<02021>>00866000
      END;                                                     <<02021>>00868000
   END <<PRIVILEGED MODE WHEN TRAPPED>>;                                00870000
   STATUS.(1:1) := 1;   << INTERRUPTS ON ON EXIT >>                     00872000
   END;                                                                 00874000
                                                                        00876000
PROCEDURE  BOUNDSVIOLATION;                                             00878000
   OPTION PRIVILEGED,UNCALLABLE;                                        00880000
   BEGIN                                                                00882000
   IF NOT TESTCRUNCH(2) THEN                                            00884000
   ABORT([8/1,8/0],24,0); << WITH INSTR IN XREG >>             <<03040>>00886000
   END;                                                                 00888000
                                                                        00890000
PROCEDURE  ILLEGALADDRESS;                                              00892000
   OPTION PRIVILEGED,UNCALLABLE;                                        00894000
   BEGIN                                                                00896000
   IF NOT TESTCRUNCH(1) THEN                                            00898000
   ABORT([8/1,8/0],23,0); << WITH INSTR IN XREG >>             <<03040>>00900000
   END;                                                                 00902000
                                                               <<04793>>00904000
PROCEDURE  NONRESPONDINGMODULE;                                <<04793>>00906000
   OPTION PRIVILEGED,UNCALLABLE;                               <<04793>>00908000
    << THIS PROCEDURE PRODUCES THE CORRECT SYSTEM FAILURE >>   <<04793>>00910000
    << FOR A NON-RESPONDING MODULE INTERRUPT.  PREVIOUSLY >>   <<04793>>00912000
    << THIS INTERRUPT WAS HANDLED AS A GHOST INTERRUPT    >>   <<04793>>00914000
                                                               <<04793>>00916000
   BEGIN                                                       <<04793>>00918000
   IF X=%20302 THEN     <<IO OPERATION>>                       <<04793>>00920000
     BEGIN                                                     <<04793>>00922000
     STATUS.CC := CCL;                                         <<04793>>00924000
     RETURN;                                                   <<04793>>00926000
     END;                                                      <<04793>>00928000
   IF NOT TESTCRUNCH(0) THEN                                   <<04793>>00930000
   ABORT([8/1,8/0],25,0);                                      <<04793>>00932000
   END;                                                        <<04793>>00934000
                                                                        00936000
PROCEDURE DATAPARITY;                                          <<02302>>00938000
   OPTION PRIVILEGED,UNCALLABLE;                               <<02302>>00940000
                                                               <<02302>>00942000
   COMMENT: Dataparity will attempt to locate which memory     <<02302>>00944000
   location caused the data parity interrupt.  It does this    <<02302>>00946000
   by referencing all locations in memory until another data   <<02302>>00948000
   parity interrupt is detected.  The location which was last  <<02302>>00950000
   referenced is displayed and the system is halted, SF 13.    <<02302>>00952000
   If the bad location is not located, the machine is halted   <<02302>>00954000
   without a location displayed;                               <<02302>>00956000
                                                               <<02302>>00958000
   BEGIN                                                       <<02302>>00960000
   EQUATE  SYSDB = %1000,                                      <<02302>>00962000
           CRLF = %6412;   <<Carriage return, linefeed>>       <<02302>>00964000
   DEFINE  PARITYERRFLAG = ABSOLUTE (SYSDB + %61)#,            <<02302>>00966000
           SYSLASTBANK   = ABSOLUTE (SYSDB + %361)#,           <<02302>>00968000
           SYSLASTADDR   = ABSOLUTE (SYSDB + %362)#;           <<02302>>00970000
   ARRAY   PARMSG (0:6) = PB := CRLF, "PARITY ERROR";          <<02302>>00972000
   ARRAY   BMSG (0:2)   = PB := CRLF, "B = ";                  <<02302>>00974000
   ARRAY   AMSG (0:2)   = PB := CRLF, "A = ";                  <<02302>>00976000
   LOGICAL B       = S-1,  <<B stack cell: Bank # for LSEA>>   <<02302>>00978000
           A       = S,    <<A stack cell: Offset for LSEA>>   <<02302>>00980000
           ERRBANK = Q-6,  <<B stack cell after second DP>>    <<02302>>00982000
           ERRADDR = Q-5,  <<A stack cell after second DP>>    <<02302>>00984000
           LASTBANK,       <<Largest bank # configured>>       <<02302>>00986000
           LASTADDR;       <<Largest addr for current bank>>   <<02302>>00988000
                                                               <<02302>>00990000
   IF NOT PARITYERRFLAG THEN                                   <<02302>>00992000
         <<First DP interrupt: initialize and make another>>   <<02302>>00994000
         BEGIN                                                 <<02302>>00996000
         TOS := SYSDB D;          <<Set sysdb, pitch old DB>>  <<02302>>00998000
         ASSEMBLE (XCHD;DDEL);                                 <<02302>>01000000
         FOR X := 0 UNTIL 6 DO WRITE2(PARMSG(X));              <<02302>>01002000
         PARITYERRFLAG := TRUE;                                <<02302>>01004000
         LASTBANK := SYSLASTBANK;                              <<02302>>01006000
         LASTADDR := %177777;     <<Assume all but L.B. full>> <<02302>>01008000
                                                               <<02302>>01010000
         <<Reference all of memory to recreate the error>>     <<02302>>01012000
         TOS := 0D;               <<A:=B:=0>>                  <<02302>>01014000
         WHILE B <= LASTBANK DO                                <<02302>>01016000
            BEGIN                                              <<02302>>01018000
            WHILE A < LASTADDR DO                              <<02302>>01020000
               BEGIN                                           <<02302>>01022000
               ASSEMBLE (LSEA;DEL);                            <<02302>>01024000
               ASSEMBLE (INCA);                                <<02302>>01026000
               END;                                            <<02302>>01028000
            ASSEMBLE (LSEA;DEL);  <<for last word in bank>>    <<02302>>01030000
            ASSEMBLE (INCA,INCB);                              <<02302>>01032000
            IF B = LASTBANK THEN LASTADDR := SYSLASTADDR;      <<02302>>01034000
            END;                                               <<02302>>01036000
         END  <<First parity error>>                           <<02302>>01038000
      ELSE                                                     <<02302>>01040000
         <<Second dataparity: print where we found it>>        <<02302>>01042000
         BEGIN                                                 <<02302>>01044000
         FOR X := 0 UNTIL 2 DO WRITE2(BMSG(X));                <<02302>>01046000
         DCONVERT (ERRBANK);                                   <<02302>>01048000
         FOR X := 0 UNTIL 2 DO WRITE2(AMSG(X));                <<02302>>01050000
         BCONVERT (ERRADDR);                                   <<02302>>01052000
         END;  <<second parity error>>                         <<02302>>01054000
   SUDDENDEATH(13);                                            <<02302>>01056000
   END;  <<Dataparity>>                                        <<02302>>01058000
                                                                        01060000
PROCEDURE GHOST4;                                              <<04793>>01062000
   OPTION PRIVILEGED,UNCALLABLE;                                        01064000
  BEGIN                                                                 01066000
    ENTRY GHOST5,GHOST7,GHOST14,                               <<04793>>01068000
          GHOST22,GHOST23,GHOST26,GHOST27,GHOST28,GHOST29,              01070000
          GHOST30,GHOST36;                                              01072000
   IF X=%20302 THEN                                                     01074000
     BEGIN << I/O OPERATION >>                                          01076000
     STATUS.CC := CCL;                                                  01078000
     RETURN;                                                            01080000
     END;                                                               01082000
    TOS := 4;                                                  <<04793>>01084000
  MAINGHOST:                                                            01086000
   SUDDENDEATH(15);                                                     01088000
  GHOST5:                                                               01092000
    TOS := 5;                                                           01094000
    GOTO MAINGHOST;                                                     01096000
  GHOST7:                                                               01098000
    TOS := 7;                                                           01100000
    GOTO MAINGHOST;                                                     01102000
  GHOST14:                                                              01106000
    TOS := 14;                                                          01108000
    GOTO MAINGHOST;                                                     01110000
  GHOST22:                                                              01114000
    TOS := 22;                                                          01116000
    GOTO MAINGHOST;                                                     01118000
  GHOST23:                                                              01120000
    TOS := 23;                                                          01122000
    GOTO MAINGHOST;                                                     01124000
  GHOST26:                                                              01126000
    TOS := 26;                                                          01128000
    GOTO MAINGHOST;                                                     01130000
  GHOST27:                                                              01132000
    TOS := 27;                                                          01134000
    GOTO MAINGHOST;                                                     01136000
  GHOST28:                                                              01138000
    TOS := 28;                                                          01140000
    GOTO MAINGHOST;                                                     01142000
  GHOST29:                                                              01144000
    TOS := 29;                                                          01146000
    GOTO MAINGHOST;                                                     01148000
  GHOST30:                                                              01150000
    TOS := 30;                                                          01152000
    GOTO MAINGHOST;                                                     01154000
  GHOST36:                                                              01156000
    TOS := 36;                                                          01158000
    GOTO MAINGHOST;                                                     01160000
  END;                                                                  01162000
                                                                        01164000
PROCEDURE EXTGHOST;                                                     01166000
OPTION PRIVILEGED,UNCALLABLE,INTERRUPT;                        <<03664>>01168000
BEGIN                                                                   01170000
INTEGER DRTN = Q+3;         << LOCATION OF DRT NUMBER >>       <<03664>>01172000
                                                               <<03664>>01174000
EQUATE UNKNOWN'INT'MSG = 410,   << MSG CATALOG MSG # >>        <<03664>>01176000
       OPCONSOLE       = 0;     << SYSTEM CONS CODE FOR GENMSG <<03664>>01178000
                                                               <<03664>>01180000
   DISABLE; << ISSUE A CLEAR INTERFACE >>                               01182000
   IOMESSAGE(1,UNKNOWN'INT'MSG,%10000,DRTN,,,,,OPCONSOLE);     <<03664>>01184000
END;                                                                    01186000
                                                                        01188000
                                                               <<03094>>01190000
                                                               <<03094>>01192000
                                                               <<03094>>01194000
                                                               <<03094>>01196000
PROCEDURE TEMPWARNINGS;                                        <<03094>>01198000
OPTION PRIVILEGED,UNCALLABLE;                                  <<03094>>01200000
                                                               <<03094>>01202000
COMMENT                                                        <<03094>>01204000
         THIS PROCEDURE IS FOR THE ICF'64 TEMPERATURE          <<03094>>01206000
         CONDITIONS.  THE FOLLOWING PARAMETERS ARE DROPPED     <<03094>>01208000
         BY MICROCODE TO INDICATE WHICH TYPE OF CONDITION TO   <<03094>>01210000
         PRINT OUT ON THE CONSOLE:                             <<03094>>01212000
                                                               <<03094>>01214000
             Q+1 =    0      "LOW OVERTEMP CONDITION"          <<03094>>01216000
                      1      "HIGH OVERTEMP CONDITION"         <<03094>>01218000
                      2      "OVERTEMP CONDITION-POWER DOWN    <<03094>>01220000
                                IN PROGRESS"                   <<03094>>01222000
                      3      "TEMPERATURE NORMAL CONDITION".   <<03094>>01224000
                                                               <<03094>>01226000
         AFTER THE MESSAGE IS SENT TO THE CONSOLE, WE WILL     <<03094>>01228000
         JUST RETURN.  EVEN THOUGH THIS IS AN INTERNAL INT.,   <<03094>>01230000
         IF A 2ND OVERTEMP INTERRUPTS WHILE DOING THIS ONE,    <<04184>>01232000
         IT WILL BE HELD OFF IF WE HAVE INTERRUPTS DISABLED.   <<03094>>01234000
         ALL OTHER INTERRUPTS WILL BE HELD OFF, TOO.           <<03094>>01236000
         IF IT IS A FATAL OVERTEMP, MICROCODE WILL TRAP TO     <<04184>>01238000
         POWERFAIL AFTER THIS MESSAGE IS SENT OUT.             <<03094>>01240000
;                                                              <<03094>>01242000
                                                               <<03094>>01244000
                                                               <<03094>>01246000
                                                               <<03094>>01248000
BEGIN                                                          <<03094>>01250000
                                                               <<03094>>01252000
    <<DON'T ADD A VARIABLE AT Q+1-CONDITION MUST BE HERE>>     <<03094>>01254000
LOGICAL CONDITION   = Q+1;   <<TYPE OF TEMP. COND. >>          <<03094>>01256000
                           <<DROPPED BY MICROCODE- Q+1>>       <<03094>>01258000
                                                               <<03094>>01260000
INTEGER MESSAGE     = Q+2;                                     <<03094>>01262000
                                                               <<03094>>01264000
EQUATE LOWOVERTEMP  = 140,   <<NOS. FOR MESSAGES PRINTED OUT>> <<03094>>01266000
       HIGHOVERTEMP = 141,                                     <<03094>>01268000
       FATALOVERTEMP= 142,                                     <<03094>>01270000
       NORMALTEMP   = 143,                                     <<03094>>01272000
       CONSOLE      = 0,       <<CONSOLE NUM FOR IOMESSAGE>>   <<03094>>01274000
       SYSDB        = %1000,                                   <<03094>>01276000
       ICF'55       = 4;       <<CPU NUMBER FOR ICF'55>>       <<03094>>01278000
                                                               <<03094>>01280000
DISABLE;                                                       <<03094>>01282000
TRAPSOFF;                                                      <<03094>>01284000
ASMB(TOFF);                                                    <<03094>>01286000
                                                               <<03094>>01288000
ASMB (ADDS 1);   <<MAKE ROOM FOR LOCAL VARIABLES>>             <<03094>>01290000
ASMB (PCN);       <<DECIDE WHICH CPU WE HAVE>>                 <<03094>>01292000
IF TOS <> ICF'55                                               <<03094>>01294000
   THEN SUDDENDEATH(15)   <<WE SHOULD NOT BE HERE IF THIS>>    <<03094>>01296000
                          <<IS NOT A ICF'64. IT IS THEREFORE>> <<03094>>01298000
                          <<A GHOST INTERRUPT.           >>    <<03094>>01300000
   ELSE BEGIN                                                  <<03094>>01302000
        << FIND OUT WHICH MESSAGE TO PRINT OUT - (Q+1) >>      <<03094>>01304000
        MESSAGE := IF CONDITION=0 THEN LOWOVERTEMP             <<03094>>01306000
              ELSE IF CONDITION=1 THEN HIGHOVERTEMP            <<03094>>01308000
              ELSE IF CONDITION=2 THEN FATALOVERTEMP           <<03094>>01310000
              ELSE IF CONDITION=3 THEN NORMALTEMP              <<03094>>01312000
              ELSE 0;                                          <<03094>>01314000
                                                               <<03094>>01316000
        IF MESSAGE = 0 THEN SUDDENDEATH(15);                   <<03094>>01318000
          <<WE SHOULD NOT BE HERE IF CONDITION IS NOT SET.>>   <<03094>>01320000
          <<SO THIS MUST BE A GHOST INTERRUPT.  >>             <<03094>>01322000
                                                               <<03094>>01324000
        TOS := SYSDB D;                                        <<03094>>01326000
        ASMB (XCHD);                                           <<03094>>01328000
        IOMESSAGE(1,MESSAGE,,,,,,,CONSOLE);                    <<03094>>01330000
        ASMB (XCHD; DDEL; TON)                                 <<03094>>01332000
        END                                                    <<03094>>01334000
                                                               <<03094>>01336000
END;                                                           <<03094>>01338000
                                                               <<03094>>01340000
PROCEDURE  POWERFAIL;                                                   01342000
   OPTION PRIVILEGED,UNCALLABLE;                                        01344000
BEGIN                                                                   01346000
                                                                        01348000
EQUATE                                                                  01350000
   DILTP       = 5,        << DIT INDEX TO ILT POINTER >>               01352000
   CSTB        = 0,        <<CST BASE>>                        <<01372>>01354000
   SERIES'33   = 8,        << SERIES'33 PCN NUMBER >>          <<01415>>01356000
   ICF'44      = 3,                                            <<03008>>01358000
   DEVRESET    = %100000,  << DEVICE MASTERCLEAR CONTROL >>             01360000
   TEMPLR      = %22,      << TEMP STORAGE FOR LIMIT REG >>    <<01183>>01362000
   POWERFAIL   = %72,      << SYSDB INDEX >>                            01364000
   SYSDB       = %1000;                                                 01366000
                                                                        01368000
DEFINE                                                                  01370000
   MAXENTRY    = (0:8)#;   << # OF ENTRIES IN LPDT >>                   01372000
                                                                        01374000
INTEGER                                                                 01376000
   ABSQI       = Q+7,                                                   01378000
   I           = Q+6,                                                   01380000
   LR          = Q+5,                                                   01382000
   MAXDRT      = DB+%71,                                                01384000
   PARAM       = Q+3,   <<DIFFERENCE BETWEEN CR AND LR>>                01386000
   PF          = DB+POWERFAIL,                                          01388000
   S           = S-2,                                                   01390000
   SYSUP       = DB+%73;                                                01392000
                                                                        01394000
INTEGER S0     = S-0;                                          <<03008>>01396000
                                                               <<03008>>01398000
INTEGER POINTER                                                         01400000
   LPDT        = DB+%10,                                                01402000
   PS0         = S-0;                                                   01404000
                                                                        01406000
DOUBLE POINTER                                                          01408000
   LPDTD       = LPDT;                                                  01410000
                                                                        01412000
                                                                        01414000
   TOS := 0D;                                                           01416000
   TOS := SYSDB;                                                        01418000
   ASMB(XCHD);                                                          01420000
   PF := 1; << SET SYSDB AND PF COUNT >>                                01422000
   SYSUP := 0;                                                          01424000
   TOS := ABS(QI);                                                      01426000
                                                               <<01372>>01428000
   <<SAVE CST(2) ON TOS -- THIS CST WILL BE REBUILT    >>      <<01372>>01430000
   <<TO LOOK LIKE A SEGMENT PRESENT IN NON-EXISTENT    >>      <<01372>>01432000
   <<PHYSICAL MEMORY.  POWERFAIL WILL PCAL THIS SEG    >>      <<01372>>01434000
   <<AS ITS LAST ACTION.  THIS PREVENTS ACCESS TO      >>      <<01372>>01436000
   <<MEMORY WHEN THE MEMORY CONTROLLER IS MASTERCLEARED>>      <<01372>>01438000
   <<BY MICROCODE, THUS AVOIDING A HARDWARE PROBLEM    >>      <<01372>>01440000
   <<WHICH CAUSES MEMORY TO BE DESTROYED.              >>      <<01372>>01442000
                                                               <<01372>>01444000
   X:=ABS(CSTB)+8;          <<ADDR OF CST(2)>>                 <<01372>>01446000
   TOS:=ABS(X);             <<WORD 0>>                         <<01372>>01448000
   TOS:=ABS(X:=X+1);        <<WORD 1>>                         <<01372>>01450000
   TOS:=ABS(X:=X+1);        <<WORD 2>>                         <<01372>>01452000
   TOS:=ABS(X:=X+1);        <<WORD 3>>                         <<01372>>01454000
                                                               <<01372>>01456000
   <<BUILD NEW CST(2)>>                                        <<01372>>01458000
                                                               <<01372>>01460000
   ABS(X):=0;               <<ADDR>>                           <<01372>>01462000
   ABS(X:=X-1):=15;         <<BANK>>                           <<01372>>01464000
   ABS(X:=X-1):=1;          <<REFCOUNT>>                       <<01372>>01466000
   ABS(X:=X-1):=%40040;     <<LENGTH>>                         <<01372>>01468000
                                                               <<01372>>01470000
   TOS := ABS(ABSQI-6); << SAVE QI-6 >>                                 01472000
   TOS := ABS(X:=X+9);  << QI + 3 >>                                    01474000
   TOS := ABS(X:=X+1);  << AND QI + 4 >>                                01476000
   PUSH(S,Q,DL);                                                        01478000
   TOS := S - ABSQI + SYSDB; << COMPUTE ADDS VALUE FOR RESTART >>       01480000
   ABS(X) := TOS;                                                       01482000
   ASMB(RCCR);         << GET CURRENT TIME >>                  <<01183>>01484000
   TOS := ABS(TEMPLR);                                         <<01183>>01486000
   ASMB(LSUB);         << TIME SINCE LAST INTERRUPT >>         <<01183>>01488000
   LR := TOS;                                                  <<01183>>01490000
                                                                        01492000
   << POWER FAIL FIRMWARE DOES IO CLEAR (IOCL) >>                       01494000
   << 30/33 MUST BE EXECUTING IN NON-EXISTENT MEMORY AT >>     <<01415>>01496000
   << TIME OF ACTUAL POWER LOSS - ALL OTHER MACHINES    >>     <<01415>>01498000
   << MAY JUST HALT.  IF 30/33, PCAL CST(2) WHICH WAS   >>     <<01415>>01500000
   << BUILT ABOVE AND EXECUTE IN NON-EXISTENT MEMORY    >>     <<01415>>01502000
                                                               <<01415>>01504000
   ASSEMBLE (PCN);           <<GET CPU NUMBER>>                <<01415>>01506000
   IF S0 = SERIES'33 THEN                                      <<03008>>01508000
      BEGIN    <<THIS IS A 33 - PCAL HYPERSPACE>>              <<01415>>01510000
      DEL;                                                     <<03008>>01512000
      TOS := %100002;  <<SEG #2, STT#0 - ADDRESS OF HYPRSPCE>> <<01415>>01514000
      ASSEMBLE (PCAL 0);  << "ENERGIZE, SCOTTY" >>             <<01415>>01516000
      END                                                      <<01415>>01518000
   ELSE IF TOS = ICF'44                                        <<03008>>01520000
           THEN ASSEMBLE(HALT 7)                               <<03008>>01522000
           ELSE ASMB(CON %20104; CON %5);    <<FLUSH FOR '55>> <<03008>>01524000
END;                                                                    01526000
                                                               <<04184>>01528000
                                                               <<04184>>01530000
PROCEDURE DCULOGGING;                                          <<04184>>01532000
OPTION PRIVILEGED,UNCALLABLE;                                  <<04184>>01534000
                                                               <<04184>>01536000
COMMENT                                                        <<04184>>01538000
       THIS PROCEDURE IS FOR THE SERIES'64 DCU LOGGING.        <<04184>>01540000
       DCU LOGGING IS INTERRUPT DRIVEN, WRITTEN TO A           <<04184>>01542000
       TEMPORARY MEMORY BUFFER AND LATER ON TO DISC.           <<04184>>01544000
       DCU'REQUEST WILL HANDLE THE WRITING OF THE              <<04184>>01546000
       INFORMATION.  MICROCODE WILL TRAP TO HERE FIRST         <<04184>>01548000
       AND WE WILL PRINT A MESSAGE TO THE CONSOLE SAYING       <<04184>>01550000
       THAT DCU LOGGING IS TAKING PLACE OR IS DONE. THEN       <<04184>>01552000
       WE WILL CALL THE PROCEDURE DCU'REQUEST.                 <<04184>>01554000
       THE PARMS GIVEN TO US AT Q+1:(BIT 15)  ARE:             <<04184>>01556000
                                                               <<04184>>01558000
           0 : DCU LOGGING IN PROGRESS                         <<04184>>01560000
           1 : DCU LOGGING COMPLETE                            <<04184>>01562000
                                                               <<04184>>01564000
       ALL INTERRUPTS WILL BE HELD OFF IF WE HAVE DISABLED     <<04184>>01566000
       INTERRUPTS.                                             <<04184>>01568000
;                                                              <<04184>>01570000
                                                               <<04184>>01572000
                                                               <<04184>>01574000
BEGIN                                                          <<04184>>01576000
                                                               <<04184>>01578000
    <<DON'T ADD A VARIABLE AT Q+1-DCUMSGSTATE MUST BE HERE>>   <<04184>>01580000
LOGICAL DCUMSGSTATE  = Q+1;  <<DROPPED BY MICROCODE>>          <<04184>>01582000
                                                               <<04184>>01584000
INTEGER DCUMESSAGE   = Q+2;   <<TYPE OF MESSAGE FOR CONSOLE>>  <<04184>>01586000
                                                               <<04184>>01588000
EQUATE MSGSTART      = 144,                                    <<04184>>01590000
       MSGDONE       = 145,                                    <<04184>>01592000
       CONSOLE       = 0,   <<CONSOLE NUM FOR IOMESSAGE>>      <<04184>>01594000
       SYSDB         = %1000,                                  <<04184>>01596000
       ICF'55        = 4;    <<CPU NUMBER FOR SERIES'64>>      <<04184>>01598000
                                                               <<04184>>01600000
DISABLE;                                                       <<04184>>01602000
TRAPSOFF;                                                      <<04184>>01604000
                                                               <<04184>>01606000
ASMB(ADDS 1);   <<MAKE ROOM FOR LOCAL VARIABLE>>               <<04184>>01608000
ASMB(PCN);                                                     <<04184>>01610000
IF TOS <> ICF'55                                               <<04184>>01612000
   THEN SUDDENDEATH(15)  <<WE SHOULD NOT BE HERE IF THIS>>     <<04184>>01614000
                         <<IS NOT A SERIES'64. SO THIS MUST>>  <<04184>>01616000
                         <<BE A GHOST INTERRUPT.        >>     <<04184>>01618000
   ELSE BEGIN                                                  <<04184>>01620000
        <<FIND WHICH TYPE OF INTERRUPT IT IS AND MSG NUM.>>    <<04184>>01622000
        IF DCUMSGSTATE THEN DCUMESSAGE := MSGDONE              <<04184>>01624000
                       ELSE DCUMESSAGE := MSGSTART;            <<04184>>01626000
                                                               <<04184>>01628000
        TOS := SYSDB D;                                        <<04184>>01630000
        ASMB(XCHD);                                            <<04184>>01632000
        IOMESSAGE(1,DCUMESSAGE,,,,,,,CONSOLE);                 <<04184>>01634000
        DCU'REQUEST(DCUMSGSTATE);                              <<04184>>01636000
        ASMB(XCHD; DDEL)                                       <<04184>>01638000
        END                                                    <<04184>>01640000
                                                               <<04184>>01642000
END;                                                           <<04184>>01644000
                                                               <<04184>>01646000
                                                               <<04184>>01648000
                                                                        01650000
  PROCEDURE SYSTEMCLOCK;                                                01652000
    OPTION PRIVILEGED,UNCALLABLE;                                       01654000
    BEGIN                                                               01656000
    ARRAY SPACE(0:2)=Q; <<PROTECT DB AND PARAMETER>>                    01658000
    INTEGER TSLINT=Q+3; << TIME SINCE LAST INTERRUPT INTERVAL >>        01660000
    DISABLE;                                                            01662000
    TOS := 0;                                                           01664000
    TOS := F(SYSTRL)+SYSDB;                                             01666000
    ASMB(XCHD);  <<SET DB TO TIMER REQUEST LIST>>                       01668000
    TOS := TSLINT; << TICK EXPECTS THIS AT Q-4 >>                       01670000
    TICK;                                                               01672000
    ASMB(DEL;XCHD;IXIT);                                                01674000
    END;                                                                01676000
                                                                        01678000
  PROCEDURE BREAKPOINT;                                                 01680000
    OPTION PRIVILEGED,UNCALLABLE;                                       01682000
    BEGIN                                                               01684000
    ASMB(CBKP);                                                         01686000
    END;                                                                01688000
                                                                        01690000
PROCEDURE  UNIMPLEMENTEDINSTRUCTION;                                    01692000
   OPTION PRIVILEGED,UNCALLABLE;                                        01694000
   BEGIN                                                                01696000
   INTEGER USERX = Q-3,                                        <<1040>> 01698000
           S2    = S-2;                                        <<1040>> 01700000
   INTEGER ARRAY NEXTQ(*) = Q+2;                               <<1040>> 01702000
   INTEGER INSTR     = NEXTQ,                                  <<1040>> 01704000
           TRAP'LOC  = INSTR+1;                                <<1040>> 01706000
                                                               <<02011>>01708000
   DEFINE  PLOC      = P.(2:14) #;                             <<02011>>01710000
                                                               <<02011>>01712000
   LOGICAL SUBROUTINE DBLWORD'INSTR;                           <<1040>> 01714000
   BEGIN                                                       <<1040>> 01716000
      COMMENT *** WARNING: THIS SUB. MUST NOT CHANGE           <<1040>> 01718000
              *** THE X REGISTER;                              <<1040>> 01720000
      TOS := X;                                                <<1040>> 01722000
      << ASSIGN RETURN VALUE TO DBLWORD'INST >>                <<1040>> 01724000
      S2 := IF INSTR = %20477 THEN TRUE ELSE FALSE;            <<1040>> 01726000
      X := TOS; << RESTORE X >>                                <<1040>> 01728000
   END;                                                        <<1040>> 01730000
                                                               <<1040>> 01732000
   TOS := X; << SAVE INSTR >>                                  <<1040>> 01734000
                                                               <<04750>>01736000
   IF DBLWORD'INSTR THEN                                       <<1040>> 01738000
      BEGIN                                                    <<1040>> 01740000
      COMMENT:                                                 <<1040>> 01742000
         INSTR CONTAINS WORD 1 OF THE INSTRUCTION.             <<1040>> 01744000
         FOR A TWO WORD INSTRUCTION WITH AN INVALID            <<1040>> 01746000
         2ND WORD THE 'P' REGISTER CONTAINS P+2.               <<1040>> 01748000
         HOWEVER, IF THERE IS NO MICROCODE TO SUPPORT          <<1040>> 01750000
         THE INSTRUCTION, THE TRAP OCCURED ON THE              <<1040>> 01752000
         1ST WORD AND THE 'P' REG. CONTAINS P+1.;              <<1040>> 01754000
      << LOAD INSTRUCTION AT P-1 >>                            <<1040>> 01756000
      TOS:=0;  <<SPACE FOR TRAP'LOC>>                          <<04750>>01758000
      TOS := 0; << RETURN VALUE FOR CONVSEGID >>               <<01659>>01760000
      TOS := BUILDSEGID(SEG'ID'TYPE(STATUS.(8:8)),STATUS.(8:8),<<01659>>01762000
                        (X:=F(CPCB)-F(PCBB))/PCBSIZE);         <<01659>>01764000
      TOS := CONVSEGIDTOSTINX (*);                             <<01659>>01766000
      TOS:=DST(X:=TOS+2);                                      <<MPEIV>>01768000
      TOS:=DST(X:=X+1)+(P-1);                                  <<MPEIV>>01770000
      LMEM;                                                    <<1040>> 01772000
      ENABLE;                                                  <<1040>> 01774000
      INSTR := TOS; << WORD THAT CAUSED TRAP >>                <<1040>> 01776000
      DDEL;  << DELETE EXTENDED ADDRESS >>                     <<1040>> 01778000
      TRAP'LOC := PLOC-1; <<SAVE LOC OF WORD THAT TRAPPED>>    <<02011>>01780000
      COMMENT:                                                 <<1040>> 01782000
         IF WORD AT P-1 IS A DOUBLE WORD INSTRUCTION           <<1040>> 01784000
         THEN ASSUME NO MICROCODE FOR 2 WORD INSTR             <<1040>> 01786000
         ELSE ACTUAL 2 WORD INSTR WITH TRAP ON 2ND             <<1040>> 01788000
         WORD. P GETS BEGINNING OF 2 WORD INSTR.;              <<1040>> 01790000
      IF DBLWORD'INSTR THEN PLOC := PLOC-1                     <<02011>>01792000
      ELSE PLOC := PLOC-2;                                     <<02011>>01794000
      GOTO L;                                                  <<1040>> 01796000
      END;                                                     <<1040>> 01798000
   ENABLE;                                                     <<1040>> 01800000
   IF %20400 <= X <= %20415 THEN                                        01802000
      BEGIN                                                             01804000
      X := X.(12:4);                                                    01806000
      ASMB( BR P+1,X );                                                 01808000
      EADD;                                                             01810000
      ESUB;                                                             01812000
      EMPY;                                                             01814000
      EDIV;                                                             01816000
      ENEG;                                                             01818000
      ECMP;                                                             01820000
      ASSEMBLE(BR P+8);                                                 01822000
      ASSEMBLE(BR P+7);                                                 01824000
      QADD;                                                             01826000
      QSUB;                                                             01828000
      QMPY;                                                             01830000
      QDIV;                                                             01832000
      QNEG;                                                             01834000
      QCMP;                                                             01836000
      END;                                                              01838000
   IF X.(0:10) = %157 OR X.(0:10) = %117 THEN                           01840000
      BEGIN <<QUAD SHIFT>>                                              01842000
      TOS := TOS.(10:6) + USERX;                                        01844000
      IF LOGICAL(X.(4:1)) THEN QASR                                     01846000
      ELSE QASL;                                                        01848000
      END;                                                              01850000
   IF %20570 <= X <= %20571                                             01852000
   OR %20560 <= X <= %20561                                             01854000
   THEN                                                                 01856000
      IF TOS THEN DIDIV                                                 01858000
      ELSE DIMPY;                                                       01860000
   TOS := %177617;                                                      01862000
   ASMB( AND,XAX );                                                     01864000
   IF  %20601 <= X <= %20614  THEN                                      01866000
      BEGIN                                                             01868000
      DELB;   << CUT OFF PARAMETER >>                                   01870000
      X := X.(12:4);                                                    01872000
      ASMB( BR P+0,X );                                                 01874000
      DMUL;                                                             01876000
      CVAD;                                                             01878000
      CVDA;                                                             01880000
      CVBD;                                                             01882000
      CVDB;                                                             01884000
      SLD;                                                              01886000
      NSLD;                                                             01888000
      SRD;                                                              01890000
      ADDD;                                                             01892000
      CMPD;                                                             01894000
      SUBD;                                                             01896000
      MPYDSIM;                                                          01898000
      END;                                                              01900000
   PLOC := PLOC-1;                                             <<02011>>01902000
    TOS:=PLOC;  <<TRAP'LOC>>                                   <<04750>>01904000
   << AT THIS POINT P POINTS TO 1ST WORD OF INSTR >>           <<03040>>01906000
   << THAT CAUSED TRAP, TRAP'LOC POINTS TO THE    >>           <<03040>>01908000
   << WORD OF THE INSTRUCTION THAT WAS BAD        >>           <<03040>>01910000
L: IF INSTR = %36000  THEN                                     <<1040>> 01912000
      BEGIN  << POSSIBLELY A BREAKPOINT >>                              01914000
      TOS := 0; << RETURN VALUE FOR TESTSTOP >>                <<01612>>01916000
      TOS := BUILDSEGID(SEG'ID'TYPE(STATUS.(8:8)),STATUS.(8:8),<<01612>>01918000
                        (X:=F(CPCB)-F(PCBB))/PCBSIZE);         <<01612>>01920000
      TESTSTOP(*,TRAP'LOC,X);                                  <<1040>> 01922000
      IF  >  THEN  RETURN;                                              01924000
      IF  =  THEN                                              <<1040>> 01926000
          BEGIN                                                <<1040>> 01928000
          << FLAG BREAK ON 2ND OF 2 WORD INSTR >>              <<1040>> 01930000
          IF TRAP'LOC <> PLOC THEN X := TRUE                   <<02011>>01932000
          ELSE X := FALSE;                                     <<1040>> 01934000
          DEBUG;                                               <<1040>> 01936000
          END;                                                 <<1040>> 01938000
      END;                                                              01940000
   << SET UP CALL TO ABORT >>                                  <<03040>>01942000
   X := INSTR;                                                 <<03040>>01944000
   PLOC := TRAP'LOC+1;      << ONE PAST ILLEGAL WORD >>        <<03040>>01946000
   ABORT([8/1,8/0],7,0); << WITH INSTR IN XREG >>              <<03040>>01948000
   END;                                                                 01950000
                                                                        01952000
PROCEDURE  STTVIOLATION;                                                01954000
   OPTION PRIVILEGED,UNCALLABLE;                                        01956000
   BEGIN                                                                01958000
   ENABLE;                                                              01960000
   ABORT([8/1,8/0],31,0); << WITH INSTR IN XREG >>             <<03040>>01962000
   END;                                                                 01964000
                                                                        01966000
PROCEDURE  CSTVIOLATION;                                                01968000
   OPTION PRIVILEGED,UNCALLABLE;                                        01970000
   BEGIN                                                                01972000
   ENABLE;                                                              01974000
   ABORT([8/1,8/0],30,0); << WITH INSTR IN XREG >>             <<03040>>01976000
   END;                                                                 01978000
                                                                        01980000
PROCEDURE  DSTVIOLATION;                                                01982000
   OPTION PRIVILEGED,UNCALLABLE;                                        01984000
   << DB-BANK MAY BE INVALID >>                                         01986000
   SUDDENDEATH(16);                                                     01988000
                                                                        01990000
PROCEDURE STACKOVERFLOW;                                       <<MPEIV>>01992000
OPTION PRIVILEGED,UNCALLABLE;                                  <<MPEIV>>01994000
                                                               <<MPEIV>>01996000
COMMENT                                                        <<MPEIV>>01998000
                                                               <<MPEIV>>02000000
STACKOVERFLOW IS THE INTERRUPT HANDLER FOR INTERNAL TRAPS      <<MPEIV>>02002000
CAUSED BY AN INSTRUCTION ATTEMPTING TO PUSH S BEYOND Z.WHEN    <<MPEIV>>02004000
SUCH A CONDITION IS DETECTED BY MICROCODE, CONTROL BRANCES     <<MPEIV>>02006000
TO THIS PROCEDURE ON THE ICS WITH INTERRUPTS DISABLED.         <<MPEIV>>02008000
                                                               <<MPEIV>>02010000
THE SYSTEM MUST CRASH IF THE OVERFLOWING STACK IS FROZEN,      <<MPEIV>>02012000
LOCKED OR CORE RESIDENT, SINCE THERE'S NO WAY TO EXTEND        <<MPEIV>>02014000
THESE.  OTHERWISE, A MESSAGE IS SENT TO THE DISPATCHER TO      <<MPEIV>>02016000
WRITE THE STACK, RELEASE ITS SPACE, AND FLAG THE PROCESS       <<MPEIV>>02018000
AS REQUIRING SCHEDULING ATTENTION.  THE SLL MEMORY PREQUEST    <<MPEIV>>02020000
POINTER OF THE OVERFLOWING PROCESS IS SET TO -1, INDICATING    <<MPEIV>>02022000
TO THE SCHEDULER THAT THE PROCESS' STACK MUST BE MADE PRESENT  <<MPEIV>>02024000
BEFORE THE PROCESS CAN BE LAUNCHED.  THE STACK'S NEW SIZE      <<MPEIV>>02026000
(OLDSIZE + STOVRINC) IS PLACED IN THE STACK'S XST ENTRY, AND   <<MPEIV>>02028000
THE STACK'S ST ENTRY IS FLAGGED AS REQUIRING A MODIFICATION.   <<MPEIV>>02030000
                                                               <<MPEIV>>02032000
IF THE CODE CAUSING THE STACKOVERFLOW HAD DISABLED EXTERNAL    <<MPEIV>>02034000
INTERRUPTS OR PDISABLED SWITCHING, IT MUST BE ALLOWED TO CON-  <<MPEIV>>02036000
TINUE UNTIL IT COMPLETES THE ACTION FOR WHICH IT HAD SET       <<MPEIV>>02038000
THE INTERNAL LOCK.  THAT'S THE REASON STACKS ARE ALLOCATED     <<MPEIV>>02040000
AN OVERFLOW AREA BEYOND Z.  IF THE CODE HAD DISABLED INTERRUPTS<<MPEIV>>02042000
THE INTERRUPT REQUEST FLIP FLOP OF THE CLOCK IS SET,           <<MPEIV>>02044000
AND WHEN THE CODE ENABLES INTERRUPTS THE CLOCK INTERRUPT       <<MPEIV>>02046000
HANDLER WILL BE ENTERED AND WILL DO A DISP.  IF THE CODE       <<MPEIV>>02048000
WAS PDISABLED WHEN IT CAUSED THE STACKOVERFLOW, THE DISP AT    <<MPEIV>>02050000
THE END OF THIS PROCEDURE WILL CAUSE CONTROL TO SWITCH         <<MPEIV>>02052000
TO THE DISPATCHER AS SOON AS THE PROCESS UNTANGLES ITSELF.     <<MPEIV>>02054000
                                                               <<MPEIV>>02056000
;                                                              <<MPEIV>>02058000
   BEGIN                                                                02060000
   INTEGER ARRAY  PCBX(*) = Q+0;                                        02062000
   INTEGER  S0 = S-0,                                                   02064000
            USERS0 = Q-4,    <<TOP OF STACK AT OVERFLOW TIME>> <<00693>>02066000
            DELTAS = Q-6,                                               02068000
            DELTAZ = Q-8;                                               02070000
   DOUBLE  STDB = Q-5;                                                  02072000
   EQUATE  IXIT = %20360,                                               02074000
           ADDS = %35000,                                               02076000
           SUBS = %35400,                                      <<01415>>02078000
           SETR = %027400,                                     <<01967>>02080000
           EXIT = %31400,                                               02082000
           PSHR = %024400,                                     <<01967>>02084000
                                                               <<01415>>02086000
           SERIES'33 = 8,   <<PCN NUMBERS FOR THE VARIOUS>>    <<01415>>02088000
           ICF'44    = 3,   <<CPU THAT USE THIS CODE     >>    <<01415>>02090000
           ICF'55    = 4;                                      <<01415>>02092000
                                                               <<01415>>02094000
   DEFINE  DELTAZ' = F(F(QI)-8)#;                                       02096000
EQUATE STACKOVRINC=512,                                        <<01706>>02098000
       OVERHEAD=%27,                                           <<MPEIV>>02100000
       PAGEPOWER=7,                                            <<MPEIV>>02102000
       RBTORASDISP=-19,                                        <<MPEIV>>02104000
       RASTORBDISP=19,                                         <<MPEIV>>02106000
       EXTRAINC=1152;                                          <<MPEIV>>02108000
DEFINE REGIOFZFLAG=(7:1)#,                                     <<MPEIV>>02110000
       REGFZFLAG=(6:1)#,                                       <<MPEIV>>02112000
       REGLKDFLAG=(5:1)#;                                      <<MPEIV>>02114000
EQUATE STBTOMAXDATA=21,                                        <<MPEIV>>02116000
       MAXDATATORELZ=-11,                                      <<MPEIV>>02118000
       SBTORELDB=1,                                            <<MPEIV>>02120000
       MAXDATATORELDB=-20,                                     <<MPEIV>>02122000
       RELZTORBDISP=-10,                                       <<MPEIV>>02124000
       RELDBTORELZ=9;                                          <<MPEIV>>02126000
EQUATE  ICS'DELTAZ=8,                                          <<MPEIV>>02128000
        ICS'DELTAS=6,                                          <<MPEIV>>02130000
        ICS'STACKBANK=5,                                       <<MPEIV>>02132000
        ICS'STACKBASE=9,                                       <<MPEIV>>02134000
        ICS'PDISABLEDCNT=18,                                   <<MPEIV>>02136000
        ICS'STACKDST=16;                                       <<MPEIV>>02138000
EQUATE LOCVARCNT=14;                                           <<01966>>02140000
LOGICAL LS0=S-0;                                               <<MPEIV>>02142000
INTEGER INSTRUCTION=Q+1,                                       <<MPEIV>>02144000
        OLDSIZE=Q+2,                                           <<MPEIV>>02146000
        NEWSIZE=Q+3,                                           <<MPEIV>>02148000
        PAGESREQUIRED=Q+4,                                     <<MPEIV>>02150000
        WORDSREQUIRED=Q+5,                                     <<MPEIV>>02152000
        OLDDELTAZ=Q+6,                                         <<MPEIV>>02154000
        STACKDST=Q+7,                                          <<MPEIV>>02156000
        SBRELDB=Q+8,                                           <<MPEIV>>02158000
        MAXSTACKSIZE=Q+9,                                      <<MPEIV>>02160000
        INCREMENT=Q+10,                                        <<MPEIV>>02162000
        DBRELTOSTKBASE=Q+11;                                   <<MPEIV>>02164000
EQUATE RBTORSDISP=-18,                                         <<01706>>02166000
       RSTORBDISP=18;                                          <<01706>>02168000
INTEGER PAGESALLOC=Q+12;                                       <<01706>>02170000
INTEGER PCBPT=Q+13;                                            <<01966>>02172000
                                                                        02174000
   << THIS PORTION RUNS ON THE ICS >>                                   02176000
   IF  X = IXIT  THEN  DELTAS := DELTAS-4;                              02178000
   TOS := STDB;                                                         02180000
   TOS := TOS+DELTAS-1;          << USER Q+1 >>                         02182000
   TOS := X;                     << BUILD A MARKER TO GET OFF ICS >>    02184000
   TOS := @STOV'USER;                                                   02186000
   ASMB( SDEA );                                                        02188000
   TOS := TOS+2;                                                        02190000
   PUSH( STATUS );                                                      02192000
   TOS := 4;                                                            02194000
   ASMB( SDEA );                                                        02196000
   TOS := TOS+2;                                                        02198000
   PUSH( DB );                                                          02200000
   ASMB( SDEA );                                                        02202000
   DELTAS := DELTAS+4;                                                  02204000
   DELTAZ := DELTAZ + 120;                                              02206000
   ASMB( PSDB; IXIT );                                                  02208000
                                                                        02210000
STOV'USER:  << THE MARKER ABOVE EXITS TO HERE >>                        02212000
   TOS:=X;  <<SAVE CIR FOR CALL TO STACKOVERFLOW>>             <<00693>>02214000
                                                               <<01415>>02216000
   <<ADJUST DELTA P TO POINT TO INSTRUCTION WITH SK OVRFLW>>   <<01415>>02218000
                                                               <<01415>>02220000
   ASSEMBLE (PCN);              <<GET CPU NUMBER>>             <<01415>>02222000
   ASSEMBLE (DUP);           <<CPU NUMBER AGAIN>>              <<01967>>02224000
   IF TOS <> ICF'44 THEN                                       <<01967>>02226000
      BEGIN          <<FOR SERIES 33 AND SERIES 55>>           <<01967>>02228000
        X := LOGICAL (X) LAND %177400;  <<GET THE OPCODE ONLY>><<01967>>02230000
                                                               <<01967>>02232000
        IF TOS = ICF'55 THEN                                   <<01967>>02234000
           BEGIN             <<SERIES 55>>                     <<01967>>02236000
             IF X = ADDS OR X = SUBS OR     <<ADJUST P TO >>   <<01967>>02238000
                X = SETR OR X=EXIT OR       <<RETRY>>          <<01967>>02240000
                X = PSHR THEN               <<INSTRUCTION>>    <<01967>>02242000
                      P := P - 1;                              <<01967>>02244000
             IF INSTRUCTION = %020477     <<DOUBLE WORD>>      <<01967>>02246000
                THEN P := P - 2;        <<COBOL INSTRUCTION>>  <<01967>>02248000
           END                                                 <<01967>>02250000
          ELSE                                                 <<01967>>02252000
                                                               <<01967>>02254000
           BEGIN            <<SERIES 33>>                      <<01967>>02256000
             <<CODE FOR THE SERIES 33 ADJUSTMENT>>             <<01967>>02258000
 << MOST INSTRUCTIONS DO NOT HAVE TO BE RETRIED BECAUSE THE >> <<01967>>02260000
 << CHECK FOR THE INTERRUPT FLAG FOR STCKOVERFLOW IS MADE   >> <<01967>>02262000
 << AFTER THE INSTRUCTION IS EXECUTED.  THE EXCEPTIONS ARE  >> <<01967>>02264000
 << CHECKED FOR BELOW. (MICROCODE IS DOING THE CHECKING)    >> <<01967>>02266000
             IF X = ADDS OR X = SUBS OR                        <<01967>>02268000
                 X = SETR OR X = EXIT                          <<01967>>02270000
                  THEN P := P - 1;                             <<01967>>02272000
           END                                                 <<01967>>02274000
      END                                                      <<01967>>02276000
                                                               <<01967>>02278000
   ELSE                                                        <<01415>>02280000
      BEGIN                     <<JAGUAR ICF/44 ADJUSTMENT>>   <<01415>>02282000
      <<SERIES II/III TESTS FOR APL TOO>>                      <<01415>>02284000
      DEL;              <<DELETE EXTRA CPU NUMBER>>            <<01967>>02286000
      IF X <> IXIT THEN                                        <<01415>>02288000
         BEGIN                                                 <<01415>>02290000
         P := P - 1;                                           <<01415>>02292000
         X := LOGICAL(X) LAND %170077;    <<CLEAR LEFT SK OP>> <<01415>>02294000
         IF 1 <= X <= 63 THEN                                  <<01415>>02296000
            BEGIN  <<IT IS A STACK INST. WITH RIGHT SK OP>>    <<01415>>02298000
            TOS := STATUS;  <<IS LEFT SK OP ACTIVE?>>          <<01415>>02300000
            ASSEMBLE (TCBC 3);                                 <<01415>>02302000
            IF <> THEN P := P + 1;                             <<01415>>02304000
            STATUS := TOS;                                     <<01415>>02306000
            END;                                               <<01415>>02308000
         END;                                                  <<01415>>02310000
      IF INSTRUCTION = %020477     <<DOUBLE WORD>>             <<01967>>02312000
          THEN P := P - 1;      <<COBOL INSTRUCTIONS>>         <<01967>>02314000
      END;       <<OF DELTA P ADJUSTMENT>>                     <<01415>>02316000
                                                               <<01415>>02318000
ASMB(ADDS LOCVARCNT);                                          <<01564>>02320000
<<INSTRUCTION ALREADY AT Q+1>>                                 <<01564>>02322000
TRAPSOFF;                                                      <<01858>>02324000
IF GCLASSENABLEDMASK.CLASS0 THEN                               <<01564>>02326000
   BEGIN  <<MEASURE STK OVRFLOW EVENT>>                        <<01564>>02328000
   TOS:=MEASSTATXDSBANK;                                       <<01564>>02330000
   TOS:=MEASSTATXDSBASE;                                       <<01564>>02332000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPSTKOVERFLOW;                <<01564>>02334000
   ASMB(LSEA);                                                 <<01564>>02336000
   TOS:=TOS+1;                                                 <<01564>>02338000
   ASMB(SSEA;DDEL);                                            <<01564>>02340000
   END;                                                        <<01564>>02342000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01809>>02344000
   BEGIN <<PROCESS LEVEL STACKOVERFLOW>>                       <<01809>>02346000
   TOS:=MEASPROCXDSBANK;                                       <<01809>>02348000
   TOS:=MEASPROCXDSBASE;                                       <<01809>>02350000
   TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*                   <<01809>>02352000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPAND;                     <<01809>>02354000
   ASMB(LSEA);                                                 <<01809>>02356000
   TOS:=TOS+1;                                                 <<01809>>02358000
   ASMB(SSEA;DDEL);                                            <<01809>>02360000
   END;                                                        <<01809>>02362000
DISABLE;                                                       <<01564>>02364000
PCBPT:=ABSOLUTE(CPCB)-ABSOLUTE(PCBB);                          <<01966>>02366000
ABSOLUTE(SYSWAITTODISPMSG).MEMTRAPFLAG:=1;                     <<01564>>02368000
IF ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM).STOVRALLFLAG=1      <<01949>>02370000
THEN SUDDENDEATH(640);                                         <<01949>>02372000
X:=STACKDST:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKDST);          <<01564>>02374000
MMSTAT(2,STACKDST,15,ICS(-ICS'DELTAZ));<<LOG EVENT>>           <<01920>>02376000
OLDSIZE:=DST(X:=STACKDST&LSL(2)).DATASIZEFIELD&LSL(2);         <<01564>>02380000
TOS:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKBANK);                 <<01564>>02382000
TOS:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKBASE);                 <<01564>>02384000
TOS:=TOS+RBTORSDISP;                                           <<01706>>02386000
ASMB(LSEA);                                                    <<01706>>02388000
PAGESALLOC:=TOS;                                               <<01706>>02390000
TOS:=TOS+RSTORBDISP;                                           <<01706>>02392000
TOS:=TOS+SBTORELDB;                                            <<01564>>02394000
ASMB(LSEA);                                                    <<01564>>02396000
DBRELTOSTKBASE:=TOS;                                           <<01564>>02398000
TOS:=TOS-SBTORELDB;                                            <<01564>>02400000
TOS:=TOS+STBTOMAXDATA; <<21 DECIMAL>>                          <<01564>>02402000
ASMB(LSEA);<<MAX FOR PCBXTOZ>>                                 <<01564>>02404000
MAXSTACKSIZE:=TOS;                                             <<01564>>02406000
TOS:=TOS+MAXDATATORELZ; <<9>>                                  <<01564>>02408000
ASMB(LSEA);                                                    <<01564>>02410000
OLDDELTAZ:=S0;                                                 <<01564>>02412000
TOS:=TOS+120;                                                  <<01564>>02414000
ASMB(SSEA); <<IN CASE BLOCK IN GETDATASEGCHANGESTATE>>         <<01564>>02416000
IF OLDDELTAZ >= MAXSTACKSIZE-DBRELTOSTKBASE THEN               <<01706>>02418000
   BEGIN <<STACK HAS GROWN BEYOND ALLOWABLE SIZE>>             <<01564>>02420000
   ABSOLUTE(X:=ABSOLUTE(4)+PROCSTATEWORDNUM).STOVFLAG:=1;      <<01564>>02422000
   IF <> THEN SUDDENDEATH(641);                                <<01687>>02424000
   INCREMENT:=EXTRAINC;                                        <<01564>>02426000
   TOS:=TOS-MAXDATATORELZ;                                     <<01564>>02428000
   TOS:=MAXSTACKSIZE+EXTRAINC;                                 <<01564>>02430000
   ASMB(SSEA);                                                 <<01564>>02432000
   TOS:=TOS+MAXDATATORELZ;                                     <<01564>>02434000
   END                                                         <<01564>>02436000
ELSE                                                           <<01564>>02438000
   BEGIN  <<STACK OK, CHECK FOR ADDS 0 INSTR >>                <<01564>>02440000
      IF INSTRUCTION <> %35000 THEN INCREMENT := STACKOVRINC   <<01564>>02442000
      ELSE INCREMENT := STACKOVRINC + USERS0;                  <<01564>>02444000
   IF LOGICAL(OLDDELTAZ+INCREMENT) >                           <<01564>>02446000
      LOGICAL(MAXSTACKSIZE-DBRELTOSTKBASE)  THEN               <<01564>>02448000
      INCREMENT := (MAXSTACKSIZE-DBRELTOSTKBASE) - OLDDELTAZ;  <<01564>>02450000
   INCREMENT:=LOGICAL(INCREMENT+3) LAND -4;                    <<01706>>02452000
   END;                                                        <<01564>>02454000
PAGESREQUIRED:=(OLDSIZE+INCREMENT+OVERHEAD-1)                  <<01564>>02456000
                   &LSR(PAGEPOWER)+1;                          <<01564>>02458000
WORDSREQUIRED:=PAGESREQUIRED&LSL(PAGEPOWER);                   <<01564>>02460000
<<NEWSIZE:=WORDSREQUIRED-(OVERHEAD+128) CAUSES VDS OVRFLOW>>   <<01564>>02462000
NEWSIZE:=OLDSIZE+INCREMENT;                                    <<01564>>02464000
TOS:=TOS+RELZTORBDISP+RBTORASDISP;                             <<01564>>02466000
ASMB(LSEA);                                                    <<01564>>02468000
IF TOS.REGIOFZFLAG=1 THEN                                      <<01564>>02470000
   BEGIN                                                       <<01564>>02472000
   IF STATUS.(1:1) = 0 THEN SUDDENDEATH(642);                  <<01687>>02474000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) > 1 THEN         <<02090>>02476000
                                                               <<02090>>02478000
   COMMENT:  The purpose of the following code is to cover up  <<02090>>02480000
             a pdisable problem in which an interrupt handler  <<02090>>02482000
             appears to execute a pdisable without a           <<02090>>02484000
             corresponding penable.  This strange problem      <<02090>>02486000
             always appears to leave the pdisable count at 1.  <<02090>>02488000
             If this condition is met, we shall execute a      <<02090>>02490000
             penable on behalf of the defective software       <<02090>>02492000
             [a small prayer is in order here] and continue    <<02090>>02494000
             execution.  Otherwise we shall HALT the machine.  <<02090>>02496000
             Previously, the software crashed the machine      <<02090>>02498000
             with a SUDDENDEATH(642).  When this problem is    <<02090>>02500000
             corrected the SUDDENDEATH should be implemented;  <<02090>>02502000
                                                               <<02090>>02504000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) = 2 THEN      <<02090>>02506000
      PENABLE   <<It's a miracle>>                             <<02090>>02508000
   ELSE                                                        <<02090>>02510000
      IF TRUE THEN                                             <<02090>>02512000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02090>>02514000
      ELSE                                                     <<02090>>02516000
         SUDDENDEATH(642);  <<Leave the SF hook in>>           <<02090>>02518000
                                                               <<02090>>02520000
   END;                                                        <<01564>>02522000
PENABLE;                                                       <<01564>>02524000
TRYAGAIN:                                                      <<01949>>02526000
GETDATASEGCHANGESTATE(STACKDST);                               <<01564>>02528000
IF < THEN SUDDENDEATH(643) ELSE IF > THEN GO TRYAGAIN;         <<01949>>02530000
<<PDISABLE IN EFFECT NOW, AND STACK MARKED ABSENT!>>           <<01564>>02532000
ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM).STOVRALLFLAG:=1;       <<01949>>02534000
TOS:=DST(X:=STACKDST&LSL(2)+2);                                <<01564>>02536000
TOS:=DST(X:=X+1);                                              <<01564>>02538000
TOS:=TOS+MAXDATATORELDB+STBTOMAXDATA;                          <<01564>>02540000
ASMB(LSEA); <<STACK BASE TO DB>>                               <<01564>>02542000
SBRELDB:=TOS;                                                  <<01564>>02544000
TOS:=TOS+RELDBTORELZ; <<9>>                                    <<01564>>02546000
TOS:=OLDDELTAZ+INCREMENT;                                      <<01564>>02548000
ASMB(SSEA);                                                    <<01564>>02550000
IF PAGESALLOC >= PAGESREQUIRED THEN                            <<01706>>02552000
   BEGIN <<CURRENT REGION IS OK>>                              <<01564>>02554000
   ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM).                    <<01564>>02556000
   STOVRALLFLAG:=0;                                            <<01564>>02558000
   DST(X:=STACKDST&LSL(2)).DATASIZEFIELD:=NEWSIZE&LSR(2);      <<01564>>02560000
   DST(X).ABSENTFLAG:=0;                                       <<01564>>02562000
   ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'DELTAZ):=OLDDELTAZ +          <<01564>>02564000
   INCREMENT;                                                  <<01564>>02566000
   <<FLIP DB TO STACK DB FOR THE SET Z INSTRUCTION>>           <<01800>>02568000
   TOS:=ICS(-ICS'STKBANKCELL);                                 <<01800>>02570000
   TOS:=ICS(-ICS'ABSSTKDBCELL);                                <<01800>>02572000
   ASMB(XCHD);                                                 <<01800>>02574000
   TOS:=OLDDELTAZ+INCREMENT;                                   <<01784>>02576000
   SET(Z); <<STORE NEW DELTA Z INTO REGISTER>>                 <<01784>>02578000
   ASMB(XCHD;DDEL); <<DB BACK TO WHERE IT BELONGS>>            <<01800>>02580000
   PENABLE;                                                    <<01564>>02582000
   END                                                         <<01564>>02584000
ELSE                                                           <<01564>>02586000
   BEGIN <<CURRENT REGION ISN'T BIG ENOUGH>>                   <<01564>>02588000
   ABSOLUTE(SYSWAITTODISPMSG).MEMTRAPFLAG:=1;                  <<01564>>02590000
   GENSPECREQ(STACKDST,NEWSIZE&LSR(2),0,0);                    <<01564>>02592000
   TOS:=STACKDST;                                              <<01564>>02594000
   TOS:=ABSOLUTE(CPCB)-SYSBASE;                                <<01564>>02596000
   SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                       <<01564>>02598000
   IF STATUS.(1:1) = 0 THEN                                    <<01564>>02600000
      BEGIN <<PROCESS HAD DISABLED INTERRUPTS>>                <<01564>>02602000
      TOS:=3; <<CLOCK DRT>>                                    <<01564>>02604000
      ASMB(SINC);  <<TICK WILL DO A DISP>>                     <<01564>>02606000
      PENABLE;                                                 <<01564>>02608000
      DST(STACKDST&LSL(2)).ABSENTFLAG:=0; <<MARK PRESENT>>     <<01939>>02610000
      RETURN;                                                  <<01564>>02612000
      END                                                      <<01564>>02614000
   ELSE ASMB(DISP;PSEB); <<GET CONTROL TO DISPATCHER>>         <<01564>>02616000
   IF ICS(-ICS'PDISCNTCELL) > 0 THEN                           <<01939>>02618000
      BEGIN  <<PROCESS HAS SWITCHING DISABLED>>                <<01939>>02620000
      DST(STACKDST&LSL(2)).ABSENTFLAG:=0; <<MARK PRESENT>>     <<01939>>02622000
      RETURN; <<DISP ABOVE WILL GET CONTROL TO DISPATCHER>>    <<01939>>02624000
      END;                                                     <<01939>>02626000
   END;                                                        <<01564>>02628000
IF PCB(PCBPT+PROCSTATEWORDNUM).STOVFLAG=1                      <<01966>>02630000
AND PCB(PCBPT+RESABORTINFOWORDNUM).CRITFLAG=0                  <<01966>>02632000
AND PCB(PCBPT+RESABORTINFOWORDNUM).HASSIRFLAG=0                <<01966>>02634000
THEN                                                           <<04527>>02636000
   BEGIN                                                       <<04527>>02638000
   P := P+1; << UPDATE P FOR ABORT ROUTINE >>                  <<04527>>02640000
   << LET KERNEL ROUTINES KNOW WE'RE PROCESSING ABORT >>       <<04527>>02642000
   PCB(PCBPT+RESABORTINFOWORDNUM).STOVABORTFLAG := 1;          <<04527>>02644000
   ABORT ([8/1,8/4],0,0);                                      <<04527>>02646000
   END;                                                        <<04527>>02648000
END  <<STACKOVERFLOW>>;                                        <<01564>>02650000
                                                                        02652000
procedure STACKUNDERFLOW;                                      <<01744>>02654000
option privileged,uncallable;                                  <<01744>>02656000
begin <<STACKUNDERFLOW>>                                       <<01744>>02658000
equate      ICF44                   = 3,                       <<01744>>02660000
                                                               <<01744>>02662000
            ICF55                   = 4,                       <<01744>>02664000
                                                               <<01744>>02666000
            QI                      = 5,                       <<01744>>02668000
                                                               <<01744>>02670000
            CPCB                    = 4;                       <<01744>>02672000
                                                               <<01744>>02674000
                                                               <<01744>>02676000
integer     X                       = X,                       <<01744>>02678000
                                                               <<01744>>02680000
            PROCESSOR'TYPE          = Q+4,                     <<01744>>02682000
                                                               <<01744>>02684000
            NEXT1                   = Q+3;                     <<01744>>02686000
                                                               <<01744>>02688000
                                                               <<01744>>02690000
logical     DELTAP                  = Q-2,                     <<01744>>02692000
                                                               <<01744>>02694000
            STATUS                  = Q-1,                     <<01744>>02696000
                                                               <<01744>>02698000
            INSTRUCTION             = Q+1,                     <<01744>>02700000
                                                               <<01744>>02702000
            CST'ENTRY               = Q+4;                     <<01744>>02704000
                                                               <<01744>>02706000
                                                               <<01744>>02708000
double      NEXT'INSTRUCTIONS       = Q+2;                     <<01744>>02710000
                                                               <<01744>>02712000
                                                               <<01744>>02714000
define      STUN'SIM'ENABLED        = STUN'SIM'BIT=0#,         <<01744>>02716000
                                                               <<01744>>02718000
            STUN'SIM'BIT            = F(F(QI)-31).(1:1)#,      <<01744>>02720000
                                                               <<01744>>02722000
            SIMBIT                  = (8:1)#,                  <<01744>>02724000
                                                               <<01744>>02726000
            MODE                    = (0:1)#,                  <<01744>>02728000
                                                               <<01744>>02730000
            USER'MODE               = STATUS.MODE=0#,          <<01744>>02732000
                                                               <<01744>>02734000
            CST'BASE                = F(0)#,                   <<01744>>02736000
                                                               <<01744>>02738000
            CSTX'BASE               = F(1)#,                   <<01744>>02740000
                                                               <<01744>>02742000
            CST                     = STATUS.(8:8)#,           <<01744>>02744000
                                                               <<01744>>02746000
            FIND'PROCESSOR'TYPE     = asmb(pcn);               <<01744>>02748000
                                      PROCESSOR'TYPE:=tos#,    <<01744>>02750000
                                                               <<01744>>02752000
            FETCH'NEXT'INSTRUCTIONS = X:=CST'ENTRY+2;          <<01744>>02754000
                                      asmb(plda);              <<01744>>02756000
                                      X:=X+1;                  <<01744>>02760000
                                      asmb(plda);              <<01744>>02762000
                                      tos:=tos+DELTAP+1;       <<01744>>02764000
                                      asmb(ldea);              <<01744>>02766000
                                      NEXT'INSTRUCTIONS:=tos#, <<01744>>02768000
                                                               <<01744>>02770000
                                                               <<01744>>02772000
            RESET'S                 = tos:=@NEXT1;             <<01744>>02774000
                                      set(S)#;                 <<01744>>02776000
                                                               <<01744>>02778000
                                                               <<01744>>02780000
                                                               <<01744>>02782000
                                                               <<01744>>02784000
                                                               <<01744>>02786000
                                                               <<01744>>02788000
asmb(adds 3);                                                  <<01744>>02790000
INSTRUCTION:=X;                                                <<01744>>02792000
FIND'PROCESSOR'TYPE;                                           <<01744>>02794000
IF USER'MODE and STUN'SIM'ENABLED and                          <<01744>>02796000
(PROCESSOR'TYPE=ICF44 or PROCESSOR'TYPE=ICF55)                 <<01744>>02798000
 then                                                          <<01744>>02800000
  begin                                                        <<01744>>02802000
  if CST > %300                                                <<01744>>02804000
   then                                                        <<01744>>02806000
    CST'ENTRY:=(CST-%300)*4+CSTX'BASE                          <<01744>>02808000
   else                                                        <<01744>>02810000
    CST'ENTRY:=CST*4+CST'BASE;                                 <<01744>>02812000
  FETCH'NEXT'INSTRUCTIONS;                                     <<01744>>02814000
  enable;                                                      <<01744>>02816000
  RESET'S;           <<set S for STUNSIM call>>                <<01744>>02818000
  STUNSIM;                                                     <<01744>>02820000
  end;                                                         <<01744>>02822000
enable;                                                        <<01744>>02824000
X := INSTRUCTION;                                              <<03040>>02826000
ABORT([8/1,8/0],29,0);                                         <<01744>>02828000
end;     <<STACKUNDERFLOW>>                                    <<01744>>02830000
                                                                        02832000
PROCEDURE  PRIVILEGEDMODEVIOLATION;                                     02834000
   OPTION PRIVILEGED,UNCALLABLE;                                        02836000
   BEGIN                                                                02838000
   ENABLE;                                                              02840000
   ABORT([8/1,8/0],6,0);  << WITH INSTR IN XREG >>             <<03040>>02842000
   END;                                                                 02844000
                                                                        02846000
PROCEDURE USERTRAP;                                                     02848000
   OPTION PRIVILEGED,UNCALLABLE;                                        02850000
   BEGIN                                                                02852000
                                                               <<02010>>02854000
DEFINE  CSTX'BASE = F(1)#,                                     <<02010>>02856000
        CST'BASE = F(0)#,                                      <<02010>>02858000
        CST = STATUS.(8:8)#;                                   <<02010>>02860000
                                                               <<02010>>02862000
INTEGER  X = X,                                                <<02010>>02864000
         INSTRUCTION = Q + 2,                                  <<02010>>02866000
         CST'ENTRY = Q + 3,                                    <<02010>>02868000
         DELTAP = Q - 2,                                       <<02010>>02870000
         STATUS = Q - 1;                                       <<02010>>02872000
                                                               <<02010>>02874000
                                                               <<02010>>02876000
    COMMENT   THIS CODE IS BEING ADDED FOR THE SERIES 44.      <<02010>>02878000
              WHEN A USER TRAP OCCURS ON A DOUBLE WORD COBOL   <<02010>>02880000
              INSTRUCTION, THE X REG CONTAINS THE FIRST WORD   <<02010>>02882000
              OF THE INSTRUCTION (%020477).  HOWEVER, FOR THE  <<02010>>02884000
              DOUBLE WORD INSTRUCTION "CVND", COBOL EXPECTS TO <<02010>>02886000
              SEE THE SECOND WORD IN THE X REGISTER.  THIS ONE <<02010>>02888000
              EXCEPTION IS BEING DONE HERE TO INSURE THAT THE  <<02010>>02890000
              CODE SEGMENT IS NOT SWAPPED OUT AND THE DELTA P  <<02010>>02892000
              CAN BE ADJUSTED CORRECTLY.                       <<02010>>02894000
              NOTE : COMING INTO THIS PROCEDURE, DELTA P POINTS<<02010>>02896000
              TO THE NEXT TRUE INST. AFTER THE DOUBLE WORD     <<02010>>02898000
              COBOL INSTRUCTION. THEREFORE, TO GET THE SECOND  <<02010>>02900000
              WORD, WE WILL DECREMENT P BY 1                   <<02010>>02902000
;                                                              <<02010>>02904000
                                                               <<02010>>02906000
   ASMB(ADDS 2);                                               <<02010>>02908000
   INSTRUCTION := X;       <<SAVE CURRENT INST>>               <<02010>>02910000
   IF INSTRUCTION = %020477   <<SERIES 44 AND 55>>             <<02010>>02912000
      THEN BEGIN                                               <<02010>>02914000
          IF CST > %300                                        <<02010>>02916000
             THEN CST'ENTRY := (CST-%300)*4+CSTX'BASE          <<02010>>02918000
             ELSE CST'ENTRY := CST*4+CST'BASE;                 <<02010>>02920000
             X := CST'ENTRY + 2;                               <<02010>>02922000
             ASMB(PLDA);                                       <<02010>>02924000
             X := X + 1;                                       <<02010>>02926000
             ASMB(PLDA);              <<GET CST ADDRESS>>      <<02010>>02928000
             TOS := TOS + DELTAP - 1;   <<ADR OF 2ND WORD>>    <<02010>>02930000
             ASMB(LSEA);                                       <<02010>>02932000
             X := TOS;                                         <<02010>>02934000
           END;                                                <<02010>>02936000
                                                               <<02010>>02938000
   ENABLE;                                                              02940000
   ABORT([8/1,8/0],PARAM,0);                                            02942000
   END;                                                                 02944000
                                                                        02946000
PROCEDURE CODEABSENCE;                                         <<MPEIV>>02948000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                         <<MPEIV>>02950000
                                                               <<MPEIV>>02952000
COMMENT                                                        <<MPEIV>>02954000
                                                               <<MPEIV>>02956000
CODEABSENCE IS THE INTERNAL INTERRUPT HANDLER FOR PCAL AND     <<MPEIV>>02958000
EXIT REFERENCES TO ABSENT SEGMENTS.  CODEABSENCE RUNS ON THE   <<MPEIV>>02960000
TRAPPING PROCESS' STACK WITH THE FOLLOWING ENVIRONMENT SET     <<MPEIV>>02962000
UP BY FIRMWARE :                                               <<MPEIV>>02964000
                                                               <<MPEIV>>02966000
X REGISTER-                                                    <<MPEIV>>02968000
   THE INSTRUCTION CAUSING THE ABSENCE TRAP IS PLACED BY       <<MPEIV>>02970000
   FIRMWARE INTO THE INDEX REGISTER.                           <<MPEIV>>02972000
                                                               <<MPEIV>>02974000
Q+1 FIRMWARE PARAMETER -                                       <<MPEIV>>02976000
   IF ABSENT ON AN EXIT THEN N = # OF PROCEDURE PARAMETERS     <<MPEIV>>02978000
   TO BE PEELED OFF THE STACK.                                 <<MPEIV>>02980000
   IF ABSENT ON A PCAL, THEN =PLABEL WHERE (3:7)=CSTXEIX AND   <<MPEIV>>02982000
   (10:6) =ENTRY NUMBER.                                       <<MPEIV>>02984000
                                                               <<MPEIV>>02986000
STACK MARKERS-                                                 <<MPEIV>>02988000
IF PCAL, TWO STACK MARKERS. THE FIRST MARKER IS THE NORMAL     <<MPEIV>>02990000
MARKER SET UP BY FIRMWARE FOR A PCAL SO THAT CONTROL AND       <<MPEIV>>02992000
RETURN ON EXIT. THE SECOND MARKER CONTAINS GARBAGE DELTA       <<MPEIV>>02994000
P, DELTA Q = 4, AND STATUS WITH THE CST NUMBER OF THE SEGMENT  <<MPEIV>>02996000
THE PCAL WAS GOING TO IN IT.  CODEABSENCE WILL FIX UP THIS     <<MPEIV>>02998000
MARKER AFTER THE REQUIRED SEG COMES IN BY LOOKING UP THE       <<MPEIV>>03000000
DELTA P IN THE NEW SEGMMENT VIA THE STT, PLACING THIS INTO     <<MPEIV>>03002000
THE STACK MARKER.  THIS MARKER WILL THEN BE EXITED INTO.       <<MPEIV>>03004000
                                                               <<MPEIV>>03006000
FOR EXITS, THERE'S ONLY ONE STACK MARKER, THE REGULAR OLD      <<MPEIV>>03008000
ONE.  WHEN THE SEGMENT COMES IN, CODEABSENCE WILL RETRY THE    <<MPEIV>>03010000
EXIT WITH THE N VALUE OBTAINED FROM FIRMWARE'S PARAMETER.      <<MPEIV>>03012000
                                                               <<MPEIV>>03014000
TO GET THE SEGMENT INTO MEMORY, CODEABSENCE HAS AN SLL ENTRY   <<MPEIV>>03016000
BUILT FOR THE SEGMENT IN THE PROCESS' SLL AND POINTS THE SLL   <<MPEIV>>03018000
MEMORY POINTER AT IT.  WAIT IS CALLED, WAITING ON MEMORY       <<MPEIV>>03020000
ATTENTION                                                      <<MPEIV>>03022000
                                                               <<MPEIV>>03024000
;                                                              <<MPEIV>>03026000
                                                               <<MPEIV>>03028000
BEGIN                                                          <<MPEIV>>03030000
                                                               <<MPEIV>>03032000
INTEGER S0=S-0,                                                <<MPEIV>>03034000
        S1=S-1,                                                <<MPEIV>>03036000
        PCALSTATUS=Q-5,                                        <<01949>>03038000
        STATUS=Q-1;                                            <<MPEIV>>03040000
INTEGER FIRMWAREPARM=Q+1,                                      <<03040>>03042000
        PROCINX=Q+6,                                           <<03040>>03044000
        CSTXEIX=Q+7,                                           <<03040>>03046000
        SLLINX=Q+8,                                            <<03040>>03048000
        DESCSTINX=Q+9;                                         <<03040>>03050000
LOGICAL SEGIDENTIFIER=Q+10,                                    <<03040>>03052000
        INSTR=Q+2,                                             <<03040>>03054000
        PCALFLAG=Q+3,                                          <<03040>>03056000
        TRACE=Q+11;                                            <<03040>>03058000
DOUBLE SAVEDB=Q+4;                                             <<03040>>03060000
                                                               <<03040>>03062000
SUBROUTINE ABORT'PROC (MODE,CODE,ABORT'PARM);                  <<03040>>03064000
   VALUE MODE,CODE,ABORT'PARM;                                 <<03040>>03066000
   INTEGER MODE,CODE,ABORT'PARM;                               <<03040>>03068000
BEGIN                                                          <<03040>>03070000
   COMMENT:  THIS CODE PLACES THE INSTRUCTION IN X AND         <<03040>>03072000
      CALLS ABORT. MODE.(8:8), CODE AND ABORT'PARM ARE AS      <<03040>>03074000
      DEFINED FOR ABORT;                                       <<03040>>03076000
   X := INSTR;                                                 <<03040>>03078000
   << POP GARBAGE MARKER LAID DOWN FOR PCALS >>                <<03040>>03080000
   MODE.(0:8) := IF PCALFLAG THEN 2 ELSE 1;                    <<03040>>03082000
   ABORT (MODE,CODE,ABORT'PARM);                               <<03040>>03084000
END;                                                           <<03040>>03086000
                                                               <<03040>>03088000
TOS := X; << SET UP INSTR >>                                   <<03040>>03090000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) > 0 THEN         <<02090>>03092000
                                                               <<02090>>03094000
   COMMENT:  The purpose of the following code is to cover up  <<02090>>03096000
             a pdisable problem in which an interrupt handler  <<02090>>03098000
             appears to execute a pdisable without a           <<02090>>03100000
             corresponding penable.  This strange problem      <<02090>>03102000
             always appears to leave the pdisable count at 1.  <<02090>>03104000
             If this condition is met, we shall execute a      <<02090>>03106000
             penable on behalf of the defective software       <<02090>>03108000
             [a small prayer is in order here] and continue    <<02090>>03110000
             execution.  Otherwise we shall HALT the machine.  <<02090>>03112000
             Previously, the software crashed the machine      <<02090>>03114000
             with a SUDDENDEATH(644).  When this problem is    <<02090>>03116000
             corrected the SUDDENDEATH should be implemented;  <<02090>>03118000
                                                               <<02090>>03120000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) = 1 THEN      <<02090>>03122000
      PENABLE   <<It's a miracle>>                             <<02090>>03124000
   ELSE                                                        <<02090>>03126000
      IF TRUE THEN                                             <<02090>>03128000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02090>>03130000
      ELSE                                                     <<02090>>03132000
         SUDDENDEATH(644);  <<Leave the SF hook in>>           <<02090>>03134000
                                                               <<02090>>03136000
                                                               <<MPEIV>>03138000
TRAPSOFF;                                                      <<01858>>03140000
PDISABLE;                                                      <<MPEIV>>03142000
ENABLE;                                                        <<MPEIV>>03144000
                                                               <<MPEIV>>03146000
<<FILL IN THE LOCAL VARIABLES>>                                <<MPEIV>>03148000
Comment  If we have a code absence for a PCAL instruction,     <<04269>>03150000
         and we get a control Y pseudo interrupt while waiting <<04269>>03152000
         for the segment to come in , the delayed control Y    <<04269>>03154000
         flag is set in the delta P by PSEUDOINT inside of     <<04269>>03156000
         bit (0:1). However, when the code segment is brought  <<04269>>03158000
         in, the top two bits of the delta P word will be set  <<04269>>03160000
         to zero (in the old code), and the delayed control Y  <<04269>>03162000
         will be forever lost. Now the garbage delta P is set  <<04269>>03164000
         to zero before queueing on the segment, and the delta <<04269>>03166000
         P which is restored does not mask off bit 0.          <<04269>>03168000
;                                                              <<04269>>03170000
                                                               <<MPEIV>>03172000
IF FIRMWAREPARM < 0 THEN  << it's a PCAL >>                    <<04269>>03174000
   BEGIN                                                       <<04269>>03176000
   P := 0; << delta P in the marker for the absent segment >>  <<04269>>03178000
   TOS := TRUE;                                                <<04269>>03180000
   END                                                         <<04269>>03182000
ELSE                                                           <<04269>>03184000
   TOS := FALSE;                                               <<04269>>03186000
TOS:=%1000D;                                                   <<MPEIV>>03188000
X:=ABSOLUTE(CPCB)-S0;                                          <<MPEIV>>03190000
ASMB(XCHD); <<FILLS IN SAVEDB>>                                <<MPEIV>>03192000
TOS:=X;<<PROCINX>>                                             <<MPEIV>>03194000
TOS:=PBX;<<CSTXEIX>>                                           <<MPEIV>>03196000
TOS:=SLLPTR; <<SLLINX>>                                        <<MPEIV>>03198000
<<FORM SEGIDENTIFIER>>                                         <<MPEIV>>03200000
TOS:=STATUS.(8:8); <<MASK OFF ENTRY NUMBER>>                   <<MPEIV>>03202000
TOS:=S0-%300;                                                  <<MPEIV>>03204000
IF < THEN                                                      <<MPEIV>>03206000
   BEGIN <<SL SEG>>                                            <<MPEIV>>03208000
   ASMB(DEL);                                                  <<MPEIV>>03210000
   TOS:=TOS&LSL(2)+DFC;  <<DESCSTINX>>                         <<MPEIV>>03212000
   TOS:=BUILDSEGID(1,STATUS.(8:8),0);                          <<MPEIV>>03214000
   END                                                         <<MPEIV>>03216000
ELSE                                                           <<MPEIV>>03218000
   BEGIN <<CSTX BLOCK SEG>>                                    <<MPEIV>>03220000
   ASMB(DELB);                                                 <<MPEIV>>03222000
   TOS:=TOS&LSL(2)+CSTXBLK(CSTXEIX);  <<DESCSTINX PARM>>       <<MPEIV>>03224000
   TOS:=BUILDSEGID(2,STATUS.(8:8),                             <<MPEIV>>03226000
   (ABSOLUTE(CPCB)-ABSOLUTE(PCBB))/PCBSIZE);                   <<MPEIV>>03228000
   END;                                                        <<MPEIV>>03230000
TOS:=FALSE; <<FILL IN TRACE FLAG LATER>>                       <<MPEIV>>03232000
IF DST(DESCSTINX).CODESIZEFIELD = 0 THEN                       <<MPEIV>>03234000
   BEGIN <<BAD ENTRY>>                                         <<MPEIV>>03236000
   DST(X).REFERENCEDFLAG:=0;PENABLE;                           <<MPEIV>>03238000
   ABORT'PROC (0,30,0);RETURN;                                 <<03040>>03240000
   END;                                                        <<MPEIV>>03242000
IF LOGICAL(DST(X:=DESCSTINX+1)).ROCFLAG THEN                   <<MPEIV>>03244000
   BEGIN <<RECOVERABLE>>                                       <<MPEIV>>03246000
   RECOVEROC(SEGIDENTIFIER,DESCSTINX);                         <<MPEIV>>03248000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<MPEIV>>03250000
      BEGIN  <<MEASURE RECOVERY OF CODE OVERLAY CANDIDATE>>    <<MPEIV>>03252000
      TOS:=MEASSTATXDSBANK;                                    <<MPEIV>>03254000
      TOS:=MEASSTATXDSBASE;                                    <<MPEIV>>03256000
      TOS:=TOS+C0SUB0'SEGRELOFF;                               <<MPEIV>>03258000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN                       <<MPEIV>>03260000
         TOS:=TOS+C'PBXRECOVERY                                <<MPEIV>>03262000
         ELSE TOS:=TOS+C'SLRECOVERY;                           <<MPEIV>>03264000
      ASMB(LSEA;INCA;SSEA;DDEL);                               <<MPEIV>>03266000
      END;                                                     <<MPEIV>>03268000
   END                                                         <<MPEIV>>03270000
ELSE                                                           <<MPEIV>>03272000
   BEGIN<<ENTER REQUEST FOR SEG AND WAIT>>                     <<02014>>03274000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<02014>>03276000
      BEGIN  <<MEASURE CODE TRAP EVENT>>                       <<02014>>03278000
      TOS:=MEASSTATXDSBANK;                                    <<02014>>03280000
      TOS:=MEASSTATXDSBASE;                                    <<02014>>03282000
      TOS:=TOS+C0SUB0'SEGRELOFF;                               <<02014>>03284000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN                       <<02014>>03286000
         TOS:=TOS+C'STOPPBXFAULT                               <<02014>>03288000
         ELSE TOS:=TOS+C'STOPSLFAULT;                          <<02014>>03290000
      ASMB(LSEA;INCA;SSEA;DDEL);                               <<02014>>03292000
      END;                                                     <<02014>>03294000
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<02014>>03296000
      BEGIN <<PROCESS LEVEL PBX OR SL SEG FAULT>>              <<02014>>03298000
      TOS:=MEASPROCXDSBANK;                                    <<02014>>03300000
      TOS:=MEASPROCXDSBASE;                                    <<02014>>03302000
      TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*                <<02014>>03304000
           CLASS15'SUB0SIZE;                                   <<02014>>03306000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN                       <<02014>>03308000
         TOS:=TOS+CP'STOPPBXFAULT                              <<02014>>03310000
         ELSE TOS:=TOS+CP'STOPSLFAULT;                         <<02014>>03312000
      ASMB(LSEA);                                              <<02014>>03314000
      TOS:=TOS+1;                                              <<02014>>03316000
      ASMB(SSEA;DDEL);                                         <<02014>>03318000
      END;                                                     <<02014>>03320000
   <<STUFF AWAY REASON STOPPED IN PCBX OF THIS PROCESS>>       <<02014>>03322000
   <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>     <<02014>>03324000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBANKCELL);                      <<02014>>03326000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBASECELL);                      <<02014>>03328000
   TOS:=TOS+PXGLOBSIZE+MEASSTOPREASON'IDX;                     <<02014>>03330000
   TOS:=STOPSEGFAULT;                                          <<02014>>03332000
   ASMB(SSEA;DDEL);                                            <<02014>>03334000
   TOS:=SAVEDB;                                                <<02014>>03336000
   ASMB(XCHD);                                                 <<02014>>03338000
   DO                                                          <<02014>>03340000
      BEGIN                                                    <<02014>>03342000
      QUEUEONSEGMENT(SEGIDENTIFIER);                           <<02014>>03344000
      PDISABLE;                                                <<02014>>03346000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN DESCSTINX:=           <<02014>>03348000
       CONVSEGIDTOSTINX(SEGIDENTIFIER); <<MAY HAVE MOVED>>     <<02014>>03350000
      END                                                      <<02014>>03352000
   UNTIL DST(DESCSTINX) > 0;                                   <<02014>>03354000
   ASMB(XCHD);                                                 <<02014>>03356000
   SAVEDB:=TOS;                                                <<02014>>03358000
   <<THE REQUIRED SEGMENT IS AROUND NOW>>                      <<02014>>03360000
   END;                                                        <<MPEIV>>03362000
IF NOT PCALFLAG THEN                                           <<MPEIV>>03364000
   BEGIN <<RETRY EXIT>>                                        <<MPEIV>>03366000
                                                               <<04528>>03368000
   COMMENT :                                                   <<04528>>03370000
                                                               <<04528>>03372000
      The code below will avert a SF10 with a process          <<04528>>03374000
    which has a corrupted stack marker.                        <<04528>>03376000
                                                               <<04528>>03378000
   ;                                                           <<04528>>03380000
                                                               <<04528>>03382000
   IF INTEGER(LOGICAL(P) LAND %37777) >                        <<04528>>03384000
      DST(DESCSTINX).CODESIZEFIELD&LSL(2) AND                  <<04528>>03386000
      (CPCBPSIM <> 5) AND (CPCBDELAYSOFT <> 1) THEN            <<04528>>03388000
      BEGIN                                                    <<04528>>03390000
      ABORT'PROC ( 0, 24, 0 );   << BOUNDS VIOLATION >>        <<04528>>03392000
      RETURN                                                   <<04528>>03394000
      END;                                                     <<04528>>03396000
   TOS:=SAVEDB;                                                <<MPEIV>>03398000
   ASMB(XCHD);                                                 <<MPEIV>>03400000
   TOS:=LOGICAL(FIRMWAREPARM) LOR %31400;                      <<MPEIV>>03402000
   PENABLE;                                                    <<MPEIV>>03404000
   ASMB(XEQ 0);                                                <<MPEIV>>03406000
   END                                                         <<MPEIV>>03408000
ELSE                                                           <<MPEIV>>03410000
   BEGIN <<MAKE PCAL TESTS FOR FIRMWARE>>                      <<MPEIV>>03412000
   X:=DSTSYSBASEINX+CONVSEGIDTOSTINX(SEGIDENTIFIER);           <<MPEIV>>03414000
   IF SEGDESCFIRMINFO.TRACEFLAG=1 THEN TRACE:=TRUE;            <<MPEIV>>03416000
   TOS:=SEGDESCBANK;                                           <<MPEIV>>03418000
   TOS:=SEGDESCADDR;                                           <<MPEIV>>03420000
   TOS:=SEGDESCFIRMINFO.CODESIZEFIELD&LSL(2)-1; <<PL(0)>>      <<MPEIV>>03422000
   ASMB(LADD;LSEA);                                            <<MPEIV>>03424000
   TOS:=TOS.(8:8);  <<NUMBER OF STT ENTRIES FOR SEGMENT>>      <<MPEIV>>03426000
   TOS:=FIRMWAREPARM.(1:7); <<TARGET STT #>>                   <<MPEIV>>03428000
   IF S0 > S1 THEN                                             <<MPEIV>>03430000
      BEGIN <<STT IS TOO LARGE>>                               <<MPEIV>>03432000
      TOS:=SAVEDB;                                             <<MPEIV>>03434000
      ASMB(XCHD);                                              <<MPEIV>>03436000
      PENABLE;                                                 <<MPEIV>>03438000
      ABORT'PROC (0,31,0);  <<BADSTT>>                         <<03040>>03440000
      RETURN;                                                  <<MPEIV>>03442000
      END;                                                     <<MPEIV>>03444000
   ASMB(DELB,LSUB;LSEA);                                       <<MPEIV>>03446000
   IF < THEN                                                   <<MPEIV>>03448000
      BEGIN <<STT BEING REFERENCED IS EXTERNAL>>               <<MPEIV>>03450000
      TOS:=SAVEDB;ASMB(XCHD);PENABLE;                          <<MPEIV>>03452000
      ABORT'PROC (0,31,0);  <<EXTSTTREF>>                      <<03040>>03454000
      RETURN;                                                  <<MPEIV>>03456000
      END;                                                     <<MPEIV>>03458000
   ASMB(TBC UNCALLABLEBIT);                                    <<MPEIV>>03460000
   IF <> THEN                                                  <<MPEIV>>03462000
      BEGIN <<ENTRY IS UNCALLABLE>>                            <<MPEIV>>03464000
      IF (PCALFLAG LAND PCALSTATUS>=0)                         <<01949>>03466000
      LOR (NOT PCALFLAG LAND STATUS>=0) THEN                   <<01949>>03468000
         BEGIN <<NOT PRIVILEGED>>                              <<MPEIV>>03470000
         TOS:=SAVEDB;                                          <<MPEIV>>03472000
         ASMB(XCHD);                                           <<MPEIV>>03474000
         PENABLE;                                              <<MPEIV>>03476000
         ABORT'PROC (0,17,0);  <<UNCALLABLEREF>>               <<03040>>03478000
         RETURN;                                               <<MPEIV>>03480000
         END;                                                  <<MPEIV>>03482000
      END;                                                     <<MPEIV>>03484000
                                                               <<MPEIV>>03486000
   <<PUT THE DELTA P INTO THE SECOND STACK MARKER>>            <<MPEIV>>03488000
                                                               <<MPEIV>>03490000
   TOS := TOS LAND %37777; << mask off delta P >>              <<04269>>03492000
   TOS := P;                                                   <<04269>>03494000
   P := TOS LOR TOS;                                           <<04269>>03496000
   IF P.(2:14) > DST(DESCSTINX).CODESIZEFIELD&LSL(2)           <<04269>>03498000
   THEN SUDDENDEATH(645);                                      <<01687>>03500000
                                                               <<MPEIV>>03502000
   <<CHECK IF SEGMENT IS BEING TRACED>>                        <<MPEIV>>03504000
                                                               <<MPEIV>>03506000
   IF TRACE THEN                                               <<MPEIV>>03508000
      BEGIN                                                    <<MPEIV>>03510000
      TOS:=ABSOLUTE(TRACELABEL);                               <<MPEIV>>03512000
      IF < THEN                                                <<MPEIV>>03514000
         BEGIN                                                 <<MPEIV>>03516000
         DISABLE;                                              <<MPEIV>>03518000
         ASMB(PCAL 0);                                         <<MPEIV>>03520000
         END                                                   <<MPEIV>>03522000
      ELSE                                                     <<MPEIV>>03524000
         BEGIN <<TRACE ROUTINE ISN'T AROUND>>                  <<MPEIV>>03526000
         TOS:=SAVEDB;ASMB(XCHD);PENABLE;                       <<03040>>03528000
         ABORT'PROC (0,22,0);  <<TRACEABS>>                    <<03040>>03530000
         END;                                                  <<MPEIV>>03532000
      END;                                                     <<MPEIV>>03534000
   TOS:=SAVEDB;                                                <<MPEIV>>03536000
   ASMB(XCHD);                                                 <<MPEIV>>03538000
   PENABLE;                                                    <<MPEIV>>03540000
   END;                                                        <<MPEIV>>03542000
END  <<CODEABSENCE>>;                                          <<MPEIV>>03544000
                                                               <<MPEIV>>03546000
                                                                        03548000
PROCEDURE  TRACE;                                                       03550000
   OPTION PRIVILEGED,UNCALLABLE;                                        03552000
   BEGIN                                                                03554000
   DEFINE  PSIM = (0:3)#;  << PSEUDO INTERRUPT MODE >>                  03556000
   INTEGER  INST = Q+2; << LAST INSTRUCTION FROM X REG >>               03558000
                                                               <<03040>>03560000
   SUBROUTINE ABORT'PROC (MODE,CODE,ABORT'PARM);               <<03040>>03562000
      VALUE MODE,CODE,ABORT'PARM;                              <<03040>>03564000
      INTEGER MODE,CODE,ABORT'PARM;                            <<03040>>03566000
   BEGIN                                                       <<03040>>03568000
      COMMENT:  THIS CODE PLACES THE INSTRUCTION IN X          <<03040>>03570000
         AND CALLS ABORT. MODE, CODE AND ABORT'PARM ARE        <<03040>>03572000
         AS DEFINED FOR ABORT;                                 <<03040>>03574000
      X := INST;                                               <<03040>>03576000
      ABORT (MODE,CODE,ABORT'PARM);                            <<03040>>03578000
   END;                                                        <<03040>>03580000
                                                                        03582000
   TOS := X;                                                            03584000
   TOS := PARAM;                                                        03586000
   IF  <  THEN   << PCAL >>                                             03588000
      BEGIN                                                             03590000
      TOS := TOS.(8:8); << GET CST NUMBER >>                            03592000
      ASMB(DUP);                                                        03594000
      IF TOS < %300 THEN X := 0 ELSE                                    03596000
      BEGIN                                                             03598000
         X := 1;                                                        03600000
         TOS := TOS - %300;                                             03602000
      END;                                                              03604000
      TOS := F(TOS&LSL(2) + F(X) + 2); << BANK # >>                     03606000
      TOS := F(X := X + 1); << BANK OFFSET >>                           03608000
      TOS := TOS + F(X := X - 3).(4:12)&LSL(2) - 1 - PARAM.(1:7);       03610000
      ASMB(LSEA); << GET STT OF CALLED SEGMENT >>                       03612000
      IF < THEN SUDDENDEATH(289);                                       03614000
      P := TOS.(2:14);                                                  03616000
      DDEL;                                                             03618000
      TOS := PARAM;                                                     03620000
      TOS := INST;                                                      03622000
      TOS := 0;                                                         03624000
      TOS := F(TRACELABEL);                                             03626000
      IF < THEN                                                         03628000
      BEGIN                                                             03630000
         ASMB(PCAL 0);                                                  03632000
         RETURN;                                                        03634000
      END;                                                              03636000
      ENABLE;                                                           03638000
      ABORT'PROC ([8/2,8/0],22,0);<<POP DESTINATION MARKER>>   <<03040>>03640000
      END                                                               03642000
   ELSE                                                                 03644000
      BEGIN  << EXIT >>                                                 03646000
      TOS := P;                                                         03648000
      TOS.(0:1) := 0;                                                   03650000
      TOS.(1:1) := 0;                                                   03652000
      P := TOS;                                                         03654000
      IF  =  THEN                                                       03656000
         BEGIN  <<DELAYED CONTROL-Y OR SOFTWARE INTERRUPT>>    <<03040>>03658000
         IF CPCBPSIM = 5 OR CPCBDELAYSOFT = 1 THEN             <<03040>>03660000
            DELAYEDINT                                         <<03040>>03662000
         ELSE                                                  <<03040>>03664000
            ABORT'PROC ([8/1,8/0],22,0);                      <<HM.XX>> 03666000
         END ELSE                                                       03668000
         BEGIN << EXIT TRACE >>                                         03670000
            IF DELTAQ < 0 THEN DELTAQ.(0:1) := 0; << SET DEL Q POS >>   03672000
            TOS := PARAM;                                               03674000
            TOS := INST;                                                03676000
            TOS := 0;                                                   03678000
            TOS := F(TRACELABEL);                                       03680000
            IF <> THEN ASMB(PCAL 0) ELSE                                03682000
            BEGIN                                                       03684000
               ENABLE;                                                  03686000
               ABORT'PROC ([8/1,8/0],22,0);                    <<03040>>03688000
            END;                                                        03690000
         END;                                                           03692000
      TOS := TOS LOR %31400;                                            03694000
      ASMB( XEQ 0 );                                                    03696000
      HELP;  << DUMMY CALL FOR LINKING WITH DEBUGGER >>                 03698000
      END;                                                              03700000
   END;                                                                 03702000
                                                                        03704000
PROCEDURE  STTUNCALLABLE;                                               03706000
   OPTION PRIVILEGED,UNCALLABLE;                                        03708000
   BEGIN                                                                03710000
   ENABLE;                                                              03712000
   << ABORT WITH INSTR. IN XREG >>                             <<03040>>03714000
   ABORT([8/1,8/0],17,0);                                               03716000
   END;                                                                 03718000
                                                                        03720000
                                                               <<MPEIV>>03722000
PROCEDURE DATAABSENCE;                                         <<MPEIV>>03724000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                         <<MPEIV>>03726000
                                                               <<MPEIV>>03728000
COMMENT                                                        <<MPEIV>>03730000
                                                               <<MPEIV>>03732000
DATAABSENCE IS THE INTERNAL INTERRUPT HANDLER FOR MOVES        <<MPEIV>>03734000
ATTEMPTED TO AN ABSENT DATA SEGMENT. DATAABSENCE RUNS ON       <<MPEIV>>03736000
THE TRAPPING PROCESS' STACK, AND FIRMWARE HAS PUSHED THE       <<MPEIV>>03738000
TARGET DATA SEGMENT NUMBER INTO Q+1. THE PROCESS ATTEMPT-      <<MPEIV>>03740000
ING THE MOVE WILL HAVE AN ENTRY FOR THE REQUIRED SEGMENT       <<MPEIV>>03742000
PLACED IN ITS SLL WITH THE SLL MEMORY POINTER AIMED AT IT.     <<MPEIV>>03744000
THE PROCESS WILL THEN BE WAITED UNTIL THE SEG IS MADE          <<MPEIV>>03746000
PRESENT, THEN THE MOVE WILL BE RETRIED BY DECREMENTING         <<MPEIV>>03748000
THE P REGISTER VALUE IN THE STACK MARKER AND EXITING.          <<MPEIV>>03750000
                                                               <<MPEIV>>03752000
;                                                              <<MPEIV>>03754000
                                                               <<MPEIV>>03756000
BEGIN                                                          <<MPEIV>>03758000
                                                               <<MPEIV>>03760000
INTEGER FIRMWAREPARM=Q+1,                                      <<03040>>03762000
        INSTR=Q+2,                                             <<03040>>03764000
        S0=S-0;                                                <<03040>>03766000
                                                               <<03040>>03768000
TOS := X; << SET UP INSTR >>                                   <<03040>>03770000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) > 0 THEN         <<02090>>03772000
                                                               <<02090>>03774000
   COMMENT:  The purpose of the following code is to cover up  <<02090>>03776000
             a pdisable problem in which an interrupt handler  <<02090>>03778000
             appears to execute a pdisable without a           <<02090>>03780000
             corresponding penable.  This strange problem      <<02090>>03782000
             always appears to leave the pdisable count at 1.  <<02090>>03784000
             If this condition is met, we shall execute a      <<02090>>03786000
             penable on behalf of the defective software       <<02090>>03788000
             [a small prayer is in order here] and continue    <<02090>>03790000
             execution.  Otherwise we shall HALT the machine.  <<02090>>03792000
             Previously, the software crashed the machine      <<02090>>03794000
             with a SUDDENDEATH(644).  When this problem is    <<02090>>03796000
             corrected the SUDDENDEATH should be implemented;  <<02090>>03798000
                                                               <<02090>>03800000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) = 1     THEN  <<02090>>03802000
      PENABLE   <<It's a miracle>>                             <<02090>>03804000
   ELSE                                                        <<02090>>03806000
      IF TRUE THEN                                             <<02090>>03808000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02090>>03810000
      ELSE                                                     <<02090>>03812000
         SUDDENDEATH(644);  <<Leave the SF hook in>>           <<02090>>03814000
                                                               <<02090>>03816000
                                                               <<MPEIV>>03818000
TRAPSOFF;                                                      <<01858>>03820000
PDISABLE;                                                      <<MPEIV>>03822000
DISABLE;                                                       <<MPEIV>>03824000
<<IF FIRMWAREPARM = ABSOLUTE(ABSOLUTE(4)+3).(1:10) THEN HELP>> <<MPEIV>>03826000
IF DST(X:=FIRMWAREPARM&LSL(2)).DATASIZEFIELD = 0 THEN          <<MPEIV>>03828000
   BEGIN <<DAD DST ENTRY>>                                     <<MPEIV>>03830000
   DST(X).REFERENCEDFLAG:=0;                                   <<MPEIV>>03832000
   PENABLE;X:=INSTR;ABORT([8/1,8/0],17,0);RETURN;              <<03040>>03834000
   END;                                                        <<MPEIV>>03836000
IF LOGICAL(DST(X:=FIRMWAREPARM&LSL(2)+1)).ROCFLAG THEN         <<MPEIV>>03838000
   BEGIN  <<RECOVERABLE>>                                      <<MPEIV>>03840000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<MPEIV>>03842000
      BEGIN  <<MEASURE DATA SEG RECOVERY>>                     <<MPEIV>>03844000
      TOS:=MEASSTATXDSBANK;                                    <<MPEIV>>03846000
      TOS:=MEASSTATXDSBASE;                                    <<MPEIV>>03848000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'DATARECOVERY;                <<MPEIV>>03850000
      ASMB(LSEA);                                              <<MPEIV>>03852000
      TOS:=TOS+1;                                              <<MPEIV>>03854000
      ASMB(SSEA;DDEL);                                         <<MPEIV>>03856000
      END;                                                     <<MPEIV>>03858000
   TOS:=%1000D;                                                <<MPEIV>>03860000
   X:=ABSOLUTE(CPCB)-S0;                                       <<MPEIV>>03862000
   ASMB(XCHD);                                                 <<MPEIV>>03864000
   RECOVEROC(FIRMWAREPARM,FIRMWAREPARM&LSL(2));                <<MPEIV>>03866000
   ASMB(XCHD);                                                 <<MPEIV>>03868000
   PENABLE;                                                    <<MPEIV>>03870000
   END                                                         <<MPEIV>>03872000
ELSE                                                           <<MPEIV>>03874000
   BEGIN                                                       <<MPEIV>>03876000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<02014>>03878000
      BEGIN  <<MEASURE DATA TRAP EVENT>>                       <<02014>>03880000
      TOS:=MEASSTATXDSBANK;                                    <<02014>>03882000
      TOS:=MEASSTATXDSBASE;                                    <<02014>>03884000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPDATAFAULT;               <<02014>>03886000
      ASMB(LSEA);                                              <<02014>>03888000
      TOS:=TOS+1;                                              <<02014>>03890000
      ASMB(SSEA;DDEL);                                         <<02014>>03892000
      END;                                                     <<02014>>03894000
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<02014>>03896000
      BEGIN <<PROCESS LEVEL DATASEG FAULT>>                    <<02014>>03898000
      TOS:=MEASPROCXDSBANK;                                    <<02014>>03900000
      TOS:=MEASPROCXDSBASE;                                    <<02014>>03902000
      TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*                <<02014>>03904000
           CLASS15'SUB0SIZE+CP'STOPDSTFAULT;                   <<02014>>03906000
      ASMB(LSEA);                                              <<02014>>03908000
      TOS:=TOS+1;                                              <<02014>>03910000
      ASMB(SSEA;DDEL);                                         <<02014>>03912000
      END;                                                     <<02014>>03914000
   <<STUFF AWAY REASON STOPPED IN PCBX OF THIS PROCESS>>       <<02014>>03916000
   <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>     <<02014>>03918000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBANKCELL);                      <<02014>>03920000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBASECELL);                      <<02014>>03922000
   TOS:=TOS+PXGLOBSIZE+MEASSTOPREASON'IDX;                     <<02014>>03924000
   TOS:=STOPSEGFAULT;                                          <<02014>>03926000
   ASMB(SSEA;DDEL);                                            <<02014>>03928000
   QUEUEONSEGMENT(FIRMWAREPARM);                               <<02014>>03930000
 END;                                                          <<01809>>03932000
P:=P-1; <<EXIT WILL CAUSE MOVE INSTRUCTION TO BE RETRIED>>     <<MPEIV>>03934000
END  <<DATAABSENCE>>;                                          <<MPEIV>>03936000
                                                                        03938000
PROCEDURE  POWERON;                                                     03940000
   OPTION PRIVILEGED,UNCALLABLE;                                        03942000
BEGIN                                                                   03944000
                                                                        03946000
EQUATE                                                                  03948000
   ICF'44       = 3,      << CPU NUMBER>>                      <<02009>>03950000
   CSTB        = 0,     <<CST BASE>>                           <<01372>>03952000
   COMPWAIT    = %13,   << SIODM COMPLETOR WAIT STATE >>                03954000
   CONSLDEV    = %74,   << SYSDB INDEX >>                               03956000
   DDLTP       = 4,     << DLT POINTER INDEX IN DIT >>                  03958000
   DILTP       = 5,     << ILT POINTER INDEX IN DIT >>                  03960000
   DLINK       = 1,     << LINK OFFSET IN DIT >>                        03962000
   DRT3        = 3,                                                     03964000
   DRTSIZE     = 4,                                                     03966000
   DSTAT       = 6,     << STATUS INDEX IN DIT >>                       03968000
   DSTOP       = 7,     << STOP WORD OF TREM. DIT >>                    03970000
   DTYPE       = 5,     << DEV TYPE INDEX IN DLT >>                     03972000
   ENABLEINT   = %70351,<< ENABLE CLOCK INTERRUPTS >>                   03974000
   ENABLETERM  = %015510,<< ESCAPE H TO START TERMINET >>               03976000
   FHDISC      = 1,     << FHD TYPE >>                                  03978000
   ICNTRL      = 7,    << CONTROLLER INFO OF ILT >>                     03980000
   IFLAG       = 13,   << FLAGS WORD OF ILT >>                          03982000
   IMASK       = 7,    << INTERRUPT MASK WORD >>                        03984000
   LOWESTDRT   = 8,                                                     03986000
   PFPROC      = %144,  << POWERFAIL PROC SYSDB INDEX >>                03988000
   POWERFAIL   = %72,   << POWERFAIL FLAG SYSDB INDEX >>                03990000
   SCSR        = %26,   << STATUS REGISTER OF SYS CLOCK >>     <<01183>>03992000
   TEMPLR      = %22,   << TEMP STORAGE FOR LIMIT REG >>       <<01183>>03994000
   SERIES'33   = 8,     << CPU # OF SERIES 33 >>               <<01183>>03996000
   ICF'55      = 4,   <<CPU # OF ICF55>>                       <<03008>>03998000
   SYSTRL      = %12;   << TIMER REQUEST LIST PTR INDEX >>              04000000
                                                                        04002000
DEFINE                                                                  04004000
   CHANQ       = (1:6)#, << CHANNEL QUEUE NUM. IN ILT >>                04008000
   DRTNUMBER   = (7:9)#,  <<DRT NUMBER FIELD IN ILT>>          <<03008>>04010000
   CHAN'NUM    = (9:4)#,  <<4-BIT-CHANNEL NUMBER>>             <<03008>>04012000
   IMB'NUM     = (7:2)#,  <<2-BIT-IMB NUMBER>>                 <<03008>>04014000
   RIOA        = CON %20302; CON %13#, <<FOR ICF55>>           <<03008>>04016000
   DRVRDY      = (3:1)#, << DRIVE READY BIT IN DISC STATUS >>           04018000
   IAK         = (8:1)#, << INT ACK BIT OF DIT >>                       04020000
   MAXENTRY    = (0:8)#, << # OF ENTRIES IN THE LPDT >>                 04022000
   REQUEST     = (3:1)#, << SERVICE REQUEST BIT OF DFLAGS >>            04024000
   STATEF      = (12:4)#,<< SIODM STATE FIELD OF DIT >>                 04026000
   SUBTYPE     = (12:4)#,<< DEV SUBTYPE FIELD OF LPDT >>                04028000
   TRM         = (0:1)#, <<A TERMINAL DIT>>                    <<04424>>04030000
   TYPE        = (8:8)#; << TYPE FIELD OF DLT >>                        04032000
                                                                        04034000
INTEGER                                                                 04036000
   ABSQI       = Q+7,                                                   04038000
   I           = Q+6,                                                   04040000
   LR          = Q+5,                                                   04042000
   MAXDRT      = DB+%71,                                                04044000
   PARAM       = Q+3,                                                   04046000
   PF          = DB+POWERFAIL,                                          04048000
   PFAILPIN    = DB+PFPROC,                                             04050000
   SM2         = S-2,                                                   04052000
   S0            = S-0,                                       <<01.02>> 04054000
   SYSCONSOLE  = DB+CONSLDEV,                                           04056000
   SYSUP       = DB+%73; << SYSTEM UP FLAG >>                           04058000
                                                                        04060000
INTEGER POINTER                                                         04062000
  MEASINFOTABPTR = %261,  << FOR CLOCK INTERFACE >>            <<MPEIV>>04064000
   BUSY        = DB+%55,                                                04066000
   HEAD        = DB+%56,                                                04068000
   LPDT        = DB+%10,                                                04070000
   PS0         = S-0,                                                   04072000
   PS1         = S-1,                                                   04074000
   PS2         = S-2,                                                   04076000
   TRL         = DB+SYSTRL;                                             04078000
                                                                        04080000
DOUBLE POINTER                                                          04082000
   LPDTD       = LPDT;                                                  04084000
                                                               <<04147>>04086000
<< These defines are for clearing the memory RAM after >>      <<04147>>04088000
<< a powerfail.  This needs to be done since the RAM is>>      <<04147>>04090000
<< garbage after a powerfail.  It also must be done    >>      <<04147>>04092000
<< before the Memlog process is launched.              >>      <<04147>>04094000
                                                               <<04147>>04096000
integer                                                        <<04147>>04098000
   S1 = S - 1;                                                 <<04147>>04100000
                                                               <<04147>>04102000
                                                               <<04147>>04104000
define                                                         <<04147>>04106000
   DUPLICATE = assemble( DUP )#,                               <<04147>>04108000
   MCMD      = assemble( CON %20104; CON 4)#;                  <<04147>>04110000
                                                               <<04147>>04112000
                                                                        04114000
INTEGER                                                        <<03008>>04116000
  LDEV     = Q+8,                                              <<03008>>04118000
  IMB      = Q+9,                                              <<03008>>04120000
  CHANNL   = Q+10,                                             <<03008>>04122000
  CPUNUM   = Q+11,                                             <<03008>>04124000
  NRIMB    = Q+12;                                             <<03008>>04126000
ARRAY                                                          <<03008>>04128000
  TEMPMASK (*) = Q+13;                                         <<03008>>04130000
                                                               <<03008>>04132000
                                                               <<03008>>04134000
COMMENT                                                        <<03008>>04136000
============================================================== <<03008>>04138000
  POWER-FAIL SET UP THE STACK LIKE THIS:                       <<03008>>04140000
                                                               <<03008>>04142000
Q+1  DB BANK                                                   <<03008>>04144000
Q+2  DB                                                        <<03008>>04146000
Q+3  PARAM      <-- S AT ENTRY                                 <<03008>>04148000
Q+4  ADDS VALUE <-- S AFTER ADDS 1                             <<03008>>04150000
Q+5  LR                                                        <<03008>>04152000
Q+6                                                            <<03008>>04154000
Q+7  ABSQI=ABS(QI)   <-- S AFTER VALUES HAVE BEEN RESTORED     <<03008>>04156000
Q+8  CST(2)-0        (ADDITIONAL LOCALS SAFELY DECLARED HERE)  <<03008>>04158000
Q+9  CST(2)-1                                                  <<03008>>04160000
Q+10 CST(2)-2                                                  <<03008>>04162000
Q+11 CST(2)-3                                                  <<03008>>04164000
Q+12 SAVE QI-6                                                 <<03008>>04166000
Q+13 SAVE QI+3                                                 <<03008>>04168000
Q+14 SAVE QI+4                                                 <<03008>>04170000
Q+15 PUSH(S)                                                   <<03008>>04172000
Q+16 PUSH(Q)                                                   <<03008>>04174000
Q+17 PUSH(DL)   <-- S AFTER ADDS 0, READY TO POP VALUES        <<03008>>04176000
                    SET UP BY POWER-FAIL                       <<03008>>04178000
                                                               <<03008>>04180000
============================================================== <<03008>>04182000
END COMMENT;                                                   <<03008>>04184000
                                                               <<03008>>04186000
                                                               <<03008>>04188000
                                                                        04190000
   ASMB(ADDS 1;ADDS 0); << RESTORE S >>                                 04192000
   TOS := 0;                                                            04194000
   TOS := SYSDB;                                                        04196000
   SET(DB,DL,Q,S); << RESTORE OTHER REGISTERS >>                        04198000
   ABS(ABSQI+4) := TOS; << RESTORE QI + 4 >>                            04200000
   ABS(X:=X-1) := TOS;                                                  04202000
   ABS(X:=X-9) := TOS; << QI+3, AND QI-6 >>                             04204000
                                                               <<01372>>04206000
   <<RESTORE CST(2) WHICH WAS REBUILT BY POWERFAIL>>           <<01372>>04208000
                                                               <<01372>>04210000
   X:=ABS(CSTB)+11;    <<CST(2) WORD 3>>                       <<01372>>04212000
   ABS(X):=TOS;        <<WORD 3>>                              <<01372>>04214000
   ABS(X:=X-1):=TOS;   <<WORD 2>>                              <<01372>>04216000
   ABS(X:=X-1):=TOS;   <<WORD 1>>                              <<01372>>04218000
   ABS(X:=X-1):=TOS;   <<WORD 0>>                              <<01372>>04220000
                                                               <<01372>>04222000
   ASMB( ADDS 10);  <<PROTECT LOCALS Q+8 THRU Q+17>>           <<03008>>04224000
                                                               <<03008>>04226000
                                                               <<03008>>04228000
   COMMENT     CORRECT THE MASK FOR GETTING THE BANK NUMBER    <<02009>>04230000
               FOR THE ICF'44;                                 <<02009>>04232000
   ASSEMBLE(PCN);     <<GET CPU NUMBER>>                       <<02009>>04234000
   IF TOS = ICF'44 THEN                                        <<02009>>04236000
      BEGIN                                                    <<02009>>04238000
        TOS := %377;    <<BANK MASK>>                          <<02009>>04240000
        ASSEMBLE(CON %20104; CON %4);                          <<02009>>04242000
      END;                                                     <<02009>>04244000
                                                               <<02009>>04246000
   PF := 2;                                                             04248000
   TOS := LPDTD(SYSCONSOLE);                                            04250000
   DEL;   << SAVE COPY OF DITP >>                                       04252000
                                                               <<03008>>04256000
                                                               <<03008>>04258000
    <<======================================================>> <<03008>>04260000
    <<THE NORMAL OPERATIONS OF READ/SET MASK ARE COMPLICATED>> <<03008>>04262000
    <<BY THE INTRODUCTION OF A 4-WORD INTERRUPT MASK FOR THE>> <<03008>>04264000
    <<ICF/55.    FOR NON ICF/55 CPUS:                       >> <<03008>>04266000
    <<    INTERRUPT MASK STORED AT %7                       >> <<03008>>04268000
    <<    READ MASK RETURNS THE (1 WORD) MASK ON TOS        >> <<03008>>04270000
    <<    SET MASK EXPECTS  THE (1 WORD) MASK ON TOS        >> <<03008>>04272000
    <<           FOR THE ICF/55 CPU:                        >> <<03008>>04274000
    <<    INTERRUPT MASK STORED AT %32  (MASK FOR IMB 0)    >> <<03008>>04276000
    <<                             %33  (MASK FOR IMB 1)    >> <<03008>>04278000
    <<                             %34  (MASK FOR IMB 2)    >> <<03008>>04280000
    <<                             %35  (MASK FOR IMB 3)    >> <<03008>>04282000
    <<    SET MASK / READ MASK EXPECT OR RETURN TOP OF STACK>> <<03008>>04284000
    <<                             S-3  (MASK FOR IMB 3)    >> <<03008>>04286000
    <<                             S-2  (MASK FOR IMB 2)    >> <<03008>>04288000
    <<                             S-1  (MASK FOR IMB 1)    >> <<03008>>04290000
    <<                  TOS ==>    S-0  (MASK FOR IMB 0)    >> <<03008>>04292000
    <<======================================================>> <<03008>>04294000
                                                               <<03008>>04296000
                                                               <<03008>>04298000
   ASMB(PCN);           <<GET THE CPU NUMBER>>                 <<03008>>04300000
   CPUNUM := TOS;       <<AND SAVE IT>>                        <<03008>>04302000
                                                               <<03008>>04304000
   NRIMB := IF CPUNUM=ICF'55 THEN 3 ELSE 0;                    <<03008>>04306000
   IF CPUNUM=ICF'55 THEN BEGIN TOS:=-1D; TOS:=-1D; END         <<03008>>04308000
                    ELSE TOS:= -1;  <<SINGLE WORD MASK>>       <<03008>>04310000
   <<  FIND OUT WHAT IMB'S EXIST               >>              <<03008>>04312000
   <<  RMSK RETURNS ZERO IF IMB DOESN'T EXIST  >>              <<03008>>04314000
   ASSEMBLE( SMSK;                                             <<03008>>04316000
             RMSK );  << IMB 0 = S-0, IMB 3 = S-3 >>           <<03008>>04318000
   X := 0;                                                     <<03008>>04320000
   DO BEGIN                                                    <<03008>>04322000
      TEMPMASK(X) := TOS;                                      <<03008>>04324000
      X := X+1;                                                <<03008>>04326000
      END UNTIL X > NRIMB;                                     <<03008>>04328000
                                                               <<03008>>04330000
   <<  DO A ROLL CALL ON ALL IMB'S THAT EXIST  >>              <<03008>>04332000
   << RETURNS A SET BIT FOR EACH GIC THAT EXISTS ON THE IMB>>  <<03008>>04334000
   << OTHERWISE A ZEROED BIT. USE THIS INFO LATER FOR INIT>>   <<03008>>04336000
                                                               <<03008>>04338000
   X := 0;                                                     <<03008>>04340000
   DO BEGIN                                                    <<03008>>04342000
      IF TEMPMASK(X) <> 0 THEN  << IMB EXISTS? >>              <<03008>>04344000
         BEGIN                                                 <<03008>>04346000
         IF CPUNUM=ICF'55 THEN                                 <<03008>>04348000
            BEGIN                                              <<03008>>04350000
            TOS := X&LSL(7);  << FORM IMB NR. >>               <<03008>>04352000
            TOS := %120000;   << ROLL CALL    >>               <<03008>>04354000
            ASSEMBLE( RIOA );                                  <<03008>>04356000
            END                                                <<03008>>04358000
         ELSE                                                  <<03008>>04360000
            BEGIN                                              <<03008>>04362000
            TOS := %120000;   << ROLL CALL    >>               <<03008>>04364000
            ASSEMBLE( RIOC );                                  <<03008>>04366000
            END;                                               <<03008>>04368000
         TEMPMASK(X) := TOS; <<REPLACE MASK WITH ROLL CALL>>   <<03008>>04370000
         END;                                                  <<03008>>04372000
      X := X+1;                                                <<03008>>04374000
      END UNTIL X > NRIMB;                                     <<03008>>04376000
                                                               <<03008>>04378000
   <<  INITIALIZE ALL CONFIGURED GICS  >>                      <<03008>>04380000
   <<  LOOP FROM HIGHEST IMB-CHANNEL DOWN TO ZERO         >>   <<03008>>04382000
   <<     BASED ON THE IMB GET THE TEMP INT-MASK WORD     >>   <<03008>>04384000
   <<     IF THE BIT IS SET FOR THE CHANNEL (EXISTS?)     >>   <<03008>>04386000
   <<     THEN INIT THAT CHANNEL                          >>   <<03008>>04388000
                                                               <<03008>>04390000
                                                               <<03008>>04392000
   I := MAXDRT.(7:6); << DELETE DEV# >>                        <<03008>>04394000
   DO BEGIN                                                    <<03008>>04396000
      TOS := TEMPMASK(I.(10:2));  << IMB NR. >>                <<03008>>04398000
      X := I.(12:4);         << CHAN NR. >>                    <<03008>>04400000
      ASSEMBLE( TBC 0,X );                                     <<03008>>04402000
      IF <> THEN                                               <<03008>>04404000
         BEGIN                                                 <<03008>>04406000
         TOS := I&LSL(3);    << ADD DEV NR. >>                 <<03008>>04408000
         ASSEMBLE( INIT );                                     <<03008>>04410000
         END;                                                  <<03008>>04412000
      DEL;                                                     <<03008>>04414000
      I := I-1;                                                <<03008>>04416000
      END UNTIL =;                                             <<03008>>04418000
                                                               <<03008>>04420000
   I := 1;                                                              04422000
   DO                                                                   04424000
   BEGIN << STEP THROUGH LPDT AND CLEAN UP RESOURCES >>                 04426000
      TOS := LPDTD(I);                                                  04428000
      ASMB(XCH,TEST);                                                   04430000
    IF > AND (PS0(DILTP) <> 0) THEN                            <<01935>>04432000
      BEGIN << VALID DIT POINTER >>                                     04434000
         TOS := PS0(DILTP);                                             04436000
         IF GET'DSDEVICE(I) < 2 THEN                           <<01775>>04438000
           BEGIN                <<NOT A DS DEVICE>>           <<01.02>> 04440000
             X := PS0(ICNTRL).CHANQ; << I/O CHANNEL RESOURCE >>         04442000
             IF <> THEN                                       <<01.02>> 04444000
             BEGIN << FREE CHANNEL RESOURCE >>                <<01.02>> 04446000
                BUSY(X) := 0;                                 <<01.02>> 04448000
                WHILE DEQUEUE(DLINK,X) <> -1 DO;              <<01.02>> 04450000
             END;                                             <<01.02>> 04452000
             TOS := PS0(IFLAG);                                         04454000
             TOS := TOS LAND IFLAGMASKWORD; << CLEAR WAIT BIT >>        04456000
             PS1(X) := TOS;  << UPDATE FLAGS OF ILT >>                  04458000
             DEL;  << DELETE ILT POINTER >>                             04460000
             IF PS0.TRM<>1 AND PS0.STATEF = COMPWAIT THEN      <<04424>>04464000
             BEGIN << RESTART THE REQUEST >>                            04466000
                TOS := PS0; << GET DFLAGS FROM DIT >>                   04468000
                TOS.REQUEST := 1;                                       04470000
                TOS.IAK := 1;                                           04472000
                PS1 := TOS;                                             04474000
                PS0(DSTAT):=-1;  <<SET STATUS TO DISC ERROR>>           04476000
                MASTERCLEARHPIB(PS0); << CLEAR I/O CONDITION >><<01301>>04478000
             END;                                                       04480000
           END                                                          04482000
         ELSE DEL; << DELETE ILT POINTER >>                             04484000
      END;                                                              04486000
      DDEL; << DELETE LPDT ENTRY ON TOS >>                              04488000
   END UNTIL (I := I + 1) > LPDT.MAXENTRY;                              04490000
                                                               <<03008>>04494000
IMB := 0;       <<CLEAR TEMPORARY MASK WORDS>>                 <<03008>>04496000
DO TEMPMASK(IMB) := 0                                          <<03008>>04498000
UNTIL (IMB:=IMB+1) > NRIMB;                                    <<03008>>04500000
                                                               <<03008>>04502000
LDEV := 1;     <<LOOP COUNTER>>                                <<03683>>04504000
DO BEGIN    <<RESTART ALL DISC REQUESTS>>                      <<03008>>04506000
   CHECKLDEV(LDEV);                                            <<03008>>04508000
   IF = AND CARRY    <<DISC>>                                  <<03008>>04510000
   THEN BEGIN                                                  <<03008>>04512000
      TOS := LPDTD(LDEV);                                      <<03008>>04514000
      DEL;   <<LEAVE DIT PTR WORD AT TOS >>                    <<03008>>04516000
      TOS := PS0(DILTP);    <<ILT PTR>>                        <<03008>>04518000
      TOS := PS0(ICNTRL).DRTNUMBER;   <<DRT NO.>>              <<03008>>04520000
      DELB;                 <<DELETE ILT PTR>>                 <<03008>>04522000
                                                               <<03008>>04524000
      CHANNL:= S0.CHAN'NUM;      <<CHANNEL NUMBER>>            <<03008>>04526000
      IMB := TOS.IMB'NUM;   <<IMB NUMBER>>                     <<03008>>04528000
                                                               <<03008>>04530000
      TOS := TEMPMASK(IMB);  <<GET MASK WORD FOR IMB>>         <<03008>>04532000
      X:=CHANNL;                                               <<03008>>04534000
      ASMB( TSBC 0,X);        <<SET BIT FOR CHANNEL>>          <<03008>>04536000
      TEMPMASK(IMB) := TOS;  <<SAVE BACK INTO TEMPMASK>>       <<03008>>04538000
                                                               <<03008>>04540000
      IMB := NRIMB;  <<LOAD TEMPMASK ONTO STACK>>              <<03008>>04542000
      DO TOS := TEMPMASK(IMB)                                  <<03008>>04544000
      UNTIL (IMB:=IMB-1) < 0;                                  <<03008>>04546000
                                                               <<03008>>04548000
      ASMB(SMSK);   <<SET THE MASK>>                           <<03008>>04550000
                                                               <<03008>>04552000
      TOS := 0;                                                <<03008>>04554000
                 << TOS = 0; S-1 = DIT PTR>>                   <<03008>>04556000
      AWAKEIO(*,*);                                            <<03008>>04558000
   END;  <<ITS A DISC>>                                        <<03008>>04560000
END UNTIL (LDEV := LDEV+1 ) > LPDT.MAXENTRY;                   <<03008>>04562000
    <<END OF RESTART ALL DISC REQUESTS>>                       <<03008>>04564000
                                                               <<03008>>04566000
   LYNX'PF'CHECK;     <<FOR ICF'55 LYNX CODE>>                 <<03650>>04568000
    << Clear memory after a Power Fail ...>>                   <<04147>>04570000
    << ... for the MEMLOG process         >>                   <<04147>>04572000
    assemble (PCN);                                            <<04147>>04574000
    if TOS = ICF'55 then begin                                 <<04147>>04576000
     COMMENT : The variable NRIMB is used as a loop index      <<04147>>04578000
       in the following code even though this is not its       <<04147>>04580000
       reason for exsistance. This avoids the dynamic          <<04147>>04582000
       allocation of still another variable;                   <<04147>>04584000
     for *NRIMB   := 0 until 1023 do begin                     <<04147>>04586000
      tos := logical (NRIMB) & lsl(4);                         <<04147>>04588000
      DUPLICATE;                                               <<04147>>04590000
      S1 := [11/0,1/1,4/0];    << write logging RAM >>         <<04147>>04592000
      tos := [6/0,4/%12,       << CSB bus op; Send Word >>     <<04147>>04594000
              3/7,           << CSB address of memory mod >>   <<04147>>04596000
              3/0];            << no reply expected >>         <<04147>>04598000
      MCMD;                                                    <<04147>>04600000
     end     << clear'logging'ram >>                           <<04147>>04602000
    end;                                                       <<04147>>04604000
   ABS(ABSQI-12) := PFAILPIN; << TELL DISP TO AWAKW PF PROCESS >>       04606000
   AWAKE(PFAILPIN,JUNKWAITCODE,NOWAIT);                        <<02833>>04608000
   TRL(4) := 1; << SET TIMER FLAG TO GET DISPATCHED >>                  04610000
   PF := 3; << THIS WILL CLEAR WRITECHAR IF THERE FROM PREVIOUS PF >>   04612000
   TOS := -1;                                                  <<01183>>04614000
      TOS := DLABEL;                                           <<MPEIV>>04616000
   IF <  THEN  ASMB(PCAL 0);                                   <<01183>>04618000
   ABS(SCSR) := 0;   << CLEAR STATUS REGISTER >>               <<01183>>04620000
   ASMB(PCN);     << GET CPU # >>                              <<01183>>04622000
   IF TOS = SERIES'33 THEN                                     <<01415>>04624000
   BEGIN    <<CPU IS A 33>>                                    <<01415>>04626000
      TOS := 1100;   <<DEFAULT VALUE>>                         <<01415>>04628000
      TOS := ABS(17).(1:15);  <<SPECIFIED VALUE>>              <<01415>>04630000
      IF = THEN ASMB (DEL);   <<IF 0, USE DEFAULT>>            <<01415>>04632000
      ASMB (RCCR; DUP);                                        <<01415>>04634000
      ABS(TEMPLR) := TOS;                                      <<01415>>04636000
      ASMB (LADD;SCLR);                                        <<01415>>04638000
   END                                                         <<01415>>04640000
   ELSE                                                        <<01415>>04642000
   BEGIN    <<ICF/44 OR ICF/55 CPU>>                           <<01415>>04644000
      TOS := 100;   <<SAME AS ABOVE>>                          <<01415>>04646000
      TOS := ABS(17).(1:15);                                   <<01415>>04648000
      IF = THEN ASMB (DEL);                                    <<01415>>04650000
      ASMB (SCLR);                                             <<01415>>04652000
      ABS(TEMPLR) := 0;                                        <<01415>>04654000
   END;                                                        <<01415>>04656000
   ASMB (TON; SINC; IXIT);                                     <<01415>>04658000
END;                                                                    04660000
                                                                        04662000
PROCEDURE  CALLHELP;                                                    04664000
   OPTION  PRIVILEGED,UNCALLABLE;                                       04666000
   BEGIN                                                                04668000
   << BUILD A MARKER TO HELP, EXIT THROUGH IT >>                        04670000
   TOS := 0;  << X REGISTER >>                                          04672000
   TOS := F(F(F(0)+@HELP.(8:8)*4).(4:12)*4+F(X:=X+3)-1-@HELP.(1:7));    04674000
   TOS := TOS.(2:14);   << GET RID OF UNCALLABLE BIT >>                 04676000
   PUSH(STATUS);                                                        04678000
   TOS.(8:8) := @HELP;                                                  04680000
   TOS := 4;                                                            04682000
   PUSH(S);                                                             04684000
   SET(Q);                                                              04686000
   END;                                                                 04688000
                                                                        04690000
<< OUTER BLOCK, STT # FOLLOWED BY A CALL TO THE PROCEDURE >>            04692000
ASMB(                                                                   04694000
     CON 1;   PCAL BOUNDSVIOLATION;                                     04696000
     CON 2;   PCAL ILLEGALADDRESS;                                      04698000
     CON 3;    PCAL NONRESPONDINGMODULE;                       <<04793>>04700000
     CON 4;   PCAL GHOST4;                                              04702000
     CON 5;   PCAL GHOST5;                                              04704000
     CON 6;   PCAL DATAPARITY;                                          04706000
     CON 7;   PCAL GHOST7;                                              04708000
     CON 8;   PCAL CALLHELP;                                            04710000
     CON 9;   PCAL POWERFAIL;                                           04712000
     CON 10;  PCAL TEMPWARNINGS;   <<FOR ICF'64>>              <<03094>>04714000
     CON 11;  PCAL EXTGHOST;                                            04716000
     CON 12;  PCAL SYSTEMCLOCK;                                         04718000
     CON 13;  PCAL BREAKPOINT;                                          04720000
     CON 14;  PCAL GHOST14;                                             04722000
     CON 15;  PCAL DCULOGGING;   <<FOR SERIES'64>>             <<04184>>04724000
     CON 16;  PCAL UNIMPLEMENTEDINSTRUCTION;                            04726000
     CON 17;  PCAL STTVIOLATION;                                        04728000
     CON 18;  PCAL CSTVIOLATION;                                        04730000
     CON 19;  PCAL DSTVIOLATION;                                        04732000
     CON 20;  PCAL STACKUNDERFLOW;                                      04734000
     CON 21;  PCAL PRIVILEGEDMODEVIOLATION;                             04736000
     CON 22;  PCAL GHOST22;                                             04738000
     CON 23;  PCAL GHOST23;                                             04740000
     CON 24;  PCAL STACKOVERFLOW;                              <<MPEIV>>04742000
     CON 25;  PCAL USERTRAP;                                            04744000
     CON 26;  PCAL GHOST26;                                             04746000
     CON 27;  PCAL GHOST27;                                             04748000
     CON 28;  PCAL GHOST28;                                             04750000
     CON 29;  PCAL GHOST29;                                             04752000
     CON 30;  PCAL GHOST30;                                             04754000
     CON 31;  PCAL CODEABSENCE;                                         04756000
     CON 32;  PCAL TRACE;                                               04758000
     CON 33;  PCAL STTUNCALLABLE;                                       04760000
     CON 34;  PCAL DATAABSENCE;                                         04762000
     CON 35;  PCAL POWERON;                                             04764000
     CON 36;  PCAL GHOST36                                              04766000
);                                                                      04768000
END.                                                                    04770000
