<< ININ -- MODULE 10 >>                                        <<01040>>00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$CONTROL MAIN=ININ                                                      00030000
$THIRTY                                                                 00032000
$CONTROL MAP,CODE                                              <<04794>>00034000
BEGIN                                                                   00036000
<<                                                                      00038000
                                                                        00040000
      INTERNAL INTERRUPT SEGMENT                                        00042000
                                                                        00044000
>>                                                                      00046000
                                                                        00048000
DEFINE  ASMB = ASSEMBLE#,                                               00050000
        F = ABSOLUTE#,                                                  00052000
        ABS=ABSOLUTE#,                                         <<01808>>00054000
        PDISABLE=ASMB(PSDB)#,                                  <<01549>>00056000
        PENABLE=ASMB(PSEB)#,                                   <<01549>>00058000
        DISABLE = ASMB( SED 0 )#,                                       00060000
        ENABLE = ASMB( SED 1 )#,                               <<01040>>00062000
        LMEM = ASMB( LSEA )#,                                  <<01040>>00064000
       LRV = ABS(%17).(1:15)#;                                 <<01549>>00066000
DEFINE  TRAPSOFF = PUSH(STATUS);                               <<01857>>00068000
                   TOS.(2:1) := 0;                             <<01857>>00070000
                   SET(STATUS)#;                               <<01857>>00072000
$INCLUDE INCLMEAS                                              <<01549>>00074000
$INCLUDE INCLMIFT                                              <<04107>>00076000
EQUATE  PCBSIZE = 16,                                                   00078000
       PXGLOBSIZE = 8,                                         <<01808>>00080000
        CPCB = 4,                                                       00082000
        PCBB = 3,                                                       00084000
        DSTB = 2,                                              <<01040>>00086000
         TRACELABEL = %1257,                                            00088000
        QI = 5,                                                         00090000
        ZI = 6;                                                         00092000
EQUATE ICSPDISABLECNTCELL=18;                                  <<01549>>00094000
                                                               <<01549>>00096000
                                                                        00098000
INTEGER  X = X,                                                         00100000
         P = Q-2,     << STACK MARKER P VALUE >>                        00102000
         DELTAQ = Q+0,                                                  00104000
         STATUS = Q-1,<< STACK MARKER STATUS >>                         00106000
         PARAM = Q+1; << INTERRUPT PARAMETER >>                         00108000
EQUATE ICS'QI=5;                                               <<01549>>00110000
EQUATE SYSBASE=%1000,                                          <<01549>>00112000
       SLIX=1,                                                 <<01549>>00114000
       SYSXL=SYSBASE+SLIX,                                     <<01549>>00116000
       DSTIX=2,                                                <<01549>>00118000
       SYSDST=SYSBASE+DSTIX,                                   <<01549>>00120000
       PCBIX=3,                                                <<01549>>00122000
       SYSPCB=SYSBASE+PCBIX,                                   <<01549>>00124000
       DFCIX=%32,                                              <<01549>>00126000
       SYSDFC=SYSBASE+DFCIX,                                   <<01549>>00128000
       ICSIX=7,                                                <<01801>>00130000
       CSTXBLKIX=%51,                                          <<01549>>00132000
       SYSCSTXBLK=SYSBASE+CSTXBLKIX,                           <<01549>>00134000
       SYSWAITTODISPMSG=%1053;                                 <<01549>>00136000
                                                               <<01549>>00138000
DEFINE MEMTRAPFLAG=(4:1)#;                                     <<01549>>00140000
                                                               <<01549>>00142000
<<SYSTEM TABLE PTRS FOR LST ACCESS>>                           <<01549>>00144000
                                                               <<01549>>00146000
INTEGER POINTER DST=DSTIX,                                     <<01549>>00148000
               ICS=ICSIX,                                      <<01801>>00150000
                PCB=PCBIX,                                     <<01549>>00152000
                CSTXBLK=CSTXBLKIX;                             <<01549>>00154000
                                                               <<01549>>00156000
INTEGER DSTSYSBASEINX=DB+DSTIX,                                <<01549>>00158000
        SLSYSBASEINX=DB+SLIX,                                  <<01549>>00160000
                DFC=DB+DFCIX;                                  <<01549>>00162000
INTEGER POINTER DSTI' = DSTB;                                  <<01040>>00164000
                                                               <<01549>>00166000
                                                               <<01549>>00168000
<<WAIT/AWAKE PARAMETER DEFINITIONS>>                           <<01549>>00170000
EQUATE NOINFO=0,                                               <<01549>>00172000
       MEMORYWAITCODE=%10000,                                  <<01549>>00174000
       JUNKWAITCODE=%20,                                       <<01549>>00176000
       MEMORYTRAP=%4000,                                       <<01549>>00178000
       NOWAIT=0;                                               <<01549>>00180000
$INCLUDE INCLMSG                                               <<01549>>00182000
                                                               <<01549>>00184000
EQUATE UNCALLABLEBIT=1;                                        <<01549>>00186000
$INCLUDE INCLICS                                               <<01549>>00188000
<<SEGMENT IDENTIFIER FORMAT>>                                  <<01549>>00190000
                                                               <<01549>>00192000
EQUATE SEGIDDATATYPE=0,                                        <<01549>>00194000
       SEGIDSLTYPE=1;  <<PROGRAM TYPE =2 OR 3>>                <<01549>>00196000
DEFINE SEGIDTYPEFIELD=(0:2)#,                                  <<01549>>00198000
       SEGIDPBXFLAG=(0:1)#,                                    <<01549>>00200000
       SEGIDPBXFIELD=(1:7)#,                                   <<01549>>00202000
       SEGIDLOGSEGFIELD=(8:8)#;                                <<01549>>00204000
                                                               <<01549>>00206000
                                                                        00208000
$INCLUDE INCLST                                                <<01549>>00210000
$INCLUDE INCLPCB                                               <<01549>>00212000
PROCEDURE  ABORT(MODE,CODE,PARAM);                                      00214000
   VALUE MODE,CODE,PARAM;                                               00216000
   LOGICAL MODE,CODE,PARAM;                                             00218000
   OPTION EXTERNAL;                                                     00220000
                                                                        00222000
PROCEDURE ABORTPROC(PROCINX,ABORTCODE);                        <<01549>>00224000
VALUE PROCINX,ABORTCODE;                                       <<01549>>00226000
INTEGER PROCINX,ABORTCODE;                                     <<01549>>00228000
OPTION EXTERNAL;                                               <<01549>>00230000
                                                               <<01549>>00232000
PROCEDURE WAIT(EVENTTYPE,SPECIALINFO);                         <<01549>>00234000
VALUE EVENTTYPE,SPECIALINFO;                                   <<01549>>00236000
INTEGER EVENTTYPE,SPECIALINFO;                                 <<01549>>00238000
OPTION EXTERNAL;                                               <<01549>>00240000
                                                               <<01549>>00242000
PROCEDURE QUEUEONSEGMENT(SEGIDENTIFIER);                       <<01549>>00244000
VALUE SEGIDENTIFIER;                                           <<01549>>00246000
INTEGER SEGIDENTIFIER;                                         <<01549>>00248000
OPTION EXTERNAL;                                               <<01549>>00250000
                                                               <<01549>>00252000
PROCEDURE SET'PSIF(PCBPT,FLAGS);                               <<01549>>00254000
VALUE PCBPT,FLAGS;                                             <<01549>>00256000
INTEGER PCBPT,FLAGS;                                           <<01549>>00258000
OPTION EXTERNAL;                                               <<01549>>00260000
                                                               <<01549>>00262000
PROCEDURE RECOVEROC(SEGIDENTIFIER,DESCSTINX);                  <<01549>>00264000
VALUE SEGIDENTIFIER,DESCSTINX;                                 <<01549>>00266000
INTEGER SEGIDENTIFIER,DESCSTINX;                               <<01549>>00268000
OPTION EXTERNAL;                                               <<01549>>00270000
                                                               <<01549>>00272000
                                                               <<01549>>00274000
                                                               <<01549>>00276000
PROCEDURE GETDATASEGCHANGESTATE(SEGNUM);                       <<01549>>00278000
VALUE SEGNUM;                                                  <<01549>>00280000
INTEGER SEGNUM;                                                <<01549>>00282000
OPTION EXTERNAL;                                               <<01549>>00284000
                                                               <<01549>>00286000
PROCEDURE GENSPECREQ(DSTNUM,NEWSIZE,READDISP,MOVELENGTH);      <<01549>>00288000
VALUE DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                      <<01549>>00290000
INTEGER DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                    <<01549>>00292000
OPTION EXTERNAL;                                               <<01549>>00294000
                                                               <<01549>>00296000
PROCEDURE SENDMSG(DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS);        <<01549>>00298000
VALUE DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS;                     <<01549>>00300000
INTEGER DESTPIN,DESTPORTNUM,MSGLENGTH;                         <<01549>>00302000
LOGICAL FLAGS;                                                 <<01549>>00304000
OPTION EXTERNAL;                                               <<01549>>00306000
INTEGER PROCEDURE BUILDSEGID(SEGTYPE,SEGNUMBER,PIN);           <<01549>>00308000
VALUE SEGTYPE,SEGNUMBER,PIN;                                   <<01549>>00310000
INTEGER SEGTYPE,SEGNUMBER,PIN;                                 <<01549>>00312000
OPTION EXTERNAL;                                               <<01549>>00314000
                                                               <<01549>>00316000
INTEGER PROCEDURE CONVSEGIDTOSTINX(SEGIDENTIFIER);             <<01549>>00318000
VALUE SEGIDENTIFIER;                                           <<01549>>00320000
LOGICAL SEGIDENTIFIER;                                         <<01549>>00322000
OPTION EXTERNAL;                                               <<01549>>00324000
                                                                        00326000
PROCEDURE  AWAKE(PCBPT,N,WAITF);                                        00328000
   VALUE PCBPT,N,WAITF;                                                 00330000
   INTEGER PCBPT,N,WAITF;                                               00332000
   OPTION EXTERNAL;                                                     00334000
                                                               <<03665>>00336000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,      <<03665>>00338000
     P5,DEST,REPLY,OFFSET,DITP,IOTYPE);                        <<03665>>00340000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,              <<03665>>00342000
     OFFSET,DITP,IOTYPE;                                       <<03665>>00344000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,            <<03665>>00346000
     OFFSET,IOTYPE;                                            <<03665>>00348000
INTEGER POINTER DITP;                                          <<03665>>00350000
OPTION VARIABLE,EXTERNAL;                                      <<03665>>00352000
                                                               <<03665>>00354000
                                                                        00356000
PROCEDURE DELAYEDINT; OPTION EXTERNAL;                         <<03042>>00358000
                                                                        00360000
PROCEDURE  EADD; OPTION EXTERNAL;                                       00362000
                                                                        00364000
PROCEDURE  ESUB; OPTION EXTERNAL;                                       00366000
                                                                        00368000
PROCEDURE  EMPY; OPTION EXTERNAL;                                       00370000
                                                                        00372000
PROCEDURE  EDIV; OPTION EXTERNAL;                                       00374000
                                                                        00376000
PROCEDURE  ENEG; OPTION EXTERNAL;                                       00378000
                                                                        00380000
PROCEDURE  ECMP; OPTION EXTERNAL;                                       00382000
                                                                        00384000
PROCEDURE  QADD;  OPTION EXTERNAL;                                      00386000
                                                                        00388000
PROCEDURE  QSUB;  OPTION EXTERNAL;                                      00390000
                                                                        00392000
PROCEDURE  QMPY;  OPTION EXTERNAL;                                      00394000
                                                                        00396000
PROCEDURE  QDIV;  OPTION EXTERNAL;                                      00398000
                                                                        00400000
PROCEDURE  QNEG;  OPTION EXTERNAL;                                      00402000
                                                                        00404000
PROCEDURE  QCMP;  OPTION EXTERNAL;                                      00406000
                                                                        00408000
PROCEDURE  QASL;  OPTION EXTERNAL;                                      00410000
                                                                        00412000
PROCEDURE  QASR;  OPTION EXTERNAL;                                      00414000
                                                                        00416000
PROCEDURE  DIMPY; OPTION EXTERNAL;                                      00418000
                                                                        00420000
PROCEDURE  DIDIV; OPTION EXTERNAL;                                      00422000
                                                                        00424000
PROCEDURE  HELP; OPTION EXTERNAL;                                       00426000
                                                                        00428000
PROCEDURE  DMUL; OPTION EXTERNAL;                                       00430000
                                                                        00432000
PROCEDURE  CVAD; OPTION EXTERNAL;                                       00434000
                                                                        00436000
PROCEDURE  CVDA; OPTION EXTERNAL;                                       00438000
                                                                        00440000
PROCEDURE  CVBD; OPTION EXTERNAL;                                       00442000
                                                                        00444000
PROCEDURE  CVDB; OPTION EXTERNAL;                                       00446000
                                                                        00448000
PROCEDURE  SLD; OPTION EXTERNAL;                                        00450000
                                                                        00452000
PROCEDURE  NSLD; OPTION EXTERNAL;                                       00454000
                                                                        00456000
PROCEDURE  SRD; OPTION EXTERNAL;                                        00458000
                                                                        00460000
PROCEDURE  CMPD; OPTION EXTERNAL;                                       00462000
                                                                        00464000
PROCEDURE  ADDD; OPTION EXTERNAL;                                       00466000
                                                                        00468000
PROCEDURE  SUBD; OPTION EXTERNAL;                                       00470000
                                                                        00472000
PROCEDURE MPYDSIM; OPTION EXTERNAL;                                     00474000
                                                                        00476000
INTEGER PROCEDURE  TESTSTOP(S,P,PINX);                                  00478000
   VALUE S,P,PINX;                                                      00480000
   INTEGER S,P,PINX;                                                    00482000
   OPTION EXTERNAL;                                                     00484000
                                                                        00486000
PROCEDURE  DEBUG; OPTION EXTERNAL;                                      00488000
                                                                        00490000
LOGICAL PROCEDURE SETSYSDB;                                             00492000
   OPTION EXTERNAL;                                                     00494000
                                                                        00496000
PROCEDURE RESETDB(IX);                                                  00498000
   VALUE IX;                                                            00500000
   INTEGER IX;                                                          00502000
   OPTION EXTERNAL;                                                     00504000
                                                                        00506000
PROCEDURE  SUDDENDEATH(A);                                              00508000
   VALUE  A;                                                            00510000
   INTEGER  A;                                                          00512000
   OPTION  EXTERNAL;                                                    00514000
                                                                        00516000
PROCEDURE IOUNFREEZE(EN,TYPE,PIN);                                      00518000
VALUE EN,TYPE,PIN;                                                      00520000
INTEGER EN,TYPE,PIN;                                                    00522000
OPTION EXTERNAL;                                                        00524000
                                                                        00526000
PROCEDURE MASTERCLEAR(DITP);                                            00528000
VALUE DITP;                                                             00530000
POINTER DITP;                                                           00532000
OPTION EXTERNAL;                                                        00534000
                                                                        00536000
PROCEDURE BCONVERT(WORD);                                               00538000
VALUE WORD;                                                             00540000
INTEGER WORD;                                                           00542000
OPTION EXTERNAL;                                                        00544000
                                                                        00546000
PROCEDURE DCONVERT(WORD);                                               00548000
VALUE WORD;                                                             00550000
INTEGER WORD;                                                           00552000
OPTION EXTERNAL;                                                        00554000
                                                                        00556000
PROCEDURE MPXCONTROL(OP,DITP);                                          00558000
VALUE OP,DITP;                                                          00560000
INTEGER OP;                                                             00562000
POINTER DITP;                                                           00564000
OPTION EXTERNAL;                                                        00566000
                                                                        00568000
PROCEDURE WRITE2(WORD);                                                 00570000
VALUE WORD;                                                             00572000
INTEGER WORD;                                                           00574000
OPTION EXTERNAL;                                                        00576000
                                                                        00578000
PROCEDURE AWAKEIO(DITP,FLAGS);                                          00580000
VALUE DITP,FLAGS;                                                       00582000
POINTER DITP;                                                           00584000
INTEGER FLAGS;                                                          00586000
OPTION EXTERNAL;                                                        00588000
                                                                        00590000
PROCEDURE CHECKLDEV(DEV);                                               00592000
VALUE DEV;                                                              00594000
INTEGER DEV;                                                            00596000
OPTION EXTERNAL;                                                        00598000
                                                                        00600000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QN);                                00602000
VALUE LINKINDEX,QN;                                                     00604000
INTEGER LINKINDEX,QN;                                                   00606000
OPTION EXTERNAL;                                                        00608000
                                                                        00610000
PROCEDURE IOFAILURE(DRTN,DITP);                                         00612000
VALUE DRTN,DITP;                                                        00614000
INTEGER DRTN;                                                           00616000
INTEGER POINTER DITP;                                                   00618000
OPTION EXTERNAL;                                                        00620000
                                                                        00622000
INTEGER PROCEDURE SEG'ID'TYPE (SEG);                           <<01660>>00624000
   VALUE SEG;                                                  <<01660>>00626000
   INTEGER SEG;                                                <<01660>>00628000
   OPTION EXTERNAL;                                            <<01660>>00630000
PROCEDURE MMSTAT(P1,P2,P3,P4);                                 <<01563>>00632000
VALUE P1,P2,P3,P4;                                             <<01563>>00634000
INTEGER P1,P2,P3,P4;                                           <<01563>>00636000
OPTION EXTERNAL;                                               <<01563>>00638000
                                                                        00640000
INTEGER PROCEDURE GET'DSDEVICE(LDEV);                          <<01623>>00642000
VALUE LDEV;                                                    <<01623>>00644000
INTEGER LDEV;                                                  <<01623>>00646000
OPTION EXTERNAL;                                               <<01623>>00648000
                                                               <<01623>>00650000
                                                                        00652000
LOGICAL PROCEDURE TESTCRUNCH(CALLER);                                   00654000
   VALUE CALLER;                                                        00656000
   INTEGER CALLER;                                                      00658000
   OPTION PRIVILEGED,UNCALLABLE;                                        00660000
   BEGIN                                                                00662000
   LOGICAL POINTER  CST = 1;                                            00664000
   LOGICAL LS0=S-0;                                                     00666000
   EQUATE TRPLBL=%100001,CLEARSTT=%100377,GETSTT=%77400;                00668000
   INTEGER  S0 = S-0;                                                   00670000
   INTEGER ARRAY  ARRQ(*) = Q+0;                                        00672000
   EQUATE BADREF = 8;                                                   00674000
   TOS := X;  <<SAVE INSTRUCTION ON WHICH TRAP OCCURRED>>               00676000
                                                                        00678000
   TOS := ARRQ(-ARRQ-1); <<GET STATUS OF TRAPPED PROCEDURE>>            00680000
   IF < THEN BEGIN <<PRIVILEGED MODE WHEN TRAPPED>>                     00682000
                                                                        00684000
COMMENT THE FOLLOWING CODE IS INCLUDED TO AVERT SD#10 IN                00686000
        THE CASE THAT TWO INTERNAL INTERRUPTS ARE GENERATED             00688000
        BY A SINGLE VIOLATION, E.G., BNDS VIOL IS FOLLOWED              00690000
        BY ILL ADR IN PARTIAL MEMORY SYSTEM.  THE FOLLOWING             00692000
        CODE WILL SET TESTCRUNCH TRUE AND RETURN, IGNORING              00694000
        THE ILL ADR;                                                    00696000
   IF S0=TRPLBL THEN                                                    00698000
     BEGIN                                                              00700000
     TOS := ARRQ(X:=X-3);<<IS THIS EXT TRAP LBL? CHECK:>>               00702000
     IF (LS0 LAND CLEARSTT)=TRPLBL THEN                                 00704000
       BEGIN <<CHECK IF DELTA P IS ENTRY FOR STT IN LBL>>               00706000
       TOS := TOS.(1:7); <<STT>>                                        00708000
       TOS := CST(7);  <<ABSOLUTE LOC OF ININ>>                         00710000
       ASMB(XCH,SUB);                                                   00712000
       TOS := CST(4).(4:12)&LSL(2); <<LEN OF ININ>>                     00714000
       TOS := TOS+TOS-1;   <<TOS:=@ OF STT ENTRY FROM BLKLBL>> <<02086>>00716000
       TOS := CST(6);      <<TOS:=BANK OF ININ>>               <<02086>>00718000
       ASMB(XCH;LSEA);     <<TOS:=STT ENTRY OF BLKLBL>>        <<02086>>00720000
       ASMB(DELB,DELB);    <<PITCH DOBLE ADDR OF STT ENTRY>>   <<02086>>00722000
       TOS := TOS.(2:14);  <<TOS:=DELTAP OF TRAPPED PROC>>     <<02086>>00724000
       TOS := ARRQ(-ARRQ-2); <<DELTA P AT TRAP TIME>>                   00726000
       IF TOS=TOS THEN                                                  00728000
         BEGIN <<DOUBLE INTERNAL INTERRUPT! IGNORE!>>                   00730000
         TESTCRUNCH := TRUE;                                            00732000
         RETURN;                                                        00734000
         END;                                                           00736000
        END                                                    <<01922>>00738000
        ELSE DEL;                                              <<01922>>00740000
     END;                                                               00742000
   TOS := TOS LAND %377;                                                00744000
   IF S0<%300 AND CST(S0&LSL(2)+1).SYSTEMFLAG                  <<01549>>00746000
   THEN                                                                 00748000
     BEGIN << IN PRIVILEGED SYSTEM CODE >>                              00750000
        DEL;                                                   <<00245>>00752000
        IF (TOS LAND %177400) <> %31400 OR  <<NOT EXIT INST>>  <<01922>>00754000
          CALLER <> 2 THEN   <<NOT BOUNDS VIOLATION>>          <<01922>>00756000
          BEGIN                                                <<00245>>00758000
DIE:        X:=ARRQ(-2)+%111;  <<PMAP RELATIVE LOC OF CALLER>> <<00245>>00760000
            SUDDENDEATH(CALLER+BADREF); <<DIE>>                <<00245>>00762000
          END ELSE                                             <<00245>>00764000
          BEGIN                <<BOUNDS VIOLATION ON EXIT>>    <<00245>>00766000
            TOS:=ARRQ((-ARRQ(-ARRQ)-ARRQ)-1);   <<STATUS MKR>> <<01922>>00768000
                           <<PRECEEDING TRAPPED PROCEDURE  >>  <<00245>>00770000
            IF (TOS LAND %377) < %300 THEN GO DIE;             <<01922>>00772000
            <<NOT A TRAP ON EXIT TO A DESTROYED USER SEGMENT>> <<00245>>00774000
          END;                                                 <<00245>>00776000
     END;                                                               00778000
   END <<PRIVILEGED MODE WHEN TRAPPED>>;                                00780000
   STATUS.(1:1) := 1;   << INTERRUPTS ON ON EXIT >>                     00782000
   END;                                                                 00784000
                                                                        00786000
PROCEDURE  BOUNDSVIOLATION;                                             00788000
   OPTION PRIVILEGED,UNCALLABLE;                                        00790000
   BEGIN                                                                00792000
   LOGICAL                                                     <<03042>>00794000
      INSTR      = Q+2,                                        <<03042>>00796000
      ABORT'PARM = Q+3; << [MARKERS TO POP/TYPE OF ABORT] >>   <<03042>>00798000
   INTEGER ARRAY STACK(*) = Q+0;                               <<00422>>00800000
   DEFINE PLOC = STACK(-DELTAQ-2) #;                           <<00422>>00802000
   DEFINE EXIT'N = STACK(-DELTAQ+1) #;                         <<00422>>00804000
   DEFINE  PSIM = (0:3)#;  << PSEUDO INTERRUPT MODE >>         <<00422>>00806000
   DEFINE EXIT'INSTR = (INSTR LAND %177400) =%31400 #;         <<04753>>00808000
   TOS:=X; << SET UP INST >>                                   <<00422>>00810000
   TOS:=0; << SAVE SPACE FOR ABORT'PARM >>                     <<03042>>00812000
   IF NOT TESTCRUNCH(2) THEN                                            00814000
   BEGIN                                                       <<00422>>00816000
      COMMENT:                                                 <<03042>>00818000
         DETERMINE NUMBER OF MARKERS FOR ABORT TO POP.         <<03042>>00820000
         FOR EXIT INSTRUCTION WE WANT TO POP THE MARKER        <<03042>>00822000
         WHICH POINTS TO LOCATION OF EXIT (SINCE IT MAY        <<03042>>00824000
         POINT TO CODEABSENCE OF ININ IF THE SEGMENT           <<03042>>00826000
         WAS ABSENT AT THE TIME OF EXIT);                      <<03042>>00828000
      ABORT'PARM := IF EXIT'INSTR THEN [8/2,8/0]               <<03042>>00830000
                    ELSE [8/1,8/0];                            <<03042>>00832000
      IF EXIT'INSTR AND PLOC.(0:2) = 2 THEN                    <<03042>>00834000
      BEGIN                                                    <<00422>>00836000
         COMMENT:                                              <<00422>>00838000
            BOUNDS VIOLATIONS RESULT OF TRACE BIT SET BY A     <<03042>>00840000
            DELAYED CNTRL Y OR SOFT INT ON INTERNAL EXIT.  NOTE<<03042>>00842000
            THAT FOR EXTERNAL EXITS WE GO DIRECTLY TO TRACE.;  <<00422>>00844000
         IF (CPCBPSIM <> 5) AND (CPCBDELAYSOFT <> 1) THEN      <<03042>>00846000
         BEGIN                                                 <<03042>>00848000
            X := INSTR;                                        <<03042>>00850000
            ABORT(ABORT'PARM,22,0);                            <<03042>>00852000
         END;                                                  <<03042>>00854000
         PLOC.(0:1):=0;                                        <<00422>>00856000
         <<POP BNDS VIOL. MARKER -- SET UP FOR DELAYEDINT>>    <<03042>>00858000
         EXIT'N:=INSTR.(8:8); <<EXIT N FOR DELAYEDINT>>        <<03042>>00860000
         PUSH(Q); TOS:=TOS-DELTAQ; SET(Q);                     <<00422>>00862000
         DELAYEDINT;                                           <<03042>>00864000
      END                                                      <<00422>>00866000
      ELSE                                                     <<03042>>00868000
      BEGIN                                                    <<03042>>00870000
         X:=INSTR;                                             <<03042>>00872000
         ABORT(ABORT'PARM,24,0);                               <<03042>>00874000
      END;                                                     <<03042>>00876000
   END;                                                        <<00422>>00878000
   END;                                                                 00880000
                                                                        00882000
PROCEDURE  ILLEGALADDRESS;                                              00884000
   OPTION PRIVILEGED,UNCALLABLE;                                        00886000
   BEGIN                                                                00888000
   IF NOT TESTCRUNCH(1) THEN                                            00890000
   ABORT([8/1,8/0],23,0); << WITH INSTR IN XREG >>             <<03042>>00892000
   END;                                                                 00894000
                                                                        00896000
PROCEDURE  NONRESPONDINGMODULE;                                         00898000
   OPTION PRIVILEGED,UNCALLABLE;                                        00900000
   BEGIN                                                                00902000
   IF NOT TESTCRUNCH(0) THEN                                            00904000
   ABORT([8/1,8/0],25,0); << WITH INSTR IN XREG >>             <<03042>>00906000
   END;                                                                 00908000
                                                                        00910000
PROCEDURE  SYSTEMPARITY;                                                00912000
   OPTION PRIVILEGED,UNCALLABLE;                                        00914000
   SUDDENDEATH(11);                                                     00916000
                                                                        00918000
PROCEDURE  ADDRESSPARITY;                                               00920000
   OPTION PRIVILEGED,UNCALLABLE;                                        00922000
   SUDDENDEATH(12);                                                     00924000
                                                                        00926000
PROCEDURE DATAPARITY;                                          <<02301>>00928000
   OPTION PRIVILEGED,UNCALLABLE;                               <<02301>>00930000
                                                               <<02301>>00932000
   COMMENT: Dataparity will attempt to locate which memory     <<02301>>00934000
   location caused the data parity interrupt.  It does this    <<02301>>00936000
   by referencing all locations in memory until another data   <<02301>>00938000
   parity interrupt is detected.  The location which was last  <<02301>>00940000
   referenced is displayed and the system is halted, SF 13.    <<02301>>00942000
   If the bad location is not located, the machine is halted   <<02301>>00944000
   without a location displayed;                               <<02301>>00946000
                                                               <<02301>>00948000
   BEGIN                                                       <<02301>>00950000
   EQUATE  SYSDB = %1000,                                      <<02301>>00952000
           CRLF = %6412;   <<Carriage return, linefeed>>       <<02301>>00954000
   DEFINE  PARITYERRFLAG = ABSOLUTE (SYSDB + %61)#,            <<02301>>00956000
           SYSLASTBANK   = ABSOLUTE (SYSDB + %361)#,           <<02301>>00958000
           SYSLASTADDR   = ABSOLUTE (SYSDB + %362)#;           <<02301>>00960000
   ARRAY   PARMSG (0:6) = PB := CRLF, "PARITY ERROR";          <<02301>>00962000
   ARRAY   BMSG (0:2)   = PB := CRLF, "B = ";                  <<02301>>00964000
   ARRAY   AMSG (0:2)   = PB := CRLF, "A = ";                  <<02301>>00966000
   LOGICAL B       = S-1,  <<B stack cell: Bank # for LSEA>>   <<02301>>00968000
           A       = S,    <<A stack cell: Offset for LSEA>>   <<02301>>00970000
           ERRBANK = Q-6,  <<B stack cell after second DP>>    <<02301>>00972000
           ERRADDR = Q-5,  <<A stack cell after second DP>>    <<02301>>00974000
           LASTBANK,       <<Largest bank # configured>>       <<02301>>00976000
           LASTADDR;       <<Largest addr for current bank>>   <<02301>>00978000
                                                               <<02301>>00980000
   IF NOT PARITYERRFLAG THEN                                   <<02301>>00982000
         <<First DP interrupt: initialize and make another>>   <<02301>>00984000
         BEGIN                                                 <<02301>>00986000
         TOS := SYSDB D;          <<Set sysdb, pitch old DB>>  <<02301>>00988000
         ASSEMBLE (XCHD;DDEL);                                 <<02301>>00990000
         FOR X := 0 UNTIL 6 DO WRITE2(PARMSG(X));              <<02301>>00992000
         PARITYERRFLAG := TRUE;                                <<02301>>00994000
         LASTBANK := SYSLASTBANK;                              <<02301>>00996000
         LASTADDR := %177777;     <<Assume all but L.B. full>> <<02301>>00998000
                                                               <<02301>>01000000
         <<Reference all of memory to recreate the error>>     <<02301>>01002000
         TOS := 0D;               <<A:=B:=0>>                  <<02301>>01004000
         WHILE B <= LASTBANK DO                                <<02301>>01006000
            BEGIN                                              <<02301>>01008000
            WHILE A < LASTADDR DO                              <<02301>>01010000
               BEGIN                                           <<02301>>01012000
               ASSEMBLE (LSEA;DEL);                            <<02301>>01014000
               ASSEMBLE (INCA);                                <<02301>>01016000
               END;                                            <<02301>>01018000
            ASSEMBLE (LSEA;DEL);  <<for last word in bank>>    <<02301>>01020000
            ASSEMBLE (INCA,INCB);                              <<02301>>01022000
            IF B = LASTBANK THEN LASTADDR := SYSLASTADDR;      <<02301>>01024000
            END;                                               <<02301>>01026000
         END  <<First parity error>>                           <<02301>>01028000
      ELSE                                                     <<02301>>01030000
         <<Second dataparity: print where we found it>>        <<02301>>01032000
         BEGIN                                                 <<02301>>01034000
         FOR X := 0 UNTIL 2 DO WRITE2(BMSG(X));                <<02301>>01036000
         DCONVERT (ERRBANK);                                   <<02301>>01038000
         FOR X := 0 UNTIL 2 DO WRITE2(AMSG(X));                <<02301>>01040000
         BCONVERT (ERRADDR);                                   <<02301>>01042000
         END;  <<second parity error>>                         <<02301>>01044000
   SUDDENDEATH(13);                                            <<02301>>01046000
   END;  <<Dataparity>>                                        <<02301>>01048000
                                                                        01050000
PROCEDURE  MODULEINTERRUPT;                                             01052000
   OPTION PRIVILEGED,UNCALLABLE;                                        01054000
   SUDDENDEATH(14);                                                     01056000
                                                                        01058000
PROCEDURE  GHOST;                                                       01060000
   OPTION PRIVILEGED,UNCALLABLE;                                        01062000
   SUDDENDEATH(15);                                                     01064000
                                                                        01066000
PROCEDURE EXTGHOST;                                                     01068000
OPTION PRIVILEGED,UNCALLABLE,INTERRUPT;                        <<03665>>01070000
BEGIN                                                                   01072000
INTEGER DRTN = Q+3;    << LOC OF DRT NUMBER ON INTERRUPT >>    <<03665>>01074000
                                                               <<03665>>01076000
EQUATE UNKNOWN'INT'MSG = 410, << MSG CATALOG MSG # >>          <<03665>>01078000
       OPCONSOLE       = 0;   << SYSTEM CONS CODE FOR GENMSG >><<03665>>01080000
                                                               <<03665>>01082000
   DISABLE; << ISSUE A CLEAR INTERFACE >>                               01084000
   IOMESSAGE(1,UNKNOWN'INT'MSG,%10000,DRTN,,,,,OPCONSOLE);     <<03665>>01086000
   TOS := %100000;                                                      01088000
   ASMB(CIO 1);                                                         01090000
   IF >= THEN                                                  <<03665>>01092000
      BEGIN     << MASTER RESET WORKED - RESET INTERRUPTS >>   <<03665>>01094000
      TOS := %040000;                                          <<03665>>01096000
      ASMB(CIO 1);                                             <<03665>>01098000
      END;                                                     <<03665>>01100000
                                                               <<03665>>01102000
END;                                                                    01104000
                                                                        01106000
PROCEDURE  POWERFAIL;                                                   01108000
   OPTION PRIVILEGED,UNCALLABLE;                                        01110000
BEGIN                                                                   01112000
                                                                        01114000
EQUATE                                                                  01116000
   CLOCKDRT    = 3,        << SYS CLK DRT NUMBER >>                     01118000
   CRMASK      = %70310,   << READ CLK CR REG >>                        01120000
   DILTP       = 5,        << DIT INDEX TO ILT POINTER >>               01122000
   DEVRESET    = %100000,  << DEVICE MASTERCLEAR CONTROL >>             01124000
   LRMASK      = %70210,   << READ CLK LR REG >>                        01126000
   POWERFAIL   = %72,      << SYSDB INDEX >>                            01128000
   SYSDB       = %1000;                                                 01130000
                                                                        01132000
DEFINE                                                                  01134000
   MAXENTRY    = (0:8)#;   << # OF ENTRIES IN LPDT >>                   01136000
                                                                        01138000
INTEGER                                                                 01140000
   ABSQI       = Q+7,                                                   01142000
   CR          = Q+6,                                                   01144000
   I           = Q+3,                                                   01146000
   LR          = Q+5,                                                   01148000
   MAXDRT      = DB+%71,                                                01150000
   PF          = DB+POWERFAIL,                                          01152000
   S           = S-2,                                                   01154000
   SYSUP       = DB+%73;                                                01156000
                                                                        01158000
INTEGER POINTER                                                         01160000
   LPDT        = DB+%10,                                                01162000
   PS0         = S-0;                                                   01164000
                                                                        01166000
DOUBLE POINTER                                                          01168000
   LPDTD       = LPDT;                                                  01170000
                                                                        01172000
                                                                        01174000
   TOS := 0D;                                                           01176000
   TOS := SYSDB;                                                        01178000
   ASMB(XCHD);                                                          01180000
   PF := 1; << SET SYSDB AND PF COUNT >>                                01182000
   SYSUP := 0;                                                          01184000
   TOS := ABS(QI);                                                      01186000
   TOS := ABS(ABSQI-6); << SAVE QI-6 >>                                 01188000
   TOS := ABS(X:=X+9);  << QI + 3 >>                                    01190000
   TOS := ABS(X:=X+1);  << AND QI + 4 >>                                01192000
   PUSH(S,Q,DL);                                                        01194000
   TOS := S - ABSQI + SYSDB; << COMPUTE ADDS VALUE FOR RESTART >>       01196000
   ABS(X) := TOS;                                                       01198000
   TOS := CLOCKDRT;                                                     01200000
   TOS := CRMASK; << GET CLOCK CR AND LR REG VALUES >>                  01202000
   ASMB(CIO 1;RIO 0);                                                   01204000
   CR := TOS;                                                           01206000
   I := 4; << FIRST SIO DRT >>                                          01208000
   DO                                                                   01210000
   IF ABS(I&LSL(2)) > 0 THEN                                            01212000
   BEGIN << RESET ANY CONTROLLER DOING SIO >>                           01214000
      TOS := I;                                                         01216000
      TOS := DEVRESET;                                                  01218000
      ASMB(CIO 1); << ISSUE MASTER CLEAR >>                             01220000
      DEL;                                                              01222000
   END                                                                  01224000
   UNTIL (I:=I+1) > MAXDRT;                                             01226000
   ASMB(HALT 7); << ALL DONE >>                                         01228000
END;                                                                    01230000
                                                                        01232000
PROCEDURE  UNIMPLEMENTEDINSTRUCTION;                                    01234000
   OPTION PRIVILEGED,UNCALLABLE;                                        01236000
   BEGIN                                                                01238000
   INTEGER USERX = Q-3,                                        <<01040>>01240000
           S2    = S-2;                                        <<01040>>01242000
   INTEGER ARRAY NEXTQ(*) = Q+2;                               <<01040>>01244000
   INTEGER INSTR     = NEXTQ,                                  <<01040>>01246000
           TRAP'LOC  = INSTR+1;                                <<01040>>01248000
                                                               <<02000>>01250000
   DEFINE  PLOC      = P.(2:14) #;                             <<02000>>01252000
                                                               <<02000>>01254000
   LOGICAL SUBROUTINE DBLWORD'INSTR;                           <<01040>>01256000
   BEGIN                                                       <<01040>>01258000
      COMMENT *** WARNING: THIS SUB. MUST NOT CHANGE           <<01040>>01260000
              *** THE X REGISTER;                              <<01040>>01262000
      TOS := X;                                                <<01040>>01264000
      << ASSIGN RETURN VALUE TO DBLWORD'INST >>                <<01040>>01266000
      S2 := IF INSTR = %20477 THEN TRUE ELSE FALSE;            <<01040>>01268000
      X := TOS; << RESTORE X >>                                <<01040>>01270000
   END;                                                        <<01040>>01272000
                                                               <<01040>>01274000
   TOS := X; << SAVE INSTR >>                                  <<01040>>01276000
                                                               <<04749>>01278000
   IF DBLWORD'INSTR THEN                                       <<01040>>01280000
      BEGIN                                                    <<01040>>01282000
      COMMENT:                                                 <<01040>>01284000
         INSTR CONTAINS WORD 1 OF THE INSTRUCTION.             <<01040>>01286000
         FOR A TWO WORD INSTRUCTION WITH AN INVALID            <<01040>>01288000
         2ND WORD THE 'P' REGISTER CONTAINS P+2.               <<01040>>01290000
         HOWEVER, IF THERE IS NO MICROCODE TO SUPPORT          <<01040>>01292000
         THE INSTRUCTION, THE TRAP OCCURED ON THE              <<01040>>01294000
         1ST WORD AND THE 'P' REG. CONTAINS P+1.;              <<01040>>01296000
      << LOAD INSTRUCTION AT P-1 >>                            <<01040>>01298000
      TOS:=0;  <<SPACE FOR TRAP'LOC>>                          <<04749>>01300000
      TOS := 0; << RETURN VALUE FOR CONVSEGID >>               <<01660>>01302000
      TOS := BUILDSEGID(SEG'ID'TYPE(STATUS.(8:8)),STATUS.(8:8),<<01660>>01304000
                        (X:=F(CPCB)-F(PCBB))/PCBSIZE);         <<01660>>01306000
      TOS := CONVSEGIDTOSTINX (*);                             <<01660>>01308000
      TOS:=DST(X:=TOS+2);                                      <<01549>>01310000
      TOS:=DST(X:=X+1)+(P-1);                                  <<01549>>01312000
      LMEM;                                                    <<01040>>01314000
      ENABLE;                                                  <<01040>>01316000
      INSTR := TOS; << WORD THAT CAUSED TRAP >>                <<01040>>01318000
      DDEL;  << DELETE EXTENDED ADDRESS >>                     <<01040>>01320000
      TRAP'LOC := PLOC-1; <<SAVE LOC OF WORD THAT TRAPPED>>    <<02000>>01322000
      COMMENT:                                                 <<01040>>01324000
         IF WORD AT P-1 IS A DOUBLE WORD INSTRUCTION           <<01040>>01326000
         THEN ASSUME NO MICROCODE FOR 2 WORD INSTR             <<01040>>01328000
         ELSE ACTUAL 2 WORD INSTR WITH TRAP ON 2ND             <<01040>>01330000
         WORD. P GETS BEGINNING OF 2 WORD INSTR.;              <<01040>>01332000
      IF DBLWORD'INSTR THEN PLOC := PLOC-1                     <<02000>>01334000
      ELSE PLOC := PLOC-2;                                     <<02000>>01336000
      GOTO L;                                                  <<01040>>01338000
      END;                                                     <<01040>>01340000
   ENABLE;                                                     <<01040>>01342000
   IF %20400 <= X <= %20415 THEN                                        01344000
      BEGIN                                                             01346000
      X := X.(12:4);                                                    01348000
      ASMB( BR P+1,X );                                                 01350000
      EADD;                                                             01352000
      ESUB;                                                             01354000
      EMPY;                                                             01356000
      EDIV;                                                             01358000
      ENEG;                                                             01360000
      ECMP;                                                             01362000
      ASSEMBLE(BR P+8);                                                 01364000
      ASSEMBLE(BR P+7);                                                 01366000
      QADD;                                                             01368000
      QSUB;                                                             01370000
      QMPY;                                                             01372000
      QDIV;                                                             01374000
      QNEG;                                                             01376000
      QCMP;                                                             01378000
      END;                                                              01380000
   IF X.(0:10) = %157 OR X.(0:10) = %117 THEN                  <<00217>>01382000
      BEGIN <<QUAD SHIFT>>                                     <<00217>>01384000
      TOS := TOS.(10:6) + USERX;                               <<00217>>01386000
      IF LOGICAL(X.(4:1)) THEN QASR                            <<00217>>01388000
                          ELSE QASL;                           <<00217>>01390000
      END;                                                     <<00217>>01392000
   IF %20570 <= X <= %20571                                    <<00217>>01394000
   THEN                                                        <<00217>>01396000
      IF TOS THEN DIDIV                                        <<00217>>01398000
             ELSE DIMPY;                                       <<00217>>01400000
   TOS := %177617;                                             <<00217>>01402000
   ASMB(AND,XAX);                                              <<00217>>01404000
   IF %20601 <= X <= %20614 THEN                               <<00217>>01406000
      BEGIN                                                    <<00217>>01408000
      DELB;   << CUT OFF PARAMETER >>                          <<00217>>01410000
      X := X.(12:4);                                           <<00217>>01412000
      ASMB(BR P+0,X);                                          <<00217>>01414000
      DMUL;                                                    <<00217>>01416000
      CVAD;                                                    <<00217>>01418000
      CVDA;                                                    <<00217>>01420000
      CVBD;                                                    <<00217>>01422000
      CVDB;                                                    <<00217>>01424000
      SLD;                                                     <<00217>>01426000
      NSLD;                                                    <<00217>>01428000
      SRD;                                                     <<00217>>01430000
      ADDD;                                                    <<00217>>01432000
      CMPD;                                                    <<00217>>01434000
      SUBD;                                                    <<00217>>01436000
      MPYDSIM;                                                 <<00217>>01438000
      END;                                                     <<00217>>01440000
   PLOC := PLOC-1;                                             <<02000>>01442000
    TOS:=PLOC;  <<TRAP'LOC>>                                   <<04749>>01444000
   << AT THIS POINT P POINTS TO 1ST WORD OF INSTR >>           <<03042>>01446000
   << THAT CAUSED TRAP, TRAP'LOC POINTS TO THE    >>           <<03042>>01448000
   << WORD OF THE INSTRUCTION THAT WAS BAD        >>           <<03042>>01450000
L: IF INSTR = %36000  THEN                                     <<01040>>01452000
      BEGIN  << POSSIBLELY A BREAKPOINT >>                              01454000
      TOS := 0; << RETURN VALUE FOR TESTSTOP >>                <<01611>>01456000
      TOS := BUILDSEGID(SEG'ID'TYPE(STATUS.(8:8)),STATUS.(8:8),<<01611>>01458000
                        (X:=F(CPCB)-F(PCBB))/PCBSIZE);         <<01611>>01460000
      TESTSTOP(*,TRAP'LOC,X);                                  <<01040>>01462000
      IF  >  THEN  RETURN;                                              01464000
      IF  =  THEN                                              <<01040>>01466000
          BEGIN                                                <<01040>>01468000
          << FLAG BREAK ON 2ND OF 2 WORD INSTR >>              <<01040>>01470000
          IF TRAP'LOC <> PLOC THEN X := TRUE                   <<02000>>01472000
          ELSE X := FALSE;                                     <<01040>>01474000
          DEBUG;                                               <<01040>>01476000
          END;                                                 <<01040>>01478000
      END;                                                              01480000
   << SET UP CALL TO ABORT >>                                  <<03042>>01482000
   X := INSTR;                                                 <<03042>>01484000
   PLOC := TRAP'LOC+1;      << ONE PAST ILLEGAL WORD >>        <<03042>>01486000
   ABORT([8/1,8/0],7,0); << WITH INSTR IN XREG >>              <<03042>>01488000
   END;                                                                 01490000
                                                                        01492000
PROCEDURE  STTVIOLATION;                                                01494000
   OPTION PRIVILEGED,UNCALLABLE;                                        01496000
   BEGIN                                                                01498000
   ENABLE;                                                              01500000
   ABORT([8/1,8/0],31,0); << WITH INSTR IN XREG >>             <<03042>>01502000
   END;                                                                 01504000
                                                                        01506000
PROCEDURE  CSTVIOLATION;                                                01508000
   OPTION PRIVILEGED,UNCALLABLE;                                        01510000
   BEGIN                                                                01512000
   ENABLE;                                                              01514000
   ABORT([8/1,8/0],30,0); << WITH INSTR IN XREG >>             <<03042>>01516000
   END;                                                                 01518000
                                                                        01520000
PROCEDURE  DSTVIOLATION;                                                01522000
   OPTION PRIVILEGED,UNCALLABLE;                                        01524000
   << DB-BANK MAY BE INVALID >>                                         01526000
   SUDDENDEATH(16);                                                     01528000
                                                                        01530000
PROCEDURE STACKOVERFLOW;                                       <<01549>>01532000
OPTION PRIVILEGED,UNCALLABLE;                                  <<01549>>01534000
                                                               <<01549>>01536000
COMMENT                                                        <<01549>>01538000
                                                               <<01549>>01540000
STACKOVERFLOW IS THE INTERRUPT HANDLER FOR INTERNAL TRAPS      <<01549>>01542000
CAUSED BY AN INSTRUCTION ATTEMPTING TO PUSH S BEYOND Z.WHEN    <<01549>>01544000
SUCH A CONDITION IS DETECTED BY MICROCODE, CONTROL BRANCES     <<01549>>01546000
TO THIS PROCEDURE ON THE ICS WITH INTERRUPTS DISABLED.         <<01549>>01548000
                                                               <<01549>>01550000
THE SYSTEM MUST CRASH IF THE OVERFLOWING STACK IS FROZEN,      <<01549>>01552000
LOCKED OR CORE RESIDENT, SINCE THERE'S NO WAY TO EXTEND        <<01549>>01554000
THESE.  OTHERWISE, A MESSAGE IS SENT TO THE DISPATCHER TO      <<01549>>01556000
WRITE THE STACK, RELEASE ITS SPACE, AND FLAG THE PROCESS       <<01549>>01558000
AS REQUIRING SCHEDULING ATTENTION.  THE SLL MEMORY PREQUEST    <<01549>>01560000
POINTER OF THE OVERFLOWING PROCESS IS SET TO -1, INDICATING    <<01549>>01562000
TO THE SCHEDULER THAT THE PROCESS' STACK MUST BE MADE PRESENT  <<01549>>01564000
BEFORE THE PROCESS CAN BE LAUNCHED.  THE STACK'S NEW SIZE      <<01549>>01566000
(OLDSIZE + STOVRINC) IS PLACED IN THE STACK'S XST ENTRY, AND   <<01549>>01568000
THE STACK'S ST ENTRY IS FLAGGED AS REQUIRING A MODIFICATION.   <<01549>>01570000
                                                               <<01549>>01572000
IF THE CODE CAUSING THE STACKOVERFLOW HAD DISABLED EXTERNAL    <<01549>>01574000
INTERRUPTS OR PDISABLED SWITCHING, IT MUST BE ALLOWED TO CON-  <<01549>>01576000
TINUE UNTIL IT COMPLETES THE ACTION FOR WHICH IT HAD SET       <<01549>>01578000
THE INTERNAL LOCK.  THAT'S THE REASON STACKS ARE ALLOCATED     <<01549>>01580000
AN OVERFLOW AREA BEYOND Z.  IF THE CODE HAD DISABLED INTERRUPTS<<01549>>01582000
THE INTERRUPT REQUEST FLIP FLOP OF THE CLOCK IS SET,           <<01549>>01584000
AND WHEN THE CODE ENABLES INTERRUPTS THE CLOCK INTERRUPT       <<01549>>01586000
HANDLER WILL BE ENTERED AND WILL DO A DISP.  IF THE CODE       <<01549>>01588000
WAS PDISABLED WHEN IT CAUSED THE STACKOVERFLOW, THE DISP AT    <<01549>>01590000
THE END OF THIS PROCEDURE WILL CAUSE CONTROL TO SWITCH         <<01549>>01592000
TO THE DISPATCHER AS SOON AS THE PROCESS UNTANGLES ITSELF.     <<01549>>01594000
                                                               <<01549>>01596000
;                                                              <<01549>>01598000
   BEGIN                                                                01600000
   INTEGER ARRAY  PCBX(*) = Q+0;                                        01602000
   INTEGER  S0 = S-0,                                                   01604000
            USERS0 = Q-4,    <<TOP OF STACK AT OVERFLOW TIME>> <<00556>>01606000
            DELTAS = Q-6,                                               01608000
            DELTAZ = Q-8;                                               01610000
   DOUBLE  STDB = Q-5;                                                  01612000
   EQUATE  IXIT = %20360;                                               01614000
   DEFINE  DELTAZ' = F(F(QI)-8)#;                                       01616000
                                                               <<01549>>01618000
EQUATE STACKOVRINC=512,                                        <<01713>>01620000
       OVERHEAD=%27,                                           <<01549>>01622000
       PAGEPOWER=7,                                            <<01549>>01624000
       RBTORASDISP=-19,                                        <<01549>>01626000
       RASTORBDISP=19,                                         <<01549>>01628000
       EXTRAINC=1152;                                          <<01549>>01630000
EQUATE RBTORSDISP=-18,                                         <<01713>>01632000
       RSTORBDISP=18;                                          <<01713>>01634000
DEFINE REGIOFZFLAG=(7:1)#,                                     <<01549>>01636000
       REGFZFLAG=(6:1)#,                                       <<01549>>01638000
       REGLKDFLAG=(5:1)#;                                      <<01549>>01640000
EQUATE STBTOMAXDATA=21,                                        <<01549>>01642000
       MAXDATATORELZ=-11,                                      <<01549>>01644000
       SBTORELDB=1,                                            <<01549>>01646000
       MAXDATATORELDB=-20,                                     <<01549>>01648000
       RELZTORBDISP=-10,                                       <<01549>>01650000
       RELDBTORELZ=9;                                          <<01549>>01652000
EQUATE  ICS'DELTAZ=8,                                          <<01549>>01654000
        ICS'DELTAS=6,                                          <<01549>>01656000
        ICS'STACKBANK=5,                                       <<01549>>01658000
        ICS'STACKBASE=9,                                       <<01549>>01660000
        ICS'PDISABLEDCNT=18,                                   <<01549>>01662000
        ICS'STACKDST=16;                                       <<01549>>01664000
EQUATE LOCVARCNT=14;                                           <<01965>>01666000
LOGICAL LS0=S-0;                                               <<01549>>01668000
INTEGER INSTRUCTION=Q+1,                                       <<01549>>01670000
        OLDSIZE=Q+2,                                           <<01549>>01672000
        NEWSIZE=Q+3,                                           <<01549>>01674000
        PAGESREQUIRED=Q+4,                                     <<01549>>01676000
        WORDSREQUIRED=Q+5,                                     <<01549>>01678000
        OLDDELTAZ=Q+6,                                         <<01549>>01680000
        STACKDST=Q+7,                                          <<01549>>01682000
        SBRELDB=Q+8,                                           <<01549>>01684000
        MAXSTACKSIZE=Q+9,                                      <<01549>>01686000
        INCREMENT=Q+10,                                        <<01549>>01688000
        DBRELTOSTKBASE=Q+11;                                   <<01549>>01690000
INTEGER PAGESALLOC=Q+12;                                       <<01713>>01692000
INTEGER PCBPT=Q+13;                                            <<01965>>01694000
                                                                        01696000
   << THIS PORTION RUNS ON THE ICS >>                                   01698000
   IF  X = IXIT  THEN  DELTAS := DELTAS-4;                              01700000
   TOS := STDB;                                                         01702000
   TOS := TOS+DELTAS-1;          << USER Q+1 >>                         01704000
   TOS := X;                     << BUILD A MARKER TO GET OFF ICS >>    01706000
   TOS := @STOV'USER;                                                   01708000
   ASMB( SDEA );                                                        01710000
   TOS := TOS+2;                                                        01712000
   PUSH( STATUS );                                                      01714000
   TOS := 4;                                                            01716000
   ASMB( SDEA );                                                        01718000
   TOS := TOS+2;                                                        01720000
   PUSH( DB );                                                          01722000
   ASMB( SDEA );                                                        01724000
   DELTAS := DELTAS+4;                                                  01726000
   DELTAZ := DELTAZ + 120;                                              01728000
   ASMB( PSDB; IXIT );                                                  01730000
                                                                        01732000
STOV'USER:  << THE MARKER ABOVE EXITS TO HERE >>                        01734000
   TOS:=X; <<SAVE INSTR CAUSING OVERFLOW AT Q+1>>              <<01549>>01736000
   IF X <> IXIT AND NOT(%020420 <= X <= %020430) THEN          <<RN.06>>01738000
      << NOT AN IXIT OR APL INSTRUCTION >>                     <<RN.06>>01740000
      BEGIN <<ADJUST P TO RETRY INSTRUCTION>>                           01742000
      P := P-1;                                                         01744000
      X := LOGICAL(X) LAND %170077;<<ISOLATE RIGHT STACKOP>>            01746000
      IF  1 <= X <= 63  THEN                                            01748000
         BEGIN <<PAIRED STACK OPERATORS IN INSTRUCTION>>                01750000
         TOS := STATUS;                                                 01752000
         ASMB(TCBC 3);                                                  01754000
         IF  <>  THEN  P := P+1;                               <<01.00>>01756000
         STATUS := TOS;                                                 01758000
         END;                                                           01760000
      END;                                                              01762000
ASMB(ADDS LOCVARCNT);                                          <<01563>>01764000
                                                               <<01857>>01766000
TRAPSOFF;                                                      <<01857>>01768000
                                                               <<01857>>01770000
IF GCLASSENABLEDMASK.CLASS0 THEN                               <<01563>>01772000
   BEGIN  <<MEASURE STK OVRFLOW EVENT>>                        <<01563>>01774000
   TOS:=MEASSTATXDSBANK;                                       <<01563>>01776000
   TOS:=MEASSTATXDSBASE;                                       <<01563>>01778000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPSTKOVERFLOW;                <<01563>>01780000
   ASMB(LSEA);                                                 <<01563>>01782000
   TOS:=TOS+1;                                                 <<01563>>01784000
   ASMB(SSEA;DDEL);                                            <<01808>>01786000
   END;                                                        <<01808>>01788000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01808>>01790000
   BEGIN <<PROCESS LEVEL STACKOVERFLOW>>                       <<01808>>01792000
   TOS:=MEASPROCXDSBANK;                                       <<01808>>01794000
   TOS:=MEASPROCXDSBASE;                                       <<01808>>01796000
   TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*                   <<01808>>01798000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPAND;                     <<01808>>01800000
   ASMB(LSEA);                                                 <<01808>>01802000
   TOS:=TOS+1;                                                 <<01808>>01804000
   ASMB(SSEA;DDEL);                                            <<01808>>01806000
   END;                                                        <<01808>>01808000
MMSTAT(2,ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKDST),15,           <<01563>>01810000
         ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'DELTAZ));               <<01563>>01812000
DISABLE;                                                       <<01563>>01814000
ABSOLUTE(SYSWAITTODISPMSG).MEMTRAPFLAG:=1;                     <<01563>>01816000
PCBPT:=ABSOLUTE(CPCB)-ABSOLUTE(PCBB);                          <<01965>>01818000
IF ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM).STOVRALLFLAG=1      <<01950>>01820000
THEN SUDDENDEATH(640);                                         <<01950>>01822000
X:=STACKDST:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKDST);          <<01563>>01824000
IF LOGICAL(DST(X:=X&LSL(2)+1)).SEGRESIDENTFLAG                 <<01656>>01826000
THEN SUDDENDEATH(643);                                         <<01680>>01828000
OLDSIZE:=DST(X:=STACKDST&LSL(2)).DATASIZEFIELD&LSL(2);         <<01563>>01830000
TOS:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKBANK);                 <<01563>>01832000
TOS:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKBASE);                 <<01563>>01834000
TOS:=TOS+SBTORELDB;                                            <<01563>>01836000
ASMB(LSEA);                                                    <<01563>>01838000
DBRELTOSTKBASE:=TOS;                                           <<01563>>01840000
TOS:=TOS-SBTORELDB;                                            <<01563>>01842000
TOS:=TOS+STBTOMAXDATA; <<21 DECIMAL>>                          <<01563>>01844000
ASMB(LSEA);<<MAX FOR PCBXTOZ>>                                 <<01563>>01846000
MAXSTACKSIZE:=TOS;                                             <<01563>>01848000
TOS:=TOS+MAXDATATORELZ; <<9>>                                  <<01563>>01850000
ASMB(LSEA);                                                    <<01563>>01852000
OLDDELTAZ:=S0;                                                 <<01563>>01854000
TOS:=TOS+120;                                                  <<01563>>01856000
ASMB(SSEA); <<IN CASE BLOCK IN GETDATASEGCHANGESTATE>>         <<01563>>01858000
IF OLDDELTAZ >= MAXSTACKSIZE-DBRELTOSTKBASE THEN               <<01713>>01860000
   BEGIN <<STACK HAS GROWN BEYOND ALLOWABLE SIZE>>             <<01563>>01862000
   ABSOLUTE(X:=ABSOLUTE(4)+PROCSTATEWORDNUM).STOVFLAG:=1;      <<01563>>01864000
   IF <> THEN SUDDENDEATH(641);                                <<01680>>01866000
   INCREMENT:=EXTRAINC;                                        <<01563>>01868000
   TOS:=TOS-MAXDATATORELZ;                                     <<01563>>01870000
   TOS:=MAXSTACKSIZE+EXTRAINC;                                 <<01563>>01872000
   ASMB(SSEA);                                                 <<01563>>01874000
   TOS:=TOS+MAXDATATORELZ;                                     <<01563>>01876000
   END                                                         <<01563>>01878000
ELSE                                                           <<01563>>01880000
   BEGIN  <<STACK OK, CHECK FOR ADDS 0 INSTR >>                <<01563>>01882000
      IF INSTRUCTION <> %35000 THEN INCREMENT := STACKOVRINC   <<01563>>01884000
      ELSE INCREMENT := STACKOVRINC + USERS0;                  <<01563>>01886000
   IF LOGICAL(OLDDELTAZ+INCREMENT) >                           <<01563>>01888000
      LOGICAL(MAXSTACKSIZE-DBRELTOSTKBASE)  THEN               <<01563>>01890000
      INCREMENT := (MAXSTACKSIZE-DBRELTOSTKBASE) - OLDDELTAZ;  <<01563>>01892000
   INCREMENT:=LOGICAL(INCREMENT+3) LAND -4;                    <<01713>>01894000
   END;                                                        <<01563>>01896000
PAGESREQUIRED := (OLDSIZE+INCREMENT+OVERHEAD-1)                <<01563>>01898000
                   &LSR(PAGEPOWER)+1;                          <<01563>>01900000
WORDSREQUIRED:=PAGESREQUIRED&LSL(PAGEPOWER);                   <<01563>>01902000
<<NEWSIZE:=WORDSREQUIRED-(OVERHEAD+128) CAUSES VDS OVRFLOW>>   <<01563>>01904000
NEWSIZE:=OLDSIZE+INCREMENT;                                    <<01713>>01906000
TOS:=TOS+RELZTORBDISP+RBTORASDISP;                             <<01563>>01908000
ASMB(LSEA);                                                    <<01563>>01910000
IF TOS.REGIOFZFLAG=1 THEN                                      <<01563>>01912000
   BEGIN                                                       <<01563>>01914000
   IF STATUS.(1:1) = 0 THEN SUDDENDEATH(642);                  <<01680>>01916000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICSPDISABLECNTCELL) > 1 THEN      <<02093>>01918000
                                                               <<02093>>01920000
   COMMENT:  The purpose of the following code is to cover up  <<02093>>01922000
             a pdisable problem in which an interrupt handler  <<02093>>01924000
             appears to execute a pdisable without a           <<02093>>01926000
             corresponding penable.  This strange problem      <<02093>>01928000
             always appears to leave the pdisable count at 1.  <<02093>>01930000
             If this condition is met, we shall execute a      <<02093>>01932000
             penable on behalf of the defective software       <<02093>>01934000
             [a small prayer is in order here] and continue    <<02093>>01936000
             execution.  Otherwise we shall HALT the machine.  <<02093>>01938000
             Previously, the software crashed the machine      <<02093>>01940000
             with a SUDDENDEATH(642).  When this problem is    <<02093>>01942000
             corrected the SUDDENDEATH should be implemented;  <<02093>>01944000
                                                               <<02093>>01946000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICSPDISABLECNTCELL) = 2 THEN   <<02093>>01948000
      PENABLE   <<It's a miracle>>                             <<02093>>01950000
   ELSE                                                        <<02093>>01952000
      IF TRUE THEN                                             <<02093>>01954000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02093>>01956000
      ELSE                                                     <<02093>>01958000
         SUDDENDEATH(642);  <<Leave the SF hook in>>           <<02093>>01960000
                                                               <<02093>>01962000
   END;                                                        <<01563>>01964000
PENABLE;                                                       <<01563>>01966000
TRYAGAIN:                                                      <<01950>>01968000
GETDATASEGCHANGESTATE(STACKDST);                               <<01563>>01970000
IF < THEN SUDDENDEATH(643) ELSE IF > THEN GO TRYAGAIN;         <<01950>>01972000
<<PDISABLE IN EFFECT NOW, AND STACK MARKED ABSENT!>>           <<01563>>01974000
ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM).STOVRALLFLAG:=1;       <<01950>>01976000
TOS:=DST(X:=STACKDST&LSL(2)+2);                                <<01563>>01978000
TOS:=DST(X:=X+1);                                              <<01563>>01980000
TOS:=TOS+RBTORSDISP;                                           <<01713>>01982000
ASMB(LSEA);                                                    <<01713>>01984000
PAGESALLOC:=TOS;                                               <<01713>>01986000
TOS:=TOS+RSTORBDISP;                                           <<01713>>01988000
TOS:=TOS+MAXDATATORELDB+STBTOMAXDATA;                          <<01563>>01990000
ASMB(LSEA); <<STACK BASE TO DB>>                               <<01563>>01992000
SBRELDB:=TOS;                                                  <<01563>>01994000
TOS:=TOS+RELDBTORELZ; <<9>>                                    <<01563>>01996000
TOS:=OLDDELTAZ+INCREMENT;                                      <<01563>>01998000
ASMB(SSEA);                                                    <<01563>>02000000
IF PAGESALLOC >= PAGESREQUIRED THEN                            <<01713>>02002000
   BEGIN <<CURRENT REGION IS OK>>                              <<01563>>02004000
   ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM).                    <<01563>>02006000
   STOVRALLFLAG:=0;                                            <<01563>>02008000
   DST(X:=STACKDST&LSL(2)).DATASIZEFIELD:=NEWSIZE&LSR(2);      <<01563>>02010000
   DST(X).ABSENTFLAG:=0;                                       <<01563>>02012000
   ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'DELTAZ):=OLDDELTAZ +          <<01563>>02014000
   INCREMENT;                                                  <<01563>>02016000
   <<FLIP DB TO STACK DB FOR THE SET Z INSTRUCTION>>           <<01801>>02018000
   TOS:=ICS(-ICS'STKBANKCELL);                                 <<01801>>02020000
   TOS:=ICS(-ICS'ABSSTKDBCELL);                                <<01801>>02022000
   ASMB(XCHD);                                                 <<01801>>02024000
   TOS:=OLDDELTAZ+INCREMENT;                                   <<01783>>02026000
   SET(Z); <<STORE NEW DELTA Z INTO REGISTER>>                 <<01783>>02028000
   ASMB(XCHD;DDEL); <<DB BACK TO WHERE IT BELONGS>>            <<01801>>02030000
   PENABLE;                                                    <<01563>>02032000
   END                                                         <<01563>>02034000
ELSE                                                           <<01563>>02036000
   BEGIN <<CURRENT REGION ISN'T BIG ENOUGH>>                   <<01563>>02038000
   ABSOLUTE(SYSWAITTODISPMSG).MEMTRAPFLAG:=1;                  <<01563>>02040000
   X:=STACKDST&LSL(2);                                         <<01563>>02042000
   GENSPECREQ(STACKDST,NEWSIZE&LSR(2),0,0);                    <<01563>>02044000
   TOS:=STACKDST;                                              <<01563>>02046000
   TOS:=ABSOLUTE(CPCB)-SYSBASE;                                <<01563>>02048000
   SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                       <<01563>>02050000
   IF STATUS.(1:1) = 0 THEN                                    <<01563>>02052000
      BEGIN <<PROCESS HAD DISABLED INTERRUPTS>>                <<01563>>02054000
      TOS:=3; <<CLOCK DRT>>                                    <<01563>>02056000
      ASMB(SIN 0); <<TICK WILL DO A DISP>>                     <<01563>>02058000
      IF <> THEN SUDDENDEATH(23);                              <<01563>>02060000
      DST(STACKDST&LSL(2)).ABSENTFLAG:=0; <<MARK PRESENT>>     <<01940>>02062000
      PENABLE;                                                 <<01563>>02064000
      RETURN;                                                  <<01563>>02066000
      END                                                      <<01563>>02068000
   ELSE ASMB(DISP;PSEB); <<GET CONTROL TO DISPATCHER>>         <<01563>>02070000
   IF ICS(-ICS'PDISCNTCELL) > 0 THEN                           <<01940>>02072000
      BEGIN  <<PROCESS HAS SWITCHING DISABLED>>                <<01940>>02074000
      DST(STACKDST&LSL(2)).ABSENTFLAG:=0; <<MARK PRESENT>>     <<01940>>02076000
      RETURN; <<DISP ABOVE WILL GET CONTROL TO DISPATCHER>>    <<01940>>02078000
      END;                                                     <<01940>>02080000
   END;                                                        <<01563>>02082000
IF PCB(PCBPT+PROCSTATEWORDNUM).STOVFLAG=1                      <<01965>>02084000
AND PCB(PCBPT+RESABORTINFOWORDNUM).CRITFLAG=0                  <<01965>>02086000
AND PCB(PCBPT+RESABORTINFOWORDNUM).HASSIRFLAG=0                <<01965>>02088000
THEN                                                           <<04529>>02090000
   BEGIN                                                       <<04529>>02092000
   P := P+1; << UPDATE P FOR ABORT ROUTINE >>                  <<04529>>02094000
   << LET KERNEL ROUTINES KNOW WE'RE PROCESSING ABORT >>       <<04529>>02096000
   PCB(PCBPT+RESABORTINFOWORDNUM).STOVABORTFLAG := 1;          <<04529>>02098000
   ABORT ([8/1,8/4],0,0);                                      <<04529>>02100000
   END;                                                        <<04529>>02102000
END  <<STACKOVERFLOW>>;                                        <<01563>>02104000
                                                                        02106000
PROCEDURE  STACKUNDERFLOW;                                              02108000
   OPTION PRIVILEGED,UNCALLABLE;                                        02110000
   BEGIN                                                                02112000
   ENABLE;                                                              02114000
   ABORT([8/1,8/0],29,0);  << WITH INSTR IN XREG >>            <<03042>>02116000
   END;                                                                 02118000
                                                                        02120000
PROCEDURE  PRIVILEGEDMODEVIOLATION;                                     02122000
   OPTION PRIVILEGED,UNCALLABLE;                                        02124000
   BEGIN                                                                02126000
   ENABLE;                                                              02128000
   ABORT([8/1,8/0],6,0); << WITH INSTR IN XREG >>              <<03042>>02130000
   END;                                                                 02132000
                                                                        02134000
PROCEDURE USERTRAP;                                                     02136000
   OPTION PRIVILEGED,UNCALLABLE;                                        02138000
   BEGIN                                                                02140000
   ENABLE;                                                              02142000
   ASSEMBLE (ADDS 200);  <<PREVENT CRITICAL STACK OVERFLOW>>   <<00260>>02144000
   ASSEMBLE (SUBS 200);                                        <<00260>>02146000
   ABORT([8/1,8/0],PARAM,0);                                            02148000
   END;                                                                 02150000
                                                                        02152000
PROCEDURE CODEABSENCE;                                         <<01549>>02156000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                         <<01549>>02158000
                                                               <<01549>>02160000
COMMENT                                                        <<01549>>02162000
                                                               <<01549>>02164000
CODEABSENCE IS THE INTERNAL INTERRUPT HANDLER FOR PCAL AND     <<01549>>02166000
EXIT REFERENCES TO ABSENT SEGMENTS.  CODEABSENCE RUNS ON THE   <<01549>>02168000
TRAPPING PROCESS' STACK WITH THE FOLLOWING ENVIRONMENT SET     <<01549>>02170000
UP BY FIRMWARE :                                               <<01549>>02172000
                                                               <<01549>>02174000
X REGISTER-                                                    <<01549>>02176000
   THE INSTRUCTION CAUSING THE ABSENCE TRAP IS PLACED BY       <<01549>>02178000
   FIRMWARE INTO THE INDEX REGISTER.                           <<01549>>02180000
                                                               <<01549>>02182000
Q+1 FIRMWARE PARAMETER -                                       <<01549>>02184000
   IF ABSENT ON AN EXIT THEN N = # OF PROCEDURE PARAMETERS     <<01549>>02186000
   TO BE PEELED OFF THE STACK.                                 <<01549>>02188000
   IF ABSENT ON A PCAL, THEN =PLABEL WHERE (3:7)=CSTXEIX AND   <<01549>>02190000
   (10:6) =ENTRY NUMBER.                                       <<01549>>02192000
                                                               <<01549>>02194000
STACK MARKERS-                                                 <<01549>>02196000
IF PCAL, TWO STACK MARKERS. THE FIRST MARKER IS THE NORMAL     <<01549>>02198000
MARKER SET UP BY FIRMWARE FOR A PCAL SO THAT CONTROL AND       <<01549>>02200000
RETURN ON EXIT. THE SECOND MARKER CONTAINS GARBAGE DELTA       <<01549>>02202000
P, DELTA Q = 4, AND STATUS WITH THE CST NUMBER OF THE SEGMENT  <<01549>>02204000
THE PCAL WAS GOING TO IN IT.  CODEABSENCE WILL FIX UP THIS     <<01549>>02206000
MARKER AFTER THE REQUIRED SEG COMES IN BY LOOKING UP THE       <<01549>>02208000
DELTA P IN THE NEW SEGMMENT VIA THE STT, PLACING THIS INTO     <<01549>>02210000
THE STACK MARKER.  THIS MARKER WILL THEN BE EXITED INTO.       <<01549>>02212000
                                                               <<01549>>02214000
FOR EXITS, THERE'S ONLY ONE STACK MARKER, THE REGULAR OLD      <<01549>>02216000
ONE.  WHEN THE SEGMENT COMES IN, CODEABSENCE WILL RETRY THE    <<01549>>02218000
EXIT WITH THE N VALUE OBTAINED FROM FIRMWARE'S PARAMETER.      <<01549>>02220000
                                                               <<01549>>02222000
TO GET THE SEGMENT INTO MEMORY, CODEABSENCE HAS AN SLL ENTRY   <<01549>>02224000
BUILT FOR THE SEGMENT IN THE PROCESS' SLL AND POINTS THE SLL   <<01549>>02226000
MEMORY POINTER AT IT.  WAIT IS CALLED, WAITING ON MEMORY       <<01549>>02228000
ATTENTION                                                      <<01549>>02230000
                                                               <<01549>>02232000
;                                                              <<01549>>02234000
                                                               <<01549>>02236000
BEGIN                                                          <<01549>>02238000
                                                               <<01549>>02240000
INTEGER S0=S-0,                                                <<01549>>02242000
        S1=S-1,                                                <<01549>>02244000
        STATUS=Q-1;                                            <<01549>>02246000
INTEGER PCALSTATUS=Q-5;                                        <<01950>>02248000
INTEGER FIRMWAREPARM=Q+1,                                      <<03042>>02250000
        PROCINX=Q+6,                                           <<03042>>02252000
        CSTXEIX=Q+7,                                           <<03042>>02254000
        SLLINX=Q+8,                                            <<03042>>02256000
        DESCSTINX=Q+9;                                         <<03042>>02258000
LOGICAL SEGIDENTIFIER=Q+10,                                    <<03042>>02260000
        INSTR=Q+2,                                             <<03042>>02262000
        PCALFLAG=Q+3,                                          <<03042>>02264000
        TRACE=Q+11;                                            <<03042>>02266000
DOUBLE SAVEDB=Q+4;                                             <<03042>>02268000
                                                               <<03042>>02270000
SUBROUTINE ABORT'PROC (MODE,CODE,ABORT'PARM);                  <<03042>>02272000
   VALUE MODE,CODE,ABORT'PARM;                                 <<03042>>02274000
   INTEGER MODE,CODE,ABORT'PARM;                               <<03042>>02276000
BEGIN                                                          <<03042>>02278000
   COMMENT:  THIS CODE PLACES THE INSTRUCTION IN X AND         <<03042>>02280000
      CALLS ABORT. MODE.(8:8), CODE AND ABORT'PARM ARE AS      <<03042>>02282000
      DEFINED FOR ABORT;                                       <<03042>>02284000
   X := INSTR;                                                 <<03042>>02286000
   << POP GARBAGE MARKER LAID DOWN FOR PCALS >>                <<03042>>02288000
   MODE.(0:8) := IF PCALFLAG THEN 2 ELSE 1;                    <<03042>>02290000
   ABORT (MODE,CODE,ABORT'PARM);                               <<03042>>02292000
END;                                                           <<03042>>02294000
TOS := X; << SET UP INSTR >>                                   <<03042>>02296000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICSPDISABLECNTCELL) > 0 THEN      <<02093>>02300000
                                                               <<02093>>02302000
   COMMENT:  The purpose of the following code is to cover up  <<02093>>02304000
             a pdisable problem in which an interrupt handler  <<02093>>02306000
             appears to execute a pdisable without a           <<02093>>02308000
             corresponding penable.  This strange problem      <<02093>>02310000
             always appears to leave the pdisable count at 1.  <<02093>>02312000
             If this condition is met, we shall execute a      <<02093>>02314000
             penable on behalf of the defective software       <<02093>>02316000
             [a small prayer is in order here] and continue    <<02093>>02318000
             execution.  Otherwise we shall HALT the machine.  <<02093>>02320000
             Previously, the software crashed the machine      <<02093>>02322000
             with a SUDDENDEATH(644).  When this problem is    <<02093>>02324000
             corrected the SUDDENDEATH should be implemented;  <<02093>>02326000
                                                               <<02093>>02328000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICSPDISABLECNTCELL) = 1 THEN   <<02093>>02330000
      PENABLE   <<It's a miracle>>                             <<02093>>02332000
   ELSE                                                        <<02093>>02334000
      IF TRUE THEN                                             <<02093>>02336000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02093>>02338000
      ELSE                                                     <<02093>>02340000
         SUDDENDEATH(644);  <<Leave the SF hook in>>           <<02093>>02342000
                                                               <<02093>>02344000
                                                               <<01549>>02346000
TRAPSOFF;                                                      <<01857>>02348000
PDISABLE;                                                      <<01549>>02350000
ENABLE;                                                        <<01549>>02352000
                                                               <<01549>>02354000
<<FILL IN THE LOCAL VARIABLES>>                                <<01549>>02356000
                                                               <<01549>>02358000
Comment  If we have a code absence for a PCAL instruction,     <<04268>>02360000
         and we get a control Y pseudo interrupt while waiting <<04268>>02362000
         for the segment to come in , the delayed control Y    <<04268>>02364000
         flag is set in the delta P by PSEUDOINT inside of     <<04268>>02366000
         bit (0:1). However, when the code segment is brought  <<04268>>02368000
         in, the top two bits of the delta P word will be set  <<04268>>02370000
         to zero (in the old code), and the delayed control Y  <<04268>>02372000
         will be forever lost. Now the garbage delta P is set  <<04268>>02374000
         to zero before queueing on the segment, and the delta <<04268>>02376000
         P which is restored does not mask off bit 0.          <<04268>>02378000
;                                                              <<04268>>02380000
IF FIRMWAREPARM < 0 THEN  << it's a PCAL >>                    <<04268>>02382000
   BEGIN                                                       <<04268>>02384000
   P := 0; << delta P in the marker for the absent segment >>  <<04268>>02386000
   TOS := TRUE;                                                <<04268>>02388000
   END                                                         <<04268>>02390000
ELSE                                                           <<04268>>02392000
   TOS := FALSE;                                               <<04268>>02394000
TOS:=%1000D;                                                   <<01549>>02396000
X:=ABSOLUTE(CPCB)-S0;                                          <<01549>>02398000
ASMB(XCHD); <<FILLS IN SAVEDB>>                                <<01549>>02400000
TOS:=X;<<PROCINX>>                                             <<01549>>02402000
TOS:=PBX;<<CSTXEIX>>                                           <<01549>>02404000
TOS:=SLLPTR; <<SLLINX>>                                        <<01549>>02406000
<<FORM SEGIDENTIFIER>>                                         <<01549>>02408000
TOS:=STATUS.(8:8); <<MASK OFF ENTRY NUMBER>>                   <<01549>>02410000
TOS:=S0-%300;                                                  <<01549>>02412000
IF < THEN                                                      <<01549>>02414000
   BEGIN <<SL SEG>>                                            <<01549>>02416000
   ASMB(DEL);                                                  <<01549>>02418000
   TOS:=TOS&LSL(2)+DFC;  <<DESCSTINX>>                         <<01549>>02420000
   TOS:=BUILDSEGID(1,STATUS.(8:8),0);                          <<01549>>02422000
   END                                                         <<01549>>02424000
ELSE                                                           <<01549>>02426000
   BEGIN <<CSTX BLOCK SEG>>                                    <<01549>>02428000
   ASMB(DELB);                                                 <<01549>>02430000
   TOS:=TOS&LSL(2)+CSTXBLK(CSTXEIX);  <<DESCSTINX PARM>>       <<01549>>02432000
   TOS:=BUILDSEGID(2,STATUS.(8:8),                             <<01549>>02434000
   (ABSOLUTE(CPCB)-ABSOLUTE(PCBB))/PCBSIZE);                   <<01549>>02436000
   END;                                                        <<01549>>02438000
TOS:=FALSE; <<FILL IN TRACE FLAG LATER>>                       <<01549>>02440000
IF DST(DESCSTINX).CODESIZEFIELD = 0 THEN                       <<01549>>02442000
   BEGIN <<BAD ENTRY>>                                         <<01549>>02444000
   DST(X).REFERENCEDFLAG:=0;PENABLE;                           <<01549>>02446000
   ABORT'PROC (0,30,0); RETURN;                                <<03042>>02448000
   END;                                                        <<01549>>02450000
IF LOGICAL(DST(X:=DESCSTINX+1)).ROCFLAG THEN                   <<01549>>02452000
   BEGIN <<RECOVERABLE>>                                       <<01549>>02454000
   RECOVEROC(SEGIDENTIFIER,DESCSTINX);                         <<01549>>02456000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<01549>>02458000
      BEGIN  <<MEASURE RECOVERY OF CODE OVERLAY CANDIDATE>>    <<01549>>02460000
      TOS:=MEASSTATXDSBANK;                                    <<01549>>02462000
      TOS:=MEASSTATXDSBASE;                                    <<01549>>02464000
      TOS:=TOS+C0SUB0'SEGRELOFF;                               <<01549>>02466000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN                       <<01549>>02468000
         TOS:=TOS+C'PBXRECOVERY                                <<01549>>02470000
         ELSE TOS:=TOS+C'SLRECOVERY;                           <<01549>>02472000
      ASMB(LSEA;INCA;SSEA;DDEL);                               <<01549>>02474000
      END;                                                     <<01549>>02476000
   END                                                         <<01549>>02478000
ELSE                                                           <<01549>>02480000
   BEGIN<<ENTER REQUEST FOR SEG AND WAIT>>                     <<02013>>02482000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<02013>>02484000
      BEGIN  <<MEASURE CODE TRAP EVENT>>                       <<02013>>02486000
      TOS:=MEASSTATXDSBANK;                                    <<02013>>02488000
      TOS:=MEASSTATXDSBASE;                                    <<02013>>02490000
      TOS:=TOS+C0SUB0'SEGRELOFF;                               <<02013>>02492000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN                       <<02013>>02494000
         TOS:=TOS+C'STOPPBXFAULT                               <<02013>>02496000
         ELSE TOS:=TOS+C'STOPSLFAULT;                          <<02013>>02498000
      ASMB(LSEA;INCA;SSEA;DDEL);                               <<02013>>02500000
      END;                                                     <<02013>>02502000
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<02013>>02504000
      BEGIN <<PROCESS LEVEL PBX OR SL SEG FAULT>>              <<02013>>02506000
      TOS:=MEASPROCXDSBANK;                                    <<02013>>02508000
      TOS:=MEASPROCXDSBASE;                                    <<02013>>02510000
      TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*                <<02013>>02512000
           CLASS15'SUB0SIZE;                                   <<02013>>02514000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN                       <<02013>>02516000
         TOS:=TOS+CP'STOPPBXFAULT                              <<02013>>02518000
         ELSE TOS:=TOS+CP'STOPSLFAULT;                         <<02013>>02520000
      ASMB(LSEA);                                              <<02013>>02522000
      TOS:=TOS+1;                                              <<02013>>02524000
      ASMB(SSEA;DDEL);                                         <<02013>>02526000
      END;                                                     <<02013>>02528000
   <<STUFF AWAY REASON STOPPED IN PCBX OF THIS PROCESS>>       <<02013>>02530000
   <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>     <<02013>>02532000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBANKCELL);                      <<02013>>02534000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBASECELL);                      <<02013>>02536000
   TOS:=TOS+PXGLOBSIZE+MEASSTOPREASON'IDX;                     <<02013>>02538000
   TOS:=STOPSEGFAULT;                                          <<02013>>02540000
   ASMB(SSEA;DDEL);                                            <<02013>>02542000
   TOS:=SAVEDB;                                                <<02013>>02544000
   ASMB(XCHD);                                                 <<02013>>02546000
   DO                                                          <<02013>>02548000
      BEGIN                                                    <<02013>>02550000
      QUEUEONSEGMENT(SEGIDENTIFIER);                           <<02013>>02552000
      PDISABLE;                                                <<02013>>02554000
      IF SEGIDENTIFIER.SEGIDPBXFLAG THEN DESCSTINX:=           <<02013>>02556000
       CONVSEGIDTOSTINX(SEGIDENTIFIER); <<MAY HAVE MOVED>>     <<02013>>02558000
      END                                                      <<02013>>02560000
   UNTIL DST(DESCSTINX) > 0;                                   <<02013>>02562000
   ASMB(XCHD);                                                 <<02013>>02564000
   SAVEDB:=TOS;                                                <<02013>>02566000
   <<THE REQUIRED SEGMENT IS AROUND NOW>>                      <<02013>>02568000
   END;                                                        <<02013>>02570000
IF NOT PCALFLAG THEN                                           <<01549>>02572000
   BEGIN <<RETRY EXIT>>                                        <<01549>>02574000
   TOS:=SAVEDB;                                                <<01549>>02576000
   ASMB(XCHD);                                                 <<01549>>02578000
                                                               <<04530>>02580000
   COMMENT :                                                   <<04530>>02582000
                                                               <<04530>>02584000
      The code below will avert a SF10 with a process          <<04530>>02586000
    which has a corrupted stack marker.                        <<04530>>02588000
                                                               <<04530>>02590000
   ;                                                           <<04530>>02592000
                                                               <<04530>>02594000
   IF INTEGER(LOGICAL(P) LAND %37777) >                        <<04530>>02596000
      DST(DESCSTINX).CODESIZEFIELD&LSL(2) AND                  <<04530>>02598000
      (CPCBPSIM <> 5) AND (CPCBDELAYSOFT <> 1) THEN            <<04530>>02600000
      BEGIN                                                    <<04530>>02602000
      ABORT'PROC ( 0, 24, 0 );   << BOUNDS VIOLATION >>        <<04530>>02604000
      RETURN                                                   <<04530>>02606000
      END;                                                     <<04530>>02608000
   TOS:=LOGICAL(FIRMWAREPARM) LOR %31400;                      <<01549>>02610000
   PENABLE;                                                    <<01549>>02612000
   ASMB(XEQ 0);                                                <<01549>>02614000
   END                                                         <<01549>>02616000
ELSE                                                           <<01549>>02618000
   BEGIN <<MAKE PCAL TESTS FOR FIRMWARE>>                      <<01549>>02620000
   X:=DSTSYSBASEINX+CONVSEGIDTOSTINX(SEGIDENTIFIER);           <<01549>>02622000
   IF SEGDESCFIRMINFO.TRACEFLAG=1 THEN TRACE:=TRUE;            <<01549>>02624000
   TOS:=SEGDESCBANK;                                           <<01549>>02626000
   TOS:=SEGDESCADDR;                                           <<01549>>02628000
   TOS:=SEGDESCFIRMINFO.CODESIZEFIELD&LSL(2)-1; <<PL(0)>>      <<01549>>02630000
   ASMB(LADD;LSEA);                                            <<01549>>02632000
   TOS:=TOS.(8:8);  <<NUMBER OF STT ENTRIES FOR SEGMENT>>      <<01549>>02634000
   TOS:=FIRMWAREPARM.(1:7); <<TARGET STT #>>                   <<01549>>02636000
   IF S0 > S1 THEN                                             <<01549>>02638000
      BEGIN <<STT IS TOO LARGE>>                               <<01549>>02640000
      TOS:=SAVEDB;                                             <<01549>>02642000
      ASMB(XCHD);                                              <<01549>>02644000
      PENABLE;                                                 <<01549>>02646000
      ABORT'PROC (0,31,0);  <<BADSTT>>                         <<03042>>02648000
      RETURN;                                                  <<01549>>02650000
      END;                                                     <<01549>>02652000
   ASMB(DELB,LSUB;LSEA);                                       <<01549>>02654000
   IF < THEN                                                   <<01549>>02656000
      BEGIN <<STT BEING REFERENCED IS EXTERNAL>>               <<01549>>02658000
      TOS:=SAVEDB;ASMB(XCHD);PENABLE;                          <<01549>>02660000
      ABORT'PROC (0,31,0);  <<EXTSTTREF>>                      <<03042>>02662000
      RETURN;                                                  <<01549>>02664000
      END;                                                     <<01549>>02666000
   ASMB(TBC UNCALLABLEBIT);                                    <<01549>>02668000
   IF <> THEN                                                  <<01549>>02670000
      BEGIN <<ENTRY IS UNCALLABLE>>                            <<01549>>02672000
      IF (PCALFLAG LAND PCALSTATUS>=0)                         <<01950>>02674000
      LOR (NOT PCALFLAG LAND STATUS>=0) THEN                   <<01950>>02676000
         BEGIN <<NOT PRIVILEGED>>                              <<01549>>02678000
         TOS:=SAVEDB;                                          <<01549>>02680000
         ASMB(XCHD);                                           <<01549>>02682000
         PENABLE;                                              <<01549>>02684000
         ABORT'PROC (0,17,0);  <<UNCALLABLEREF>>               <<03042>>02686000
         RETURN;                                               <<01549>>02688000
         END;                                                  <<01549>>02690000
      END;                                                     <<01549>>02692000
                                                               <<01549>>02694000
   <<PUT THE DELTA P INTO THE SECOND STACK MARKER>>            <<01549>>02696000
                                                               <<01549>>02698000
   TOS := TOS LAND %37777; << mask off delta P >>              <<04268>>02700000
   TOS := P;                                                   <<04268>>02702000
   P := TOS LOR TOS;                                           <<04268>>02704000
   IF P.(2:14) > DST(DESCSTINX).CODESIZEFIELD&LSL(2)           <<04268>>02706000
   THEN SUDDENDEATH(645);                                      <<01680>>02708000
                                                               <<01549>>02710000
   <<CHECK IF SEGMENT IS BEING TRACED>>                        <<01549>>02712000
                                                               <<01549>>02714000
   IF TRACE THEN                                               <<01549>>02716000
      BEGIN                                                    <<01549>>02718000
      TOS:=ABSOLUTE(TRACELABEL);                               <<01549>>02720000
      IF < THEN                                                <<01549>>02722000
         BEGIN                                                 <<01549>>02724000
         DISABLE;                                              <<01549>>02726000
         ASMB(PCAL 0);                                         <<01549>>02728000
         END                                                   <<01549>>02730000
      ELSE                                                     <<01549>>02732000
         BEGIN <<TRACE ROUTINE ISN'T AROUND>>                  <<01549>>02734000
         TOS:=SAVEDB;ASMB(XCHD);PENABLE;                       <<03042>>02736000
         ABORT'PROC (0,22,0);  <<TRACEABS>>                    <<03042>>02738000
         END;                                                  <<01549>>02740000
      END;                                                     <<01549>>02742000
   TOS:=SAVEDB;                                                <<01549>>02744000
   ASMB(XCHD);                                                 <<01549>>02746000
   PENABLE;                                                    <<01549>>02748000
   END;                                                        <<01549>>02750000
END  <<CODEABSENCE>>;                                          <<01549>>02752000
                                                                        02756000
PROCEDURE  TRACE;                                                       02758000
   OPTION PRIVILEGED,UNCALLABLE;                                        02760000
   BEGIN                                                                02762000
   DEFINE  PSIM = (0:3)#;  << PSEUDO INTERRUPT MODE >>                  02764000
   INTEGER  INST = Q+2; << LAST INSTRUCTION FROM X REG >>               02766000
                                                               <<03042>>02768000
   SUBROUTINE ABORT'PROC (MODE,CODE,ABORT'PARM);               <<03042>>02770000
      VALUE MODE,CODE,ABORT'PARM;                              <<03042>>02772000
      INTEGER MODE,CODE,ABORT'PARM;                            <<03042>>02774000
   BEGIN                                                       <<03042>>02776000
      COMMENT:  THIS CODE PLACES THE INSTRUCTION IN X          <<03042>>02778000
         AND CALLS ABORT. MODE, CODE AND ABORT'PARM ARE        <<03042>>02780000
         AS DEFINED FOR ABORT;                                 <<03042>>02782000
      X := INST;                                               <<03042>>02784000
      ABORT (MODE,CODE,ABORT'PARM);                            <<03042>>02786000
   END;                                                        <<03042>>02788000
                                                                        02790000
   TOS := X;                                                            02792000
   TOS := PARAM;                                                        02794000
   IF  <  THEN   << PCAL >>                                             02796000
      BEGIN                                                             02798000
      TOS := TOS.(8:8); << GET CST NUMBER >>                            02800000
      ASMB(DUP);                                                        02802000
      IF TOS < %300 THEN X := 0 ELSE                                    02804000
      BEGIN                                                             02806000
         X := 1;                                                        02808000
         TOS := TOS - %300;                                             02810000
      END;                                                              02812000
      TOS := F(TOS&LSL(2) + F(X) + 2); << BANK # >>                     02814000
      TOS := F(X := X + 1); << BANK OFFSET >>                           02816000
      TOS := TOS + F(X := X - 3).(4:12)&LSL(2) - 1 - PARAM.(1:7);       02818000
      ASMB(LSEA); << GET STT OF CALLED SEGMENT >>                       02820000
      IF < THEN SUDDENDEATH(289);                                       02822000
      P := TOS.(2:14);                                                  02824000
      DDEL;                                                             02826000
      TOS := PARAM;                                                     02828000
      TOS := INST;                                                      02830000
      TOS := 0;                                                         02832000
      TOS := F(TRACELABEL);                                             02834000
      IF < THEN                                                         02836000
      BEGIN                                                             02838000
         ASMB(PCAL 0);                                                  02840000
         RETURN;                                                        02842000
      END;                                                              02844000
      ENABLE;                                                           02846000
      ABORT'PROC ([8/2,8/0],22,0);<<POP DESTINATION MARKER>>   <<03042>>02848000
      END                                                               02850000
   ELSE                                                                 02852000
      BEGIN  << EXIT >>                                                 02854000
      TOS := P;                                                         02856000
      TOS.(0:1) := 0;                                                   02858000
      TOS.(1:1) := 0;                                                   02860000
      P := TOS;                                                         02862000
      IF  =  THEN                                                       02864000
         BEGIN  <<DELAYED CONTROL-Y OR SOFTWARE INTERRUPT>>    <<03042>>02866000
         IF CPCBPSIM = 5 OR CPCBDELAYSOFT = 1 THEN             <<03042>>02868000
            DELAYEDINT                                         <<03042>>02870000
         ELSE                                                  <<03042>>02872000
            ABORT'PROC ([8/1,8/0],22,0);                       <<03042>>02874000
         END ELSE                                                       02876000
         BEGIN << EXIT TRACE >>                                         02878000
            IF DELTAQ < 0 THEN DELTAQ.(0:1) := 0; << SET DEL Q POS >>   02880000
            TOS := PARAM;                                               02882000
            TOS := INST;                                                02884000
            TOS := 0;                                                   02886000
            TOS := F(TRACELABEL);                                       02888000
            IF <> THEN ASMB(PCAL 0) ELSE                                02890000
            BEGIN                                                       02892000
               ENABLE;                                                  02894000
               ABORT'PROC ([8/1,8/0],22,0);                    <<03042>>02896000
            END;                                                        02898000
         END;                                                           02900000
      TOS := TOS LOR %31400;                                            02902000
      ASMB( XEQ 0 );                                                    02904000
      HELP;  << DUMMY CALL FOR LINKING WITH DEBUGGER >>                 02906000
      END;                                                              02908000
   END;                                                                 02910000
                                                                        02912000
PROCEDURE  STTUNCALLABLE;                                               02914000
   OPTION PRIVILEGED,UNCALLABLE;                                        02916000
   BEGIN                                                                02918000
   ENABLE;                                                              02920000
                                                                        02922000
   << ABORT WITH INSTR. IN XREG >>                             <<03042>>02924000
   ABORT([8/1,8/0],17,0);                                               02926000
   END;                                                                 02928000
                                                               <<01549>>02930000
                                                               <<01549>>02932000
PROCEDURE DATAABSENCE;                                         <<01549>>02934000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                         <<01549>>02936000
                                                               <<01549>>02938000
COMMENT                                                        <<01549>>02940000
                                                               <<01549>>02942000
DATAABSENCE IS THE INTERNAL INTERRUPT HANDLER FOR MOVES        <<01549>>02944000
ATTEMPTED TO AN ABSENT DATA SEGMENT. DATAABSENCE RUNS ON       <<01549>>02946000
THE TRAPPING PROCESS' STACK, AND FIRMWARE HAS PUSHED THE       <<01549>>02948000
TARGET DATA SEGMENT NUMBER INTO Q+1. THE PROCESS ATTEMPT-      <<01549>>02950000
ING THE MOVE WILL HAVE AN ENTRY FOR THE REQUIRED SEGMENT       <<01549>>02952000
PLACED IN ITS SLL WITH THE SLL MEMORY POINTER AIMED AT IT.     <<01549>>02954000
THE PROCESS WILL THEN BE WAITED UNTIL THE SEG IS MADE          <<01549>>02956000
PRESENT, THEN THE MOVE WILL BE RETRIED BY DECREMENTING         <<01549>>02958000
THE P REGISTER VALUE IN THE STACK MARKER AND EXITING.          <<01549>>02960000
                                                               <<01549>>02962000
;                                                              <<01549>>02964000
                                                               <<01549>>02966000
BEGIN                                                          <<01549>>02968000
                                                               <<01549>>02970000
INTEGER FIRMWAREPARM=Q+1,                                      <<03042>>02972000
        INSTR=Q+2,                                             <<03042>>02974000
        S0=S-0;                                                <<03042>>02976000
                                                               <<03042>>02978000
TOS := X; << SET UP INSTR >>                                   <<03042>>02980000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICSPDISABLECNTCELL) > 0 THEN      <<02093>>02982000
                                                               <<02093>>02984000
   COMMENT:  The purpose of the following code is to cover up  <<02093>>02986000
             a pdisable problem in which an interrupt handler  <<02093>>02988000
             appears to execute a pdisable without a           <<02093>>02990000
             corresponding penable.  This strange problem      <<02093>>02992000
             always appears to leave the pdisable count at 1.  <<02093>>02994000
             If this condition is met, we shall execute a      <<02093>>02996000
             penable on behalf of the defective software       <<02093>>02998000
             [a small prayer is in order here] and continue    <<02093>>03000000
             execution.  Otherwise we shall HALT the machine.  <<02093>>03002000
             Previously, the software crashed the machine      <<02093>>03004000
             with a SUDDENDEATH(644).  When this problem is    <<02093>>03006000
             corrected the SUDDENDEATH should be implemented;  <<02093>>03008000
                                                               <<02093>>03010000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICSPDISABLECNTCELL) = 1 THEN   <<02093>>03012000
      PENABLE   <<It's a miracle>>                             <<02093>>03014000
   ELSE                                                        <<02093>>03016000
      IF TRUE THEN                                             <<02093>>03018000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02093>>03020000
      ELSE                                                     <<02093>>03022000
         SUDDENDEATH(644);  <<Leave the SF hook in>>           <<02093>>03024000
                                                               <<02093>>03026000
                                                               <<01549>>03028000
TRAPSOFF;                                                      <<01857>>03030000
PDISABLE;                                                      <<01549>>03032000
DISABLE;                                                       <<01549>>03034000
<<IF FIRMWAREPARM = ABSOLUTE(ABSOLUTE(4)+3).(1:10) THEN HELP>> <<01549>>03036000
IF DST(X:=FIRMWAREPARM&LSL(2)).DATASIZEFIELD = 0 THEN          <<01549>>03038000
   BEGIN <<DAD DST ENTRY>>                                     <<01549>>03040000
   DST(X).REFERENCEDFLAG:=0;                                   <<01549>>03042000
   PENABLE;X:=INSTR;ABORT([8/1,8/0],17,0);RETURN;              <<03042>>03044000
   END;                                                        <<01549>>03046000
IF LOGICAL(DST(X:=FIRMWAREPARM&LSL(2)+1)).ROCFLAG THEN         <<01549>>03048000
   BEGIN  <<RECOVERABLE>>                                      <<01549>>03050000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<01549>>03052000
      BEGIN  <<MEASURE DATA SEG RECOVERY>>                     <<01549>>03054000
      TOS:=MEASSTATXDSBANK;                                    <<01549>>03056000
      TOS:=MEASSTATXDSBASE;                                    <<01549>>03058000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'DATARECOVERY;                <<01549>>03060000
      ASMB(LSEA);                                              <<01549>>03062000
      TOS:=TOS+1;                                              <<01549>>03064000
      ASMB(SSEA;DDEL);                                         <<01549>>03066000
      END;                                                     <<01549>>03068000
   TOS:=%1000D;                                                <<01549>>03070000
   X:=ABSOLUTE(CPCB)-S0;                                       <<01549>>03072000
   ASMB(XCHD);                                                 <<01549>>03074000
   RECOVEROC(FIRMWAREPARM,FIRMWAREPARM&LSL(2));                <<01549>>03076000
   ASMB(XCHD);                                                 <<01549>>03078000
   PENABLE;                                                    <<01549>>03080000
   END                                                         <<01549>>03082000
ELSE                                                           <<01549>>03084000
   BEGIN                                                       <<02013>>03086000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<02013>>03088000
      BEGIN  <<MEASURE DATA TRAP EVENT>>                       <<02013>>03090000
      TOS:=MEASSTATXDSBANK;                                    <<02013>>03092000
      TOS:=MEASSTATXDSBASE;                                    <<02013>>03094000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPDATAFAULT;               <<02013>>03096000
      ASMB(LSEA);                                              <<02013>>03098000
      TOS:=TOS+1;                                              <<02013>>03100000
      ASMB(SSEA;DDEL);                                         <<02013>>03102000
      END;                                                     <<02013>>03104000
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<02013>>03106000
      BEGIN <<PROCESS LEVEL DATASEG FAULT>>                    <<02013>>03108000
      TOS:=MEASPROCXDSBANK;                                    <<02013>>03110000
      TOS:=MEASPROCXDSBASE;                                    <<02013>>03112000
      TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*                <<02013>>03114000
           CLASS15'SUB0SIZE+CP'STOPDSTFAULT;                   <<02013>>03116000
      ASMB(LSEA);                                              <<02013>>03118000
      TOS:=TOS+1;                                              <<02013>>03120000
      ASMB(SSEA;DDEL);                                         <<02013>>03122000
      END;                                                     <<02013>>03124000
   <<STUFF AWAY REASON STOPPED IN PCBX OF THIS PROCESS>>       <<02013>>03126000
   <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>     <<02013>>03128000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBANKCELL);                      <<02013>>03130000
   TOS:=ABS(ABS(ICS'QI)-ICS'STKBASECELL);                      <<02013>>03132000
   TOS:=TOS+PXGLOBSIZE+MEASSTOPREASON'IDX;                     <<02013>>03134000
   TOS:=STOPSEGFAULT;                                          <<02013>>03136000
   ASMB(SSEA;DDEL);                                            <<02013>>03138000
   QUEUEONSEGMENT(FIRMWAREPARM);                               <<02013>>03140000
   END;                                                        <<02013>>03142000
P:=P-1; <<EXIT WILL CAUSE MOVE INSTRUCTION TO BE RETRIED>>     <<01549>>03144000
END  <<DATAABSENCE>>;                                          <<01549>>03146000
                                                                        03148000
PROCEDURE  POWERON;                                                     03150000
   OPTION PRIVILEGED,UNCALLABLE;                                        03152000
BEGIN                                                                   03154000
                                                                        03156000
EQUATE                                                                  03158000
   CLOCKDRT    = 3,     << CLOCK DRT # >>                               03160000
   COMPWAIT    = %13,   << SIODM COMPLETOR WAIT STATE >>                03162000
   CONSLDEV    = %74,   << SYSDB INDEX >>                               03164000
   CRMASK      = %70310,<< WRITE CR VALUE TO CLOCK >>                   03166000
   CS80TYPE    = %3,    << TYPE FOR CS80 DISCS     >>          <<04794>>03168000
   DDLTP       = 4,     << DLT POINTER INDEX IN DIT >>                  03170000
   DILTP       = 5,     << ILT POINTER INDEX IN DIT >>                  03172000
   DLINK       = 1,     << LINK OFFSET IN DIT >>                        03174000
   DSTAT       = 6,     << STATUS INDEX IN DIT >>                       03176000
   DSTOP       = 7,     << STOP WORD OF TREM. DIT >>                    03178000
   DTYPE       = 5,     << DEV TYPE INDEX IN DLT >>                     03180000
   ENABLEINT   = %70351,<< ENABLE CLOCK INTERRUPTS >>                   03182000
   ENABLETERM  = %015510,<< ESCAPE H TO START TERMINET >>               03184000
   FHDISC      = 1,     << FHD TYPE >>                                  03186000
   ICNTRL      = 7,     << Q & DRT INDEX INTO ILT >>           <<01300>>03188000
   IFLAG       = 13,     << FLAGS WORD OF ILT >>               <<02501>>03190000
   IFLAGMASKWORD = %100037, << ILT FLAGS MASK WORD >>          <<02501>>03192000
   LRMASK      = %70210,<< WRITE LR VALUE TO CLOCK >>                   03194000
   PFPROC      = %144,  << POWERFAIL PROC SYSDB INDEX >>                03196000
   POWERFAIL   = %72,   << POWERFAIL FLAG SYSDB INDEX >>                03198000
   SYSDB       = %1000,                                                 03200000
   SYSTRL      = %12;   << TIMER REQUEST LIST PTR INDEX >>              03202000
                                                                        03204000
DEFINE                                                                  03206000
   CHANQ       = (1:6)#, << CHANNEL QUEUE NUM. IN ILT >>                03210000
   DRVRDY      = (3:1)#, << DRIVE READY BIT IN DISC STATUS >>           03212000
   DRTN        = (10:6)#,<< DRT # IN ILT(ICNTRL) >>            <<02070>>03214000
   IAK         = (8:1)#, << INT ACK BIT OF DIT >>                       03216000
   MAXENTRY    = (0:8)#, << # OF ENTRIES IN THE LPDT >>                 03218000
   REQUEST     = (3:1)#, << SERVICE REQUEST BIT OF DFLAGS >>            03220000
   STATEF      = (12:4)#,<< SIODM STATE FIELD OF DIT >>                 03222000
   SUBTYPE     = (12:4)#,<< DEV SUBTYPE FIELD OF LPDT >>                03224000
   TERMTYPE    = (5:5)#, << TERMINAL TYPE >>                            03226000
   TYPE        = (8:8)#; << TYPE FIELD OF DLT >>                        03228000
                                                                        03230000
INTEGER                                                                 03232000
   ABSQI       = Q+7,                                                   03234000
   CR          = Q+6,                                                   03236000
   I           = Q+3,                                                   03238000
   LR          = Q+5,                                                   03240000
   PF          = DB+POWERFAIL,                                          03242000
   PFAILPIN    = DB+PFPROC,                                             03244000
   SM2         = S-2,                                                   03246000
   SYSCONSOLE  = DB+CONSLDEV,                                           03248000
   SYSUP       = DB+%73; << SYSTEM UP FLAG >>                           03250000
                                                                        03252000
INTEGER POINTER                                                         03254000
  MEASINFOTABPTR = %261,  << FOR CLOCK INTERFACE >>            <<01549>>03256000
   BUSY        = DB+%55,                                                03258000
   HEAD        = DB+%56,                                                03260000
   LPDT        = DB+%10,                                                03262000
   PS0         = S-0,                                                   03264000
   PS1         = S-1,                                                   03266000
   PS2         = S-2,                                                   03268000
   TRL         = DB+SYSTRL;                                             03270000
                                                                        03272000
DOUBLE POINTER                                                          03274000
   LPDTD       = LPDT;                                                  03276000
                                                                        03278000
ARRAY                                                                   03280000
   PFAILMSG(0:8) = PB := %6412,"**POWERFAIL**",%6412;                   03282000
                                                                        03284000
   ASMB(ADDS 1;ADDS 0); << RESTORE S >>                                 03286000
   TOS := 0;                                                            03288000
   TOS := SYSDB;                                                        03290000
   SET(DB,DL,Q,S); << RESTORE OTHER REGISTERS >>                        03292000
   ABS(ABSQI+4) := TOS; << RESTORE QI + 4 >>                            03294000
   ABS(X:=X-1) := TOS;                                                  03296000
   ABS(X:=X-9) := TOS; << QI+3, AND QI-6 >>                             03298000
   PF := 2;                                                             03300000
   TOS := -1;                                                           03302000
   TOS := LPDTD(SYSCONSOLE);                                            03304000
   ASMB(DEL,DUP; CAB,CAB); << SAVE COPY OF DITP >>                      03306000
   MPXCONTROL(*,*); << INITIALIZE THE SYSTEM CONSOLE >>                 03308000
   TOS := PS0(DSTOP).TERMTYPE;                                          03310000
   DELB; << DIT POINTER >>                                              03312000
   IF TOS = 6 THEN                                                      03314000
   BEGIN << TERMINET, RESTART MOTOR >>                                  03316000
      WRITE2(ENABLETERM); << START TERMINET MOTOR >>                    03318000
      ASMB(IXBZ *+2; BR *-1; IXBZ *+2; BR *-1; IXBZ *+2; BR *-1);       03320000
      << DELAY 6 TENTHS OF A SECOND >>                                  03322000
   END;                                                                 03324000
   FOR X := 0 UNTIL 8 DO WRITE2(PFAILMSG(X)); << OUTPUT MSG TO CON >>   03326000
   I := 1;                                                              03328000
   DO                                                                   03330000
   BEGIN << STEP THROUGH LPDT AND CLEAN UP RESOURCES >>                 03332000
      TOS := LPDTD(I);                                                  03334000
      ASMB(XCH,TEST);                                                   03336000
      IF > AND (GET'DSDEVICE(I)<2) AND (PS0(DILTP)<>0) THEN    <<01935>>03338000
      BEGIN  <<VALID DIT POINTER AND NON DS DEVICE>>           <<01623>>03340000
         TOS := PS0(DILTP);                                             03342000
         X := PS0(ICNTRL).CHANQ; << I/O CHANNEL RESOURCE >>    <<01300>>03344000
         IF <> THEN                                                     03346000
         BEGIN << FREE CHANNEL RESOURCE >>                              03348000
            BUSY(X) := 0;                                               03350000
            WHILE DEQUEUE(DLINK,X) <> -1 DO;                            03352000
         END;                                                           03354000
         TOS := PS0(IFLAG);                                    <<02501>>03356000
         TOS := TOS LAND IFLAGMASKWORD; <<CLEAR WAIT BIT>>     <<02501>>03358000
         PS1(X) := TOS;  << UPDATE FLAGS OF ILT >>             <<02501>>03360000
         TOS := PS1(DDLTP);                                             03362000
         TOS := PS0(DTYPE).TYPE; << DEVICE TYPE >>                      03364000
         DELB;                                                          03366000
         IF TOS <= CS80TYPE THEN                               <<04794>>03368000
         BEGIN << RESET ANY REQUEST WAITING FOR COMPLETION >>           03370000
            IF < AND SM2.SUBTYPE <= 3 THEN                              03372000
            BEGIN << 7900 OR 2888 TYPE DISC >>                          03374000
               TOS := PS0(ICNTRL).DRTN;                        <<02070>>03376000
WAIT:          << WAIT FOR DISC TO COME READY BEFORE CONTINUING >>      03378000
               ASMB(TIO 0);                                             03380000
               IF <> THEN IOFAILURE(TOS,0);                             03382000
               IF NOT TOS.DRVRDY THEN GO WAIT;                          03384000
               DEL;                                                     03386000
            END;                                                        03388000
            IF PS1.STATEF = COMPWAIT THEN                               03390000
            BEGIN << RESTART THE REQUEST >>                             03392000
               TOS := PS1; << GET DFLAGS FROM DIT >>                    03394000
               TOS.REQUEST := 1;                                        03396000
               TOS.IAK := 1;                                            03398000
               PS2 := TOS;                                              03400000
               PS1(DSTAT) := -1; << SET STATUS TO INDICATE DISC ERR >>  03402000
               MASTERCLEAR(PS1); << CLEAR I/O CONDITION >>              03404000
            END;                                                        03406000
         END;                                                           03408000
         DEL; << DELETE ILT POINTER ON TOS >>                           03410000
      END;                                                              03412000
      DDEL; << DELETE LPDT ENTRY ON TOS >>                              03414000
   END UNTIL (I := I + 1) > LPDT.MAXENTRY;                              03416000
   I := 1;                                                              03418000
   DO                                                                   03420000
   BEGIN << NOW GO RESTART ALL DISC REQUESTS >>                         03422000
      CHECKLDEV(I);                                                     03424000
      IF = AND CARRY THEN                                               03426000
      BEGIN << IT'S A DISC >>                                           03428000
         TOS := LPDTD(I);                                               03430000
         DEL;                                                           03432000
         TOS := 0;                                                      03434000
         AWAKEIO(*,*);                                                  03436000
      END;                                                              03438000
   END UNTIL (I := I + 1) > LPDT.MAXENTRY;                              03440000
   ABS(ABSQI-12) := PFAILPIN; << TELL DISP TO AWAKW PF PROCESS >>       03442000
     AWAKE(PFAILPIN,JUNKWAITCODE,NOWAIT);                      <<01549>>03444000
   TRL(4) := 1; << SET TIMER FLAG TO GET DISPATCHED >>                  03446000
   PF := 3; << THIS WILL CLEAR WRITECHAR IF THERE FROM PREVIOUS PF >>   03448000
   IF LRV > 0  THEN          << CLOCK IS SHARED >>             <<01146>>03450000
   BEGIN                                                       <<01146>>03452000
      TOS := -1;                                               <<01146>>03454000
      TOS := DLABEL;                                           <<01549>>03456000
      IF <  THEN  ASMB(PCAL 0);                                <<01146>>03458000
   END;                                                        <<01146>>03460000
   TOS := CLOCKDRT; <<INITIALIZE CLOCK>>                                03462000
   TOS := CR;                                                           03464000
   TOS := CRMASK;                                                       03466000
   ASMB(CIO 2; WIO 1);                                                  03468000
   TOS := LRV;                   << GET THE LIMIT REG VALUE >> <<01146>>03470000
   IF =  THEN  TOS := TOS + 100;         << LR VALUE IS 100 >> <<01146>>03472000
   TOS := LRMASK;                                                       03474000
   ASMB(CIO 2; WIO 1);                                                  03476000
   TOS := ENABLEINT;                                                    03478000
   ASMB(CIO 1; SIN 0; IXIT);                                            03480000
END;                                                                    03482000
                                                                        03484000
PROCEDURE  CALLHELP;                                                    03486000
   OPTION  PRIVILEGED,UNCALLABLE;                                       03488000
   BEGIN                                                                03490000
   << BUILD A MARKER TO HELP, EXIT THROUGH IT >>                        03492000
   TOS := 0;  << X REGISTER >>                                          03494000
   TOS := F(F(F(0)+@HELP.(8:8)*4).(4:12)*4+F(X:=X+3)-1-@HELP.(1:7));    03496000
   TOS := TOS.(2:14);   << GET RID OF UNCALLABLE BIT >>                 03498000
   PUSH(STATUS);                                                        03500000
   TOS.(8:8) := @HELP;                                                  03502000
   TOS := 4;                                                            03504000
   PUSH(S);                                                             03506000
   SET(Q);                                                              03508000
   END;                                                                 03510000
                                                                        03512000
<< OUTER BLOCK, STT # FOLLOWED BY A CALL TO THE PROCEDURE >>            03514000
ASMB(                                                                   03516000
     CON 1;   PCAL BOUNDSVIOLATION;                                     03518000
     CON 2;   PCAL ILLEGALADDRESS;                                      03520000
     CON 3;   PCAL NONRESPONDINGMODULE;                                 03522000
     CON 4;   PCAL SYSTEMPARITY;                                        03524000
     CON 5;   PCAL ADDRESSPARITY;                                       03526000
     CON 6;   PCAL DATAPARITY;                                          03528000
     CON 7;   PCAL MODULEINTERRUPT;                                     03530000
     CON 8;   PCAL CALLHELP;                                            03532000
     CON 9;   PCAL POWERFAIL;                                           03534000
     CON 10;  PCAL GHOST;                                               03536000
     CON 11;  PCAL EXTGHOST;                                            03538000
     CON 12;  PCAL GHOST;                                               03540000
     CON 13;  PCAL GHOST;                                               03542000
     CON 14;  PCAL GHOST;                                               03544000
     CON 15;  PCAL GHOST;                                               03546000
     CON 16;  PCAL UNIMPLEMENTEDINSTRUCTION;                            03548000
     CON 17;  PCAL STTVIOLATION;                                        03550000
     CON 18;  PCAL CSTVIOLATION;                                        03552000
     CON 19;  PCAL DSTVIOLATION;                                        03554000
     CON 20;  PCAL STACKUNDERFLOW;                                      03556000
     CON 21;  PCAL PRIVILEGEDMODEVIOLATION;                             03558000
     CON 22;  PCAL GHOST;                                               03560000
     CON 23;  PCAL GHOST;                                               03562000
     CON 24;  PCAL STACKOVERFLOW;                              <<01549>>03564000
     CON 25;  PCAL USERTRAP;                                            03566000
     CON 26;  PCAL GHOST;                                               03568000
     CON 27;  PCAL GHOST;                                               03570000
     CON 28;  PCAL GHOST;                                               03572000
     CON 29;  PCAL GHOST;                                               03574000
     CON 30;  PCAL GHOST;                                               03576000
     CON 31;  PCAL CODEABSENCE;                                         03578000
     CON 32;  PCAL TRACE;                                               03580000
     CON 33;  PCAL STTUNCALLABLE;                                       03582000
     CON 34;  PCAL DATAABSENCE;                                         03584000
     CON 35;  PCAL POWERON;                                             03586000
     CON 36;  PCAL GHOST                                                03588000
);                                                                      03590000
END.                                                                    03592000
