<< LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION>>               00005000
$CONTROL MAP,CODE,USLINIT                                               00010000
<< ININ -- MODULE 10 >>                                        <<1040>> 00015000
<<HP32033C MPE SOURCE C.00.00>>                                         00020000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00025000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00030000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00035000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00040000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00045000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00050000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00055000
$CONTROL MAIN=ININ                                                      00060000
$TP                                                                     00065000
BEGIN                                                                   00070000
<<                                                                      00075000
                                                                        00080000
      INTERNAL INTERRUPT SEGMENT                                        00085000
                                                                        00090000
>>                                                                      00095000
                                                                        00100000
INTEGER S0 = S-0;                                              <<06095>>00105000
INTEGER S1 = S-1;                                              <<06095>>00110000
EQUATE USERMSGPORT = 1,                                        <<06095>>00115000
       SAVEMSG = %100000;                                      <<*8778>>00120000
DEFINE  ASMB = ASSEMBLE#,                                               00125000
        CC   = (6:2)#,                                                  00130000
        F = ABSOLUTE#,                                                  00135000
        ABS=ABSOLUTE#,                                         <<01809>>00140000
        PDISABLE=ASMB(PSDB)#,                                  <<MPEIV>>00145000
        PENABLE=ASMB(PSEB)#,                                   <<MPEIV>>00150000
        INIT = CON %20302;CON 6#,                                       00155000
        DISABLE = ASMB( SED 0 )#,                                       00160000
        ENABLE = ASMB( SED 1 )#,                                        00165000
        LMEM = ASMB( LSEA )#,                                  <<1040>> 00170000
        RCCR = CON %20104;CON 0#,                                       00175000
        SCLR = CON %20104;CON 1#,                                       00180000
        TON  = CON %20104;CON 3#,                                       00185000
        SINC = CON %20104;CON %10#,                                     00190000
        CBKP = CON %36160#;                                             00195000
DEFINE  TRAPSOFF = PUSH(STATUS);                               <<01858>>00200000
                   TOS.(2:1) := 0;                             <<01858>>00205000
                   SET(STATUS)#;                               <<01858>>00210000
DEFINE  MAPPINGFIRMWARE = LOGICAL(ABS(%1220))#,                <<06095>>00215000
        SYSNRPGMSEGS    = ABS(%1223)#;                         <<06095>>00220000
$INCLUDE INCLMEAS                                              <<MPEIV>>00225000
                                                                        00230000
$INCLUDE INCLMIFT                                              <<04106>>00235000
EQUATE                                                         <<06210>>00240000
        CCE  = 2,                                                       00245000
        CCG  = 0,                                                       00250000
        CCL  = 1,                                                       00255000
        IFLAGMASKWORD = %100177, <<WORD USED TO CLEAR>>        <<03008>>00260000
                                 <<DESIRED FLAGS>>             <<03008>>00265000
                                 << OF IFLAG OF ILT ON POWER UP >>      00270000
        DSTB = 2,                                              <<1040>> 00275000
        SYSDB  = %1000,                                                 00280000
        TRACELABEL = %1257,                                             00285000
        QI = 5,                                                         00290000
        ZI = 6;                                                         00295000
$INCLUDE INCLICS                                               <<MPEIV>>00300000
                                                               <<MPEIV>>00305000
                                                                        00310000
INTEGER  X = X,                                                         00315000
         P = Q-2,     << STACK MARKER P VALUE >>                        00320000
         DELTAQ = Q+0,                                                  00325000
         STATUS = Q-1,<< STACK MARKER STATUS >>                         00330000
         PARAM = Q+1; << INTERRUPT PARAMETER >>                         00335000
                                                               <<1040>> 00340000
INTEGER POINTER DSTI' = DSTB;                                  <<1040>> 00345000
                                                                        00350000
EQUATE ICS'QI=5;                                               <<MPEIV>>00355000
EQUATE SYSBASE=%1000,                                          <<MPEIV>>00360000
       SLIX=1,                                                 <<MPEIV>>00365000
       SYSXL=SYSBASE+SLIX,                                     <<MPEIV>>00370000
       DSTIX=2,                                                <<MPEIV>>00375000
       SYSDST=SYSBASE+DSTIX,                                   <<MPEIV>>00380000
       PCBIX=3,                                                <<MPEIV>>00385000
       SYSPCB=SYSBASE+PCBIX,                                   <<MPEIV>>00390000
       DFCIX=%32,                                              <<MPEIV>>00395000
       SYSDFC=SYSBASE+DFCIX,                                   <<MPEIV>>00400000
       ICSIX=7,                                                <<MPEIV>>00405000
       SYSICS=SYSBASE+ICSIX,                                   <<MPEIV>>00410000
       CSTXBLKIX=%51,                                          <<MPEIV>>00415000
       SYSCSTXBLK=SYSBASE+CSTXBLKIX,                           <<MPEIV>>00420000
       SYSWAITTODISPMSG=%1053;                                 <<MPEIV>>00425000
                                                               <<MPEIV>>00430000
DEFINE MEMTRAPFLAG=(4:1)#;                                     <<MPEIV>>00435000
EQUATE pagepower=7;                                            <<06210>>00440000
                                                               <<06210>>00445000
                                                               <<MPEIV>>00450000
<<SYSTEM TABLE PTRS FOR LST ACCESS>>                           <<MPEIV>>00455000
                                                               <<MPEIV>>00460000
INTEGER POINTER DST=DSTIX,                                     <<MPEIV>>00465000
                PCB=PCBIX,                                     <<MPEIV>>00470000
                CSTXBLK=CSTXBLKIX,                             <<MPEIV>>00475000
               ICS=ICSIX;                                      <<MPEIV>>00480000
                                                               <<MPEIV>>00485000
INTEGER DSTSYSBASEINX=DB+DSTIX,                                <<MPEIV>>00490000
        SLSYSBASEINX=DB+SLIX,                                  <<MPEIV>>00495000
                DFC=DB+DFCIX;                                  <<MPEIV>>00500000
$INCLUDE INCLST                                                <<MPEIV>>00505000
$INCLUDE INCLPCB5                                              <<06642>>00510000
                                                               <<MPEIV>>00515000
<<WAIT/AWAKE PARAMETER DEFINITIONS>>                           <<MPEIV>>00520000
EQUATE NOINFO=0,                                               <<MPEIV>>00525000
       MEMORYWAITCODE=%10000,                                  <<MPEIV>>00530000
       JUNKWAITCODE=%20,                                       <<MPEIV>>00535000
       MEMORYTRAP=%4000,                                       <<MPEIV>>00540000
       NOWAIT=0;                                               <<MPEIV>>00545000
                                                               <<MPEIV>>00550000
$INCLUDE INCLMSG                                               <<MPEIV>>00555000
$INCLUDE INCLTRL                                               <<06827>>00560000
$include inclobj                                               <<06210>>00565000
$include inclpcbx                                              <<06210>>00570000
$include inclreg                                               <<06210>>00575000
$page ""                                                       <<06210>>00580000
DEFINE SETALLOCFLAG=(8:1)#;                                    <<MPEIV>>00585000
EQUATE UNCALLABLEBIT=1;                                        <<MPEIV>>00590000
$INCLUDE INCLLPDT                                              <<06829>>00595000
$INCLUDE INCLMMST                                              <<06830>>00600000
$include inclkcim                                              <<06210>>00605000
$include inclkdim                                                       00610000
PROCEDURE  ABORT(MODE,CODE,PARAM);                                      00615000
   VALUE MODE,CODE,PARAM;                                               00620000
   LOGICAL MODE,CODE,PARAM;                                             00625000
   OPTION EXTERNAL;                                                     00630000
                                                                        00635000
PROCEDURE ABORTPROC(PROCINX,ABORTCODE);                        <<MPEIV>>00640000
VALUE PROCINX,ABORTCODE;                                       <<MPEIV>>00645000
INTEGER PROCINX,ABORTCODE;                                     <<MPEIV>>00650000
OPTION EXTERNAL;                                               <<MPEIV>>00655000
                                                               <<MPEIV>>00660000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,      <<03094>>00665000
     P5,DEST,REPLY,OFFSET,DITP,IOTYPE);                        <<03094>>00670000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,              <<03094>>00675000
     OFFSET,DITP,IOTYPE;                                       <<03094>>00680000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,            <<03094>>00685000
     OFFSET,IOTYPE;                                            <<03094>>00690000
INTEGER POINTER DITP;                                          <<03094>>00695000
OPTION VARIABLE,EXTERNAL;                                      <<03094>>00700000
                                                               <<03094>>00705000
                                                               <<04184>>00710000
PROCEDURE DCU'REQUEST(MSGSTATE);                               <<04184>>00715000
VALUE MSGSTATE;                                                <<04184>>00720000
LOGICAL MSGSTATE;                                              <<04184>>00725000
OPTION EXTERNAL;                                               <<04184>>00730000
                                                               <<04184>>00735000
                                                               <<03650>>00740000
PROCEDURE LYNX'PF'CHECK;    OPTION EXTERNAL;                   <<03650>>00745000
                                                               <<03650>>00750000
PROCEDURE DELAYEDINT; OPTION EXTERNAL;                         <<03040>>00755000
                                                                        00760000
PROCEDURE  EADD; OPTION EXTERNAL;                                       00765000
                                                                        00770000
PROCEDURE  ESUB; OPTION EXTERNAL;                                       00775000
                                                                        00780000
PROCEDURE  EMPY; OPTION EXTERNAL;                                       00785000
                                                                        00790000
PROCEDURE  EDIV; OPTION EXTERNAL;                                       00795000
                                                                        00800000
PROCEDURE  ENEG; OPTION EXTERNAL;                                       00805000
                                                                        00810000
PROCEDURE  ECMP; OPTION EXTERNAL;                                       00815000
                                                                        00820000
PROCEDURE  QADD;  OPTION EXTERNAL;                                      00825000
                                                                        00830000
PROCEDURE  QSUB;  OPTION EXTERNAL;                                      00835000
                                                                        00840000
PROCEDURE  QMPY;  OPTION EXTERNAL;                                      00845000
                                                                        00850000
PROCEDURE  QDIV;  OPTION EXTERNAL;                                      00855000
                                                                        00860000
PROCEDURE  QNEG;  OPTION EXTERNAL;                                      00865000
                                                                        00870000
PROCEDURE  QCMP;  OPTION EXTERNAL;                                      00875000
                                                                        00880000
PROCEDURE  QASL;  OPTION EXTERNAL;                                      00885000
                                                                        00890000
PROCEDURE  QASR;  OPTION EXTERNAL;                                      00895000
                                                                        00900000
PROCEDURE  DIMPY; OPTION EXTERNAL;                                      00905000
                                                                        00910000
PROCEDURE  DIDIV; OPTION EXTERNAL;                                      00915000
                                                                        00920000
PROCEDURE  HELP; OPTION EXTERNAL;                                       00925000
                                                                        00930000
PROCEDURE  DMUL; OPTION EXTERNAL;                                       00935000
                                                                        00940000
PROCEDURE  CVAD; OPTION EXTERNAL;                                       00945000
                                                                        00950000
PROCEDURE  CVDA; OPTION EXTERNAL;                                       00955000
                                                                        00960000
PROCEDURE  CVBD; OPTION EXTERNAL;                                       00965000
                                                                        00970000
PROCEDURE  CVDB; OPTION EXTERNAL;                                       00975000
                                                                        00980000
PROCEDURE  SLD; OPTION EXTERNAL;                                        00985000
                                                                        00990000
PROCEDURE  NSLD; OPTION EXTERNAL;                                       00995000
                                                                        01000000
PROCEDURE  SRD; OPTION EXTERNAL;                                        01005000
                                                                        01010000
PROCEDURE  CMPD; OPTION EXTERNAL;                                       01015000
                                                                        01020000
PROCEDURE  ADDD; OPTION EXTERNAL;                                       01025000
                                                                        01030000
PROCEDURE  SUBD; OPTION EXTERNAL;                                       01035000
                                                                        01040000
PROCEDURE MPYDSIM; OPTION EXTERNAL;                                     01045000
                                                                        01050000
procedure STUNSIM; option external;                            <<01744>>01055000
                                                               <<01744>>01060000
                                                                        01065000
PROCEDURE TICK; OPTION EXTERNAL;                                        01070000
                                                                        01075000
DOUBLE PROCEDURE  TESTSTOP(S,P,PINX);                          <<07302>>01080000
   VALUE S,P,PINX;                                                      01085000
   DOUBLE S;                                                   <<06655>>01090000
   INTEGER P,PINX;                                             <<06655>>01095000
   OPTION EXTERNAL;                                                     01100000
                                                                        01105000
PROCEDURE  DEBUG; OPTION EXTERNAL;                                      01110000
                                                                        01115000
PROCEDURE  SUDDENDEATH(A);                                              01120000
   VALUE  A;                                                            01125000
   INTEGER  A;                                                          01130000
   OPTION  EXTERNAL;                                                    01135000
                                                               <<k7614>>01140000
PROCEDURE SOFT'DEATH(A);                                       <<k7614>>01145000
   VALUE A;                                                    <<k7614>>01150000
   INTEGER A;                                                  <<k7614>>01155000
   OPTION EXTERNAL;                                            <<k7614>>01160000
                                                                        01165000
PROCEDURE MASTERCLEARHPIB(DITP);                               <<01301>>01170000
VALUE DITP;                                                             01175000
POINTER DITP;                                                           01180000
OPTION EXTERNAL;                                                        01185000
                                                                        01190000
PROCEDURE BCONVERT(WORD);                                               01195000
VALUE WORD;                                                             01200000
INTEGER WORD;                                                           01205000
OPTION EXTERNAL;                                                        01210000
                                                                        01215000
PROCEDURE DCONVERT(WORD);                                               01220000
VALUE WORD;                                                             01225000
INTEGER WORD;                                                           01230000
OPTION EXTERNAL;                                                        01235000
                                                                        01240000
PROCEDURE MPXCONTROL(OP,DITP);                                          01245000
VALUE OP,DITP;                                                          01250000
INTEGER OP;                                                             01255000
POINTER DITP;                                                           01260000
OPTION EXTERNAL;                                                        01265000
                                                                        01270000
PROCEDURE WRITE2(WORD);                                                 01275000
VALUE WORD;                                                             01280000
INTEGER WORD;                                                           01285000
OPTION EXTERNAL;                                                        01290000
                                                                        01295000
PROCEDURE AWAKEIO(DITP,FLAGS);                                          01300000
VALUE DITP,FLAGS;                                                       01305000
POINTER DITP;                                                           01310000
INTEGER FLAGS;                                                          01315000
OPTION EXTERNAL;                                                        01320000
                                                                        01325000
PROCEDURE CHECKLDEV(DEV);                                               01330000
VALUE DEV;                                                              01335000
INTEGER DEV;                                                            01340000
OPTION EXTERNAL;                                                        01345000
                                                                        01350000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QN);                                01355000
VALUE LINKINDEX,QN;                                                     01360000
INTEGER LINKINDEX,QN;                                                   01365000
OPTION EXTERNAL;                                                        01370000
                                                                        01375000
PROCEDURE IOFAILURE(DRTN,DITP);                                         01380000
VALUE DRTN,DITP;                                                        01385000
INTEGER DRTN;                                                           01390000
INTEGER POINTER DITP;                                                   01395000
OPTION EXTERNAL;                                                        01400000
                                                                        01405000
                                                                        01410000
INTEGER PROCEDURE GET'DSDEVICE (LDEV);                         <<01775>>01415000
VALUE LDEV;                                                    <<01775>>01420000
INTEGER LDEV;                                                  <<01775>>01425000
OPTION EXTERNAL;                                               <<01775>>01430000
                                                                        01435000
INTEGER PROCEDURE CSTCONV (LABEL',PINX);                       <<06095>>01440000
   VALUE LABEL',PINX;                                          <<06095>>01445000
   INTEGER LABEL',PINX;                                        <<06095>>01450000
   OPTION EXTERNAL;                                            <<06095>>01455000
                                                               <<06095>>01460000
PROCEDURE RECEIVEMSG (PORT,LEN,FLAG);                          <<06095>>01465000
   VALUE PORT,LEN,FLAG;                                        <<06095>>01470000
   INTEGER PORT,LEN;                                           <<06095>>01475000
   LOGICAL FLAG;                                               <<06095>>01480000
   OPTION EXTERNAL;                                            <<06095>>01485000
                                                               <<06095>>01490000
DOUBLE PROCEDURE MAPPEDCSTTOPHYCST(MPCST,PINX);                <<06655>>01495000
   VALUE MPCST,PINX;                                           <<06095>>01500000
   INTEGER MPCST,PINX;                                         <<06095>>01505000
   OPTION EXTERNAL;                                            <<06095>>01510000
$PAGE " "                                                      <<06655>>01515000
LOGICAL PROCEDURE TESTCRUNCH(CALLER);                                   01520000
   VALUE CALLER;                                                        01525000
   INTEGER CALLER;                                                      01530000
   OPTION PRIVILEGED,UNCALLABLE;                                        01535000
   BEGIN                                                                01540000
   LOGICAL POINTER  CST = 1;                                            01545000
   LOGICAL LS0=S-0;                                                     01550000
   EQUATE TRPLBL=%100001,CLEARSTT=%100377,GETSTT=%77400;                01555000
   EQUATE SERIES33 = 8;                                        <<02021>>01560000
   INTEGER  S0 = S-0;                                                   01565000
   INTEGER ARRAY  ARRQ(*) = Q+0;                                        01570000
   EQUATE BADREF = 8;                                                   01575000
   TOS := X;  <<SAVE INSTRUCTION ON WHICH TRAP OCCURRED>>               01580000
                                                                        01585000
   TOS := ARRQ(-ARRQ-1); <<GET STATUS OF TRAPPED PROCEDURE>>            01590000
   IF < THEN BEGIN <<PRIVILEGED MODE WHEN TRAPPED>>                     01595000
                                                                        01600000
COMMENT THE FOLLOWING CODE IS INCLUDED TO AVERT SD#10 IN                01605000
        THE CASE THAT TWO INTERNAL INTERRUPTS ARE GENERATED             01610000
        BY A SINGLE VIOLATION, E.G., BNDS VIOL IS FOLLOWED              01615000
        BY ILL ADR IN PARTIAL MEMORY SYSTEM.  THE FOLLOWING             01620000
        CODE WILL SET TESTCRUNCH TRUE AND RETURN, IGNORING              01625000
        THE ILL ADR;                                                    01630000
   IF S0=TRPLBL THEN                                                    01635000
     BEGIN                                                              01640000
     TOS := ARRQ(X:=X-3);<<IS THIS EXT TRAP LBL? CHECK:>>               01645000
     IF (LS0 LAND CLEARSTT)=TRPLBL THEN                                 01650000
       BEGIN <<CHECK IF DELTA P IS ENTRY FOR STT IN LBL>>               01655000
       TOS := TOS.(1:7); <<STT>>                                        01660000
       TOS := CST(7);  <<ABSOLUTE LOC OF ININ>>                         01665000
       ASMB(XCH,SUB);                                                   01670000
       TOS := CST(4).(4:12)&LSL(2); <<LEN OF ININ>>                     01675000
       TOS := TOS+TOS-1;   <<TOS:=@ OF STT ENTRY FROM BLKLBL>> <<02087>>01680000
       TOS := CST(6);      <<TOS:=BANK OF ININ>>               <<02087>>01685000
       ASMB(XCH;LSEA);     <<TOS:=STT ENTRY OF BLKLBL>>        <<02087>>01690000
       ASMB(DELB,DELB);    <<PITCH DOBLE ADDR OF STT ENTRY>>   <<02087>>01695000
       TOS := TOS.(2:14);  <<TOS:=DELTAP OF TRAPPED PROC>>     <<02087>>01700000
       TOS := ARRQ(-ARRQ-2); <<DELTA P AT TRAP TIME>>                   01705000
       IF TOS=TOS THEN                                                  01710000
         BEGIN <<DOUBLE INTERNAL INTERRUPT! IGNORE!>>                   01715000
         TESTCRUNCH := TRUE;                                            01720000
         RETURN;                                                        01725000
         END;                                                           01730000
       END                                                     <<01923>>01735000
       ELSE DEL;                                               <<01923>>01740000
     END;                                                               01745000
   TOS := TOS LAND %377;                                                01750000
   IF MAPPINGFIRMWARE THEN                                     <<06095>>01755000
      BEGIN                                                    <<06095>>01760000
         TOS:=ARRQ(-ARRQ-2);                                   <<06095>>01765000
         IF TOS.(1:1) = 0 THEN                                 <<06095>>01770000
            TOS := 0                                           <<06095>>01775000
         ELSE TOS := 1;                                        <<06095>>01780000
      END                                                      <<06095>>01785000
   ELSE                                                        <<06095>>01790000
   IF S0<%300 AND CST(S0&LSL(2)+1).SYSTEMFLAG                  <<MPEIV>>01795000
      THEN TOS:=1                                              <<06095>>01800000
   ELSE                                                        <<06095>>01805000
      TOS:=0;                                                  <<06095>>01810000
                                                               <<06829>>01815000
IF TOS = 1 THEN                                                <<06829>>01820000
     BEGIN << IN PRIVILEGED SYSTEM CODE >>                              01825000
   << THE CODE ADDED HERE IN THE SERIES 3 VERSION IS NOT  >>   <<01923>>01830000
   << NECESSARY FOR THE SERIES 33 VERSION (DUE TO MICRO-  >>   <<01923>>01835000
   << CODE). THIS ALREADY CHECKS TO SEE IF THE BOUNDS VIO >>   <<01923>>01840000
   << THAT OCCURRED WAS CAUSED BY AN EXIT TO A DESTROYED  >>   <<01923>>01845000
   << USER STACK MARKER.  IF SO, ABORT PROCESS ELSE SF10  >>   <<01923>>01850000
   << THE CODE MUST BE ADDED FOR THE SERIES 44 AND 55>>        <<02021>>01855000
       ASSEMBLE(PCN);     <<CPU NUMBER>>                       <<02021>>01860000
       IF TOS = SERIES33 THEN                                  <<02021>>01865000
         BEGIN                                                 <<02021>>01870000
            X := ARRQ(-2) + %111; <<PMAP REL LOC OF CALLER>>   <<02021>>01875000
            SUDDENDEATH(CALLER+BADREF);                        <<02021>>01880000
         END                                                   <<02021>>01885000
        ELSE            <<ICF'44 AND ICF'55>>                  <<02021>>01890000
         BEGIN                                                 <<02021>>01895000
            DEL;                                               <<02021>>01900000
            IF (TOS LAND %177400)<> %31400 <<NOT EXIT INST>>   <<02021>>01905000
             OR CALLER<>2 THEN      <<NOT BOUNDS VIO>>         <<02021>>01910000
              BEGIN                                            <<02021>>01915000
DIE:           X:=ARRQ(-2)+%111;  <<PMAP REL LOC OF CALLER>>   <<02021>>01920000
               SUDDENDEATH(CALLER+BADREF);        <<DIE>>      <<02021>>01925000
              END ELSE                                         <<02021>>01930000
               BEGIN                                           <<02021>>01935000
                TOS:=ARRQ((-ARRQ(-ARRQ)-ARRQ)-1);              <<02021>>01940000
                <<STATUS MARKER BEFORE TRAP PROCEDURE>>        <<02021>>01945000
                IF (TOS LAND %377)<%300 THEN GO DIE;           <<02021>>01950000
              <<NOT A TRAP ON EXIT TO A BAD USER SEGMENT>>     <<02021>>01955000
               END                                             <<02021>>01960000
         END                                                   <<02021>>01965000
      END;                                                     <<02021>>01970000
   END <<PRIVILEGED MODE WHEN TRAPPED>>;                                01975000
   STATUS.(1:1) := 1;   << INTERRUPTS ON ON EXIT >>                     01980000
   END;                                                                 01985000
                                                                        01990000
$PAGE                                                          <<*7755>>01995000
PROCEDURE BOUNDSVIOLATION;                                     <<*7755>>02000000
BEGIN                                                          <<*7755>>02005000
                                                               <<*7755>>02010000
DEFINE                                                         <<*7755>>02015000
   EXIT'INSTRUCTION = (LOGICAL(INSTR) LAND %177400) = %31400#, <<*7755>>02020000
   P'LOC            = STACK(-DELTAQ - 2)#,                     <<*7755>>02025000
   STATUS'LOC       = STACK(-DELTAQ - 1)#;                     <<*7755>>02030000
                                                               <<*7755>>02035000
ARRAY STACK(*) = Q+0;                                          <<*7755>>02040000
                                                               <<*7755>>02045000
INTEGER                                                        <<*7755>>02050000
   INSTR,           << Instruction causing trap             >> <<*7755>>02055000
   PLABEL,          <<                                      >> <<*7755>>02060000
   DESCSTINX;       << DST-relative offset to PLABEL        >> <<*7755>>02065000
                                                               <<*7755>>02070000
LOGICAL                                                        <<*7755>>02075000
   MCY;             << Mode of control-y trap procedure     >> <<*7755>>02080000
                                                               <<*7755>>02085000
LOGICAL                                                        <<*7755>>02090000
   EXIT'NUMBER = Q+1;                                          <<*7755>>02095000
                                                               <<*7755>>02100000
LOGICAL SUBROUTINE MODEOK;                                     <<*7755>>02105000
BEGIN                                                          <<*7755>>02110000
                                                               <<*7755>>02115000
<< Checks mode of trap procedure and trapped segment. Priv  >> <<*7755>>02120000
<< trapped segment can't trap into user mode trap procedure.>> <<*7755>>02125000
                                                               <<*7755>>02130000
MODEOK := FALSE;                                               <<*7755>>02135000
IF PCB(CURPRC + PIINFOWORDNUM).PSIMFIELD = 5 THEN              <<*7755>>02140000
   BEGIN                                                       <<*7755>>02145000
   PUSH(Q,DL);                                                 <<*7755>>02150000
   ASMB(XCH,SUB);                                              <<*7755>>02155000
   TOS := TOS - STACK(S0 - 2);     << Ptr to PXFIXED        >> <<*7755>>02160000
   MCY := STACK(TOS+6).(3:1);      << Control-y trap mode   >> <<*7755>>02165000
   IF NOT (MCY LAND LOGICAL(STATUS'LOC.(0:1))) THEN            <<*7755>>02170000
      BEGIN                                                    <<*7755>>02175000
      MODEOK := TRUE;                                          <<*7755>>02180000
      END;                                                     <<*7755>>02185000
   END;                                                        <<*7755>>02190000
                                                               <<*7755>>02195000
IF PCB(CURPRC + RESABORTINFOWORDNUM).DELAYSOFTFLAG = 1 THEN    <<*7755>>02200000
   BEGIN                                                       <<*7755>>02205000
   ASMB(ADDS 4);                                               <<*7755>>02210000
   RECEIVEMSG(USERMSGPORT,4,SAVEMSG);                          <<*7755>>02215000
   IF NOT LOGICAL(S0.(0:1)) LAND LOGICAL(STATUS'LOC.(0:1)) THEN<<*7755>>02220000
      BEGIN                                                    <<*7755>>02225000
      ASMB(SUBS 4);                                            <<*8778>>02230000
      MODEOK := TRUE;                                          <<*7755>>02235000
      END                                                      <<*8778>>02240000
   ELSE                                                        <<*8778>>02245000
      BEGIN                                                    <<*8778>>02250000
      ASMB(SUBS 4);                                            <<*8778>>02255000
      MODEOK := FALSE;                                         <<*8778>>02260000
      END;                                                     <<*8778>>02265000
   END;                                                        <<*7755>>02270000
END;       << Subroutine MODEOK >>                             <<*7755>>02275000
                                                               <<*7755>>02280000
                                                               <<*7755>>02285000
INSTR := X;                                                    <<*7755>>02290000
IF NOT TESTCRUNCH(2) THEN                                      <<*7755>>02295000
   BEGIN                                                       <<*7755>>02300000
   IF EXIT'INSTRUCTION AND P'LOC.(0:1) THEN                    <<*7755>>02305000
      BEGIN                                                    <<*7755>>02310000
                                                               <<*7755>>02315000
      << Bounds violation as a result of the trace bit set  >> <<*7755>>02320000
      << for a delayed control-y or soft interrupt on an    >> <<*7755>>02325000
      << internal EXIT. Note that for external EXITs we go  >> <<*7755>>02330000
      << directly to TRACE.                                 >> <<*7755>>02335000
                                                               <<*7755>>02340000
      P'LOC.(0:1) := 0;                << Clear trace bit   >> <<*7755>>02345000
      PLABEL := 0;                                             <<*7755>>02350000
      PLABEL.(0:1) := P'LOC.(1:1);     << Set map flag      >> <<*7755>>02355000
      PLABEL.(8:8) := STATUS'LOC.(8:8);                        <<*7755>>02360000
      DESCSTINX := CSTCONV(PLABEL,0);                          <<*7755>>02365000
                                                               <<*7755>>02370000
      IF (PCB(CURPRC + PIINFOWORDNUM).PSIMFIELD = 5 OR         <<*7755>>02375000
          PCB(CURPRC + RESABORTINFOWORDNUM).DELAYSOFTFLAG = 1) <<*7755>>02380000
         AND MODEOK THEN                                       <<*7854>>02385000
         BEGIN                                                 <<*7755>>02390000
                                                               <<*7755>>02395000
          X := INSTR.(8:8);                                    <<*7755>>02400000
                                                               <<*7755>>02405000
         << Cut back marker layed down by micro code when    >><<*7755>>02410000
         << the bounds violation occurred.                   >><<*7755>>02415000
                                                               <<*7755>>02420000
         PUSH(Q);                                              <<*7755>>02425000
         TOS := TOS - DELTAQ;                                  <<*7755>>02430000
         SET(Q);                                               <<*7755>>02435000
         EXIT'NUMBER := X;                                     <<*7755>>02440000
         DELAYEDINT;                                           <<*7755>>02445000
                                                               <<*7755>>02450000
         << Now need to do the EXIT that was originally tried>><<*7755>>02455000
         << when the bounds violation was detected. Exit     >><<*7755>>02460000
         << number was left at Q+1, which is now TOS to this >><<*7755>>02465000
         << marker.                                          >><<*7755>>02470000
                                                               <<*7755>>02475000
         TOS := EXIT'NUMBER LOR %031400;                       <<*7755>>02480000
         ASMB(XEQ 0);                                          <<*7755>>02485000
         END;                                                  <<*7755>>02490000
      END;                                                     <<*7755>>02495000
   END;                                                        <<*7755>>02500000
                                                               <<*7755>>02505000
X := INSTR;                                                    <<*7755>>02510000
ABORT( [8/1,8/0],24,0 );                                       <<*7755>>02515000
END;        << Procedure BoundsViolation >>                    <<*7755>>02520000
                                                                        02525000
PROCEDURE  ILLEGALADDRESS;                                              02530000
   OPTION PRIVILEGED,UNCALLABLE;                                        02535000
   BEGIN                                                                02540000
   IF NOT TESTCRUNCH(1) THEN                                            02545000
   ABORT([8/1,8/0],23,0); << WITH INSTR IN XREG >>             <<03040>>02550000
   END;                                                                 02555000
                                                               <<04793>>02560000
PROCEDURE  NONRESPONDINGMODULE;                                <<04793>>02565000
   OPTION PRIVILEGED,UNCALLABLE;                               <<04793>>02570000
    << THIS PROCEDURE PRODUCES THE CORRECT SYSTEM FAILURE >>   <<04793>>02575000
    << FOR A NON-RESPONDING MODULE INTERRUPT.  PREVIOUSLY >>   <<04793>>02580000
    << THIS INTERRUPT WAS HANDLED AS A GHOST INTERRUPT    >>   <<04793>>02585000
                                                               <<04793>>02590000
   BEGIN                                                       <<04793>>02595000
   IF X=%20302 THEN     <<IO OPERATION>>                       <<04793>>02600000
     BEGIN                                                     <<04793>>02605000
     STATUS.CC := CCL;                                         <<04793>>02610000
     RETURN;                                                   <<04793>>02615000
     END;                                                      <<04793>>02620000
   IF NOT TESTCRUNCH(0) THEN                                   <<04793>>02625000
   ABORT([8/1,8/0],25,0);                                      <<04793>>02630000
   END;                                                        <<04793>>02635000
                                                                        02640000
PROCEDURE DATAPARITY;                                          <<02302>>02645000
   OPTION PRIVILEGED,UNCALLABLE;                               <<02302>>02650000
                                                               <<02302>>02655000
   COMMENT: Dataparity will attempt to locate which memory     <<02302>>02660000
   location caused the data parity interrupt.  It does this    <<02302>>02665000
   by referencing all locations in memory until another data   <<02302>>02670000
   parity interrupt is detected.  The location which was last  <<02302>>02675000
   referenced is displayed and the system is halted, SF 13.    <<02302>>02680000
   If the bad location is not located, the machine is halted   <<02302>>02685000
   without a location displayed;                               <<02302>>02690000
                                                               <<02302>>02695000
   BEGIN                                                       <<02302>>02700000
   EQUATE  SYSDB = %1000,                                      <<02302>>02705000
           CRLF = %6412;   <<Carriage return, linefeed>>       <<02302>>02710000
   DEFINE  PARITYERRFLAG = ABSOLUTE (SYSDB + %61)#,            <<02302>>02715000
           SYSLASTBANK   = ABSOLUTE (SYSDB + %361)#,           <<02302>>02720000
           SYSLASTADDR   = ABSOLUTE (SYSDB + %362)#;           <<02302>>02725000
   ARRAY   PARMSG (0:6) = PB := CRLF, "PARITY ERROR";          <<02302>>02730000
   ARRAY   BMSG (0:2)   = PB := CRLF, "B = ";                  <<02302>>02735000
   ARRAY   AMSG (0:2)   = PB := CRLF, "A = ";                  <<02302>>02740000
   LOGICAL B       = S-1,  <<B stack cell: Bank # for LSEA>>   <<02302>>02745000
           A       = S,    <<A stack cell: Offset for LSEA>>   <<02302>>02750000
           ERRBANK = Q-6,  <<B stack cell after second DP>>    <<02302>>02755000
           ERRADDR = Q-5,  <<A stack cell after second DP>>    <<02302>>02760000
           LASTBANK,       <<Largest bank # configured>>       <<02302>>02765000
           LASTADDR;       <<Largest addr for current bank>>   <<02302>>02770000
                                                               <<02302>>02775000
   IF NOT PARITYERRFLAG THEN                                   <<02302>>02780000
         <<First DP interrupt: initialize and make another>>   <<02302>>02785000
         BEGIN                                                 <<02302>>02790000
         TOS := SYSDB D;          <<Set sysdb, pitch old DB>>  <<02302>>02795000
         ASSEMBLE (XCHD;DDEL);                                 <<02302>>02800000
         FOR X := 0 UNTIL 6 DO WRITE2(PARMSG(X));              <<02302>>02805000
         PARITYERRFLAG := TRUE;                                <<02302>>02810000
         LASTBANK := SYSLASTBANK;                              <<02302>>02815000
         LASTADDR := %177777;     <<Assume all but L.B. full>> <<02302>>02820000
                                                               <<02302>>02825000
         <<Reference all of memory to recreate the error>>     <<02302>>02830000
         TOS := 0D;               <<A:=B:=0>>                  <<02302>>02835000
         WHILE B <= LASTBANK DO                                <<02302>>02840000
            BEGIN                                              <<02302>>02845000
            WHILE A < LASTADDR DO                              <<02302>>02850000
               BEGIN                                           <<02302>>02855000
               ASSEMBLE (LSEA;DEL);                            <<02302>>02860000
               ASSEMBLE (INCA);                                <<02302>>02865000
               END;                                            <<02302>>02870000
            ASSEMBLE (LSEA;DEL);  <<for last word in bank>>    <<02302>>02875000
            ASSEMBLE (INCA,INCB);                              <<02302>>02880000
            IF B = LASTBANK THEN LASTADDR := SYSLASTADDR;      <<02302>>02885000
            END;                                               <<02302>>02890000
         END  <<First parity error>>                           <<02302>>02895000
      ELSE                                                     <<02302>>02900000
         <<Second dataparity: print where we found it>>        <<02302>>02905000
         BEGIN                                                 <<02302>>02910000
         FOR X := 0 UNTIL 2 DO WRITE2(BMSG(X));                <<02302>>02915000
         DCONVERT (ERRBANK);                                   <<02302>>02920000
         FOR X := 0 UNTIL 2 DO WRITE2(AMSG(X));                <<02302>>02925000
         BCONVERT (ERRADDR);                                   <<02302>>02930000
         END;  <<second parity error>>                         <<02302>>02935000
   SUDDENDEATH(13);                                            <<02302>>02940000
   END;  <<Dataparity>>                                        <<02302>>02945000
                                                                        02950000
PROCEDURE GHOST4;                                              <<04793>>02955000
   OPTION PRIVILEGED,UNCALLABLE;                                        02960000
  BEGIN                                                                 02965000
    ENTRY GHOST5,GHOST7,                                       <<*8289>>02970000
          GHOST22,GHOST23,GHOST26,GHOST27,GHOST28,GHOST29,              02975000
          GHOST30,GHOST36;                                              02980000
   IF X=%20302 THEN                                                     02985000
     BEGIN << I/O OPERATION >>                                          02990000
     STATUS.CC := CCL;                                                  02995000
     RETURN;                                                            03000000
     END;                                                               03005000
    TOS := 4;                                                  <<04793>>03010000
  MAINGHOST:                                                            03015000
   SUDDENDEATH(15);                                                     03020000
  GHOST5:                                                               03025000
    TOS := 5;                                                           03030000
    GOTO MAINGHOST;                                                     03035000
  GHOST7:                                                               03040000
    TOS := 7;                                                           03045000
    GOTO MAINGHOST;                                                     03050000
  GHOST22:                                                              03055000
    TOS := 22;                                                          03060000
    GOTO MAINGHOST;                                                     03065000
  GHOST23:                                                              03070000
    TOS := 23;                                                          03075000
    GOTO MAINGHOST;                                                     03080000
  GHOST26:                                                              03085000
    TOS := 26;                                                          03090000
    GOTO MAINGHOST;                                                     03095000
  GHOST27:                                                              03100000
    TOS := 27;                                                          03105000
    GOTO MAINGHOST;                                                     03110000
  GHOST28:                                                              03115000
    TOS := 28;                                                          03120000
    GOTO MAINGHOST;                                                     03125000
  GHOST29:                                                              03130000
    TOS := 29;                                                          03135000
    GOTO MAINGHOST;                                                     03140000
  GHOST30:                                                              03145000
    TOS := 30;                                                          03150000
    GOTO MAINGHOST;                                                     03155000
  GHOST36:                                                              03160000
    TOS := 36;                                                          03165000
    GOTO MAINGHOST;                                                     03170000
  END;                                                                  03175000
                                                                        03180000
PROCEDURE EXTGHOST;                                                     03185000
OPTION PRIVILEGED,UNCALLABLE,INTERRUPT;                        <<03664>>03190000
BEGIN                                                                   03195000
INTEGER DRTN = Q+3;         << LOCATION OF DRT NUMBER >>       <<03664>>03200000
                                                               <<03664>>03205000
EQUATE UNKNOWN'INT'MSG = 410,   << MSG CATALOG MSG # >>        <<03664>>03210000
       OPCONSOLE       = 0;     << SYSTEM CONS CODE FOR GENMSG <<03664>>03215000
                                                               <<03664>>03220000
   DISABLE; << ISSUE A CLEAR INTERFACE >>                               03225000
   IOMESSAGE(1,UNKNOWN'INT'MSG,%10000,DRTN,,,,,OPCONSOLE);     <<03664>>03230000
END;                                                                    03235000
                                                                        03240000
                                                               <<03094>>03245000
                                                               <<03094>>03250000
                                                               <<03094>>03255000
                                                               <<03094>>03260000
PROCEDURE TEMPWARNINGS;                                        <<03094>>03265000
OPTION PRIVILEGED,UNCALLABLE;                                  <<03094>>03270000
                                                               <<03094>>03275000
COMMENT                                                        <<03094>>03280000
         THIS PROCEDURE IS FOR THE ICF'64 TEMPERATURE          <<03094>>03285000
         CONDITIONS.  THE FOLLOWING PARAMETERS ARE DROPPED     <<03094>>03290000
         BY MICROCODE TO INDICATE WHICH TYPE OF CONDITION TO   <<03094>>03295000
         PRINT OUT ON THE CONSOLE:                             <<03094>>03300000
                                                               <<03094>>03305000
             Q+1 =    0      "LOW OVERTEMP CONDITION"          <<03094>>03310000
                      1      "HIGH OVERTEMP CONDITION"         <<03094>>03315000
                      2      "OVERTEMP CONDITION-POWER DOWN    <<03094>>03320000
                                IN PROGRESS"                   <<03094>>03325000
                      3      "TEMPERATURE NORMAL CONDITION".   <<03094>>03330000
                      4      "PDM NOT RESPONDING"              <<04954>>03335000
                      5      "POWER SYSTEM WARNING"            <<04954>>03340000
                      6      "BANNER CLEARED"                  <<04954>>03345000
                                                               <<03094>>03350000
         AFTER THE MESSAGE IS SENT TO THE CONSOLE, WE WILL     <<03094>>03355000
         JUST RETURN.  EVEN THOUGH THIS IS AN INTERNAL INT.,   <<03094>>03360000
         IF A 2ND OVERTEMP INTERRUPTS WHILE DOING THIS ONE,    <<04184>>03365000
         IT WILL BE HELD OFF IF WE HAVE INTERRUPTS DISABLED.   <<03094>>03370000
         ALL OTHER INTERRUPTS WILL BE HELD OFF, TOO.           <<03094>>03375000
         IF IT IS A FATAL OVERTEMP, MICROCODE WILL TRAP TO     <<04184>>03380000
         POWERFAIL AFTER THIS MESSAGE IS SENT OUT.             <<03094>>03385000
;                                                              <<03094>>03390000
                                                               <<03094>>03395000
                                                               <<03094>>03400000
                                                               <<03094>>03405000
BEGIN                                                          <<03094>>03410000
                                                               <<03094>>03415000
    <<DON'T ADD A VARIABLE AT Q+1-CONDITION MUST BE HERE>>     <<03094>>03420000
LOGICAL CONDITION   = Q+1;   <<TYPE OF TEMP. COND. >>          <<03094>>03425000
                           <<DROPPED BY MICROCODE- Q+1>>       <<03094>>03430000
                                                               <<03094>>03435000
INTEGER MESSAGE     = Q+2;                                     <<03094>>03440000
                                                               <<03094>>03445000
EQUATE LOWOVERTEMP  = 140,   <<NOS. FOR MESSAGES PRINTED OUT>> <<03094>>03450000
       HIGHOVERTEMP = 141,                                     <<03094>>03455000
       FATALOVERTEMP= 142,                                     <<03094>>03460000
       NORMALTEMP   = 143,                                     <<03094>>03465000
       NOPDMRESP    = 411,                                     <<04954>>03470000
       POWRWARNG    = 412,                                     <<04954>>03475000
       BANNERCLR    = 413,                                     <<04954>>03480000
       CONSOLE      = 0,       <<CONSOLE NUM FOR IOMESSAGE>>   <<03094>>03485000
       SYSDB        = %1000,                                   <<03094>>03490000
       ICF'37       = 5,       <<CPU NUMBER FOR ICF'37>>       <<*8289>>03495000
       ICF'55       = 4;       <<CPU NUMBER FOR ICF'55>>       <<03094>>03500000
                                                               <<03094>>03505000
DISABLE;                                                       <<03094>>03510000
TRAPSOFF;                                                      <<03094>>03515000
ASMB(TOFF);                                                    <<03094>>03520000
                                                               <<03094>>03525000
ASMB (ADDS 1);   <<MAKE ROOM FOR LOCAL VARIABLES>>             <<03094>>03530000
ASMB (PCN);       <<DECIDE WHICH CPU WE HAVE>>                 <<03094>>03535000
IF S0 <> ICF'55 AND TOS <> ICF'37 THEN                         <<*8289>>03540000
  BEGIN                                                        <<*8289>>03545000
  SUDDENDEATH(15);     <<WE SHOULD NOT BE HERE IF THIS>>       <<*8289>>03550000
  DEL;                 <<IS NOT A ICF'55 OR ICF'37. IT>>       <<*8289>>03555000
  END                  <<IS THEREFORE A GHOST INTERRUPT>>      <<*8289>>03560000
   ELSE BEGIN                                                  <<03094>>03565000
        << FIND OUT WHICH MESSAGE TO PRINT OUT - (Q+1) >>      <<03094>>03570000
        MESSAGE := IF CONDITION=0 THEN LOWOVERTEMP             <<03094>>03575000
              ELSE IF CONDITION=1 THEN HIGHOVERTEMP            <<03094>>03580000
              ELSE IF CONDITION=2 THEN FATALOVERTEMP           <<03094>>03585000
              ELSE IF CONDITION=3 THEN NORMALTEMP              <<03094>>03590000
              ELSE IF CONDITION=4 THEN NOPDMRESP               <<04954>>03595000
              ELSE IF CONDITION=5 THEN POWRWARNG               <<04954>>03600000
              ELSE IF CONDITION=6 THEN BANNERCLR               <<04954>>03605000
              ELSE 0;                                          <<03094>>03610000
                                                               <<03094>>03615000
        IF MESSAGE = 0 THEN SUDDENDEATH(15);                   <<03094>>03620000
          <<WE SHOULD NOT BE HERE IF CONDITION IS NOT SET.>>   <<03094>>03625000
          <<SO THIS MUST BE A GHOST INTERRUPT.  >>             <<03094>>03630000
                                                               <<03094>>03635000
        TOS := SYSDB D;                                        <<03094>>03640000
        ASMB (XCHD);                                           <<03094>>03645000
        IOMESSAGE(1,MESSAGE,,,,,,,CONSOLE);                    <<03094>>03650000
        ASMB (XCHD; DDEL; TON)                                 <<03094>>03655000
        END                                                    <<03094>>03660000
                                                               <<03094>>03665000
END;                                                           <<03094>>03670000
                                                               <<03094>>03675000
PROCEDURE  POWERFAIL;                                                   03680000
   OPTION PRIVILEGED,UNCALLABLE;                                        03685000
BEGIN                                                                   03690000
                                                                        03695000
EQUATE                                                                  03700000
   DILTP       = 5,        << DIT INDEX TO ILT POINTER >>               03705000
   CSTB        = 0,        <<CST BASE>>                        <<01372>>03710000
   SERIES'33   = 8,        << SERIES'33 PCN NUMBER >>          <<01415>>03715000
   ICF'44      = 3,                                            <<03008>>03720000
   DEVRESET    = %100000,  << DEVICE MASTERCLEAR CONTROL >>             03725000
   TEMPLR      = %22,      << TEMP STORAGE FOR LIMIT REG >>    <<01183>>03730000
   POWERFAIL   = %72,      << SYSDB INDEX >>                            03735000
   SYSDB       = %1000;                                                 03740000
                                                                        03745000
INTEGER                                                                 03750000
   ABSQI       = Q+7,                                                   03755000
   I           = Q+6,                                                   03760000
   LR          = Q+5,                                                   03765000
   MAXDRT      = DB+%71,                                                03770000
   PARAM       = Q+3,   <<DIFFERENCE BETWEEN CR AND LR>>                03775000
   PF          = DB+POWERFAIL,                                          03780000
   S           = S-2,                                                   03785000
   SYSUP       = DB+%73;                                                03790000
                                                                        03795000
INTEGER S0     = S-0;                                          <<03008>>03800000
                                                               <<03008>>03805000
INTEGER POINTER                                                         03810000
   PS0         = S-0;                                                   03815000
                                                                        03820000
                                                                        03825000
   TOS := 0D;                                                           03830000
   TOS := SYSDB;                                                        03835000
   ASMB(XCHD);                                                          03840000
   PF := 1; << SET SYSDB AND PF COUNT >>                                03845000
   SYSUP := 0;                                                          03850000
   TOS := ABS(QI);                                                      03855000
                                                               <<01372>>03860000
   <<SAVE CST(2) ON TOS -- THIS CST WILL BE REBUILT    >>      <<01372>>03865000
   <<TO LOOK LIKE A SEGMENT PRESENT IN NON-EXISTENT    >>      <<01372>>03870000
   <<PHYSICAL MEMORY.  POWERFAIL WILL PCAL THIS SEG    >>      <<01372>>03875000
   <<AS ITS LAST ACTION.  THIS PREVENTS ACCESS TO      >>      <<01372>>03880000
   <<MEMORY WHEN THE MEMORY CONTROLLER IS MASTERCLEARED>>      <<01372>>03885000
   <<BY MICROCODE, THUS AVOIDING A HARDWARE PROBLEM    >>      <<01372>>03890000
   <<WHICH CAUSES MEMORY TO BE DESTROYED.              >>      <<01372>>03895000
                                                               <<01372>>03900000
   X:=ABS(CSTB)+8;          <<ADDR OF CST(2)>>                 <<01372>>03905000
   TOS:=ABS(X);             <<WORD 0>>                         <<01372>>03910000
   TOS:=ABS(X:=X+1);        <<WORD 1>>                         <<01372>>03915000
   TOS:=ABS(X:=X+1);        <<WORD 2>>                         <<01372>>03920000
   TOS:=ABS(X:=X+1);        <<WORD 3>>                         <<01372>>03925000
                                                               <<01372>>03930000
   <<BUILD NEW CST(2)>>                                        <<01372>>03935000
                                                               <<01372>>03940000
   ABS(X):=0;               <<ADDR>>                           <<01372>>03945000
   ABS(X:=X-1):=15;         <<BANK>>                           <<01372>>03950000
   ABS(X:=X-1):=1;          <<REFCOUNT>>                       <<01372>>03955000
   ABS(X:=X-1):=%40040;     <<LENGTH>>                         <<01372>>03960000
                                                               <<01372>>03965000
   TOS := ABS(ABSQI-6); << SAVE QI-6 >>                                 03970000
   TOS := ABS(X:=X+9);  << QI + 3 >>                                    03975000
   TOS := ABS(X:=X+1);  << AND QI + 4 >>                                03980000
   PUSH(S,Q,DL);                                                        03985000
   TOS := S - ABSQI + SYSDB; << COMPUTE ADDS VALUE FOR RESTART >>       03990000
   ABS(X) := TOS;                                                       03995000
   ASMB(RCCR);         << GET CURRENT TIME >>                  <<01183>>04000000
   TOS := ABS(TEMPLR);                                         <<01183>>04005000
   ASMB(LSUB);         << TIME SINCE LAST INTERRUPT >>         <<01183>>04010000
   LR := TOS;                                                  <<01183>>04015000
                                                                        04020000
   << POWER FAIL FIRMWARE DOES IO CLEAR (IOCL) >>                       04025000
   << 30/33 MUST BE EXECUTING IN NON-EXISTENT MEMORY AT >>     <<01415>>04030000
   << TIME OF ACTUAL POWER LOSS - ALL OTHER MACHINES    >>     <<01415>>04035000
   << MAY JUST HALT.  IF 30/33, PCAL CST(2) WHICH WAS   >>     <<01415>>04040000
   << BUILT ABOVE AND EXECUTE IN NON-EXISTENT MEMORY    >>     <<01415>>04045000
                                                               <<01415>>04050000
   ASSEMBLE (PCN);           <<GET CPU NUMBER>>                <<01415>>04055000
   IF S0 = SERIES'33 THEN                                      <<03008>>04060000
      BEGIN    <<THIS IS A 33 - PCAL HYPERSPACE>>              <<01415>>04065000
      DEL;                                                     <<03008>>04070000
      TOS := %100002;  <<SEG #2, STT#0 - ADDRESS OF HYPRSPCE>> <<01415>>04075000
      ASSEMBLE (PCAL 0);  << "ENERGIZE, SCOTTY" >>             <<01415>>04080000
      END                                                      <<01415>>04085000
   ELSE IF TOS = ICF'44                                        <<03008>>04090000
           THEN ASSEMBLE(HALT 7)                               <<03008>>04095000
           ELSE ASMB(CON %20104; CON %5);    <<FLUSH FOR '55>> <<03008>>04100000
END;                                                                    04105000
                                                               <<04184>>04110000
                                                               <<04184>>04115000
PROCEDURE DCULOGGING;                                          <<04184>>04120000
OPTION PRIVILEGED,UNCALLABLE;                                  <<04184>>04125000
                                                               <<04184>>04130000
COMMENT                                                        <<04184>>04135000
       THIS PROCEDURE IS FOR THE SERIES'64 DCU LOGGING.        <<04184>>04140000
       DCU LOGGING IS INTERRUPT DRIVEN, WRITTEN TO A           <<04184>>04145000
       TEMPORARY MEMORY BUFFER AND LATER ON TO DISC.           <<04184>>04150000
       DCU'REQUEST WILL HANDLE THE WRITING OF THE              <<04184>>04155000
       INFORMATION.  MICROCODE WILL TRAP TO HERE FIRST         <<04184>>04160000
       AND WE WILL PRINT A MESSAGE TO THE CONSOLE SAYING       <<04184>>04165000
       THAT DCU LOGGING IS TAKING PLACE OR IS DONE. THEN       <<04184>>04170000
       WE WILL CALL THE PROCEDURE DCU'REQUEST.                 <<04184>>04175000
       THE PARMS GIVEN TO US AT Q+1:(BIT 15)  ARE:             <<04184>>04180000
                                                               <<04184>>04185000
           0 : DCU LOGGING IN PROGRESS                         <<04184>>04190000
           1 : DCU LOGGING COMPLETE                            <<04184>>04195000
                                                               <<04184>>04200000
       ALL INTERRUPTS WILL BE HELD OFF IF WE HAVE DISABLED     <<04184>>04205000
       INTERRUPTS.                                             <<04184>>04210000
;                                                              <<04184>>04215000
                                                               <<04184>>04220000
                                                               <<04184>>04225000
BEGIN                                                          <<04184>>04230000
                                                               <<04184>>04235000
    <<DON'T ADD A VARIABLE AT Q+1-DCUMSGSTATE MUST BE HERE>>   <<04184>>04240000
LOGICAL DCUMSGSTATE  = Q+1;  <<DROPPED BY MICROCODE>>          <<04184>>04245000
                                                               <<04184>>04250000
INTEGER DCUMESSAGE   = Q+2;   <<TYPE OF MESSAGE FOR CONSOLE>>  <<04184>>04255000
                                                               <<04184>>04260000
EQUATE MSGSTART      = 144,                                    <<04184>>04265000
       MSGDONE       = 145,                                    <<04184>>04270000
       CONSOLE       = 0,   <<CONSOLE NUM FOR IOMESSAGE>>      <<04184>>04275000
       SYSDB         = %1000,                                  <<04184>>04280000
       ICF'55        = 4;    <<CPU NUMBER FOR SERIES'64>>      <<04184>>04285000
                                                               <<04184>>04290000
DISABLE;                                                       <<04184>>04295000
TRAPSOFF;                                                      <<04184>>04300000
                                                               <<04184>>04305000
ASMB(ADDS 1);   <<MAKE ROOM FOR LOCAL VARIABLE>>               <<04184>>04310000
ASMB(PCN);                                                     <<04184>>04315000
IF TOS <> ICF'55                                               <<04184>>04320000
   THEN SUDDENDEATH(15)  <<WE SHOULD NOT BE HERE IF THIS>>     <<04184>>04325000
                         <<IS NOT A SERIES'64. SO THIS MUST>>  <<04184>>04330000
                         <<BE A GHOST INTERRUPT.        >>     <<04184>>04335000
   ELSE BEGIN                                                  <<04184>>04340000
        <<FIND WHICH TYPE OF INTERRUPT IT IS AND MSG NUM.>>    <<04184>>04345000
        IF DCUMSGSTATE THEN DCUMESSAGE := MSGDONE              <<04184>>04350000
                       ELSE DCUMESSAGE := MSGSTART;            <<04184>>04355000
                                                               <<04184>>04360000
        TOS := SYSDB D;                                        <<04184>>04365000
        ASMB(XCHD);                                            <<04184>>04370000
        IOMESSAGE(1,DCUMESSAGE,,,,,,,CONSOLE);                 <<04184>>04375000
        DCU'REQUEST(DCUMSGSTATE);                              <<04184>>04380000
        ASMB(XCHD; DDEL)                                       <<04184>>04385000
        END                                                    <<04184>>04390000
                                                               <<04184>>04395000
END;                                                           <<04184>>04400000
                                                               <<04184>>04405000
                                                               <<04184>>04410000
                                                                        04415000
  PROCEDURE SYSTEMCLOCK;                                                04420000
    OPTION PRIVILEGED,UNCALLABLE;                                       04425000
    BEGIN                                                               04430000
    ARRAY SPACE(0:2)=Q; <<PROTECT DB AND PARAMETER>>                    04435000
    INTEGER TSLINT=Q+3; << TIME SINCE LAST INTERRUPT INTERVAL >>        04440000
  EQUATE TRLDSTINDEX=TRLDST*4+2;                               <<06827>>04445000
    DISABLE;                                                            04450000
  TOS := DST(TRLDSTINDEX);                                     <<06827>>04455000
  TOS := DST(X:=X+1);                                          <<06827>>04460000
    ASMB(XCHD);  <<SET DB TO TIMER REQUEST LIST>>                       04465000
    TOS := TSLINT; << TICK EXPECTS THIS AT Q-4 >>                       04470000
    TICK;                                                               04475000
    ASMB(DEL;XCHD;IXIT);                                                04480000
    END;                                                                04485000
                                                                        04490000
  PROCEDURE BREAKPOINT;                                                 04495000
    OPTION PRIVILEGED,UNCALLABLE;                                       04500000
    BEGIN                                                               04505000
    ASMB(CBKP);                                                         04510000
    END;                                                                04515000
                                                                        04520000
PROCEDURE  UNIMPLEMENTEDINSTRUCTION;                                    04525000
   OPTION PRIVILEGED,UNCALLABLE;                                        04530000
   BEGIN                                                                04535000
   INTEGER USERX = Q-3,                                        <<1040>> 04540000
           S2    = S-2;                                        <<1040>> 04545000
   INTEGER ARRAY NEXTQ(*) = Q+2;                               <<1040>> 04550000
   INTEGER INSTR     = NEXTQ,                                  <<1040>> 04555000
           TRAP'LOC  = INSTR+1;                                <<1040>> 04560000
                                                               <<02011>>04565000
   DEFINE  PLOC      = P.(2:14) #;                             <<02011>>04570000
                                                               <<02011>>04575000
   LOGICAL SUBROUTINE DBLWORD'INSTR;                           <<1040>> 04580000
   BEGIN                                                       <<1040>> 04585000
      COMMENT *** WARNING: THIS SUB. MUST NOT CHANGE           <<1040>> 04590000
              *** THE X REGISTER;                              <<1040>> 04595000
      TOS := X;                                                <<1040>> 04600000
      << ASSIGN RETURN VALUE TO DBLWORD'INST >>                <<1040>> 04605000
      S2 := IF INSTR = %20477 THEN TRUE ELSE FALSE;            <<1040>> 04610000
      X := TOS; << RESTORE X >>                                <<1040>> 04615000
   END;                                                        <<1040>> 04620000
                                                               <<1040>> 04625000
   TOS := X; << SAVE INSTR >>                                  <<1040>> 04630000
                                                               <<04750>>04635000
   IF DBLWORD'INSTR THEN                                       <<1040>> 04640000
      BEGIN                                                    <<1040>> 04645000
      COMMENT:                                                 <<1040>> 04650000
         INSTR CONTAINS WORD 1 OF THE INSTRUCTION.             <<1040>> 04655000
         FOR A TWO WORD INSTRUCTION WITH AN INVALID            <<1040>> 04660000
         2ND WORD THE 'P' REGISTER CONTAINS P+2.               <<1040>> 04665000
         HOWEVER, IF THERE IS NO MICROCODE TO SUPPORT          <<1040>> 04670000
         THE INSTRUCTION, THE TRAP OCCURED ON THE              <<1040>> 04675000
         1ST WORD AND THE 'P' REG. CONTAINS P+1.;              <<1040>> 04680000
      << LOAD INSTRUCTION AT P-1 >>                            <<1040>> 04685000
      TOS:=0;  <<SPACE FOR TRAP'LOC>>                          <<04750>>04690000
      TOS := 0; << RETURN VALUE FOR CONVSEGID >>               <<01659>>04695000
      TOS := STATUS.(8:8);                                     <<06095>>04700000
      TOS.(0:1) := P.(1:1);                                    <<06095>>04705000
      TOS := CSTCONV (*,0);                                    <<06095>>04710000
      TOS:=DST(X:=TOS+2);                                      <<MPEIV>>04715000
      TOS:=DST(X:=X+1)+(P-1);                                  <<MPEIV>>04720000
      LMEM;                                                    <<1040>> 04725000
      ENABLE;                                                  <<1040>> 04730000
      INSTR := TOS; << WORD THAT CAUSED TRAP >>                <<1040>> 04735000
      DDEL;  << DELETE EXTENDED ADDRESS >>                     <<1040>> 04740000
      TRAP'LOC := PLOC-1; <<SAVE LOC OF WORD THAT TRAPPED>>    <<02011>>04745000
      COMMENT:                                                 <<1040>> 04750000
         IF WORD AT P-1 IS A DOUBLE WORD INSTRUCTION           <<1040>> 04755000
         THEN ASSUME NO MICROCODE FOR 2 WORD INSTR             <<1040>> 04760000
         ELSE ACTUAL 2 WORD INSTR WITH TRAP ON 2ND             <<1040>> 04765000
         WORD. P GETS BEGINNING OF 2 WORD INSTR.;              <<1040>> 04770000
      IF DBLWORD'INSTR THEN PLOC := PLOC-1                     <<02011>>04775000
      ELSE PLOC := PLOC-2;                                     <<02011>>04780000
      GOTO L;                                                  <<1040>> 04785000
      END;                                                     <<1040>> 04790000
   ENABLE;                                                     <<1040>> 04795000
   IF %20400 <= X <= %20415 THEN                                        04800000
      BEGIN                                                             04805000
      X := X.(12:4);                                                    04810000
      ASMB( BR P+1,X );                                                 04815000
      EADD;                                                             04820000
      ESUB;                                                             04825000
      EMPY;                                                             04830000
      EDIV;                                                             04835000
      ENEG;                                                             04840000
      ECMP;                                                             04845000
      ASSEMBLE(BR P+8);                                                 04850000
      ASSEMBLE(BR P+7);                                                 04855000
      QADD;                                                             04860000
      QSUB;                                                             04865000
      QMPY;                                                             04870000
      QDIV;                                                             04875000
      QNEG;                                                             04880000
      QCMP;                                                             04885000
      END;                                                              04890000
   IF X.(0:10) = %157 OR X.(0:10) = %117 THEN                           04895000
      BEGIN <<QUAD SHIFT>>                                              04900000
      TOS := TOS.(10:6) + USERX;                                        04905000
      IF LOGICAL(X.(4:1)) THEN QASR                                     04910000
      ELSE QASL;                                                        04915000
      END;                                                              04920000
   IF %20570 <= X <= %20571                                             04925000
   OR %20560 <= X <= %20561                                             04930000
   THEN                                                                 04935000
      IF TOS THEN DIDIV                                                 04940000
      ELSE DIMPY;                                                       04945000
   TOS := %177617;                                                      04950000
   ASMB( AND,XAX );                                                     04955000
   IF  %20601 <= X <= %20614  THEN                                      04960000
      BEGIN                                                             04965000
      DELB;   << CUT OFF PARAMETER >>                                   04970000
      X := X.(12:4);                                                    04975000
      ASMB( BR P+0,X );                                                 04980000
      DMUL;                                                             04985000
      CVAD;                                                             04990000
      CVDA;                                                             04995000
      CVBD;                                                             05000000
      CVDB;                                                             05005000
      SLD;                                                              05010000
      NSLD;                                                             05015000
      SRD;                                                              05020000
      ADDD;                                                             05025000
      CMPD;                                                             05030000
      SUBD;                                                             05035000
      MPYDSIM;                                                          05040000
      END;                                                              05045000
   PLOC := PLOC-1;                                             <<02011>>05050000
    TOS:=PLOC;  <<TRAP'LOC>>                                   <<04750>>05055000
   << AT THIS POINT P POINTS TO 1ST WORD OF INSTR >>           <<03040>>05060000
   << THAT CAUSED TRAP, TRAP'LOC POINTS TO THE    >>           <<03040>>05065000
   << WORD OF THE INSTRUCTION THAT WAS BAD        >>           <<03040>>05070000
L: IF INSTR = %36000  THEN                                     <<1040>> 05075000
      BEGIN  << POSSIBLELY A BREAKPOINT >>                              05080000
      TOS := 0D;  << Return value for TESTSTOP >>              <<07302>>05085000
      TOS := 0D;  << Return value for MAPPEDCSTTOPHYCST >>     <<06655>>05090000
      TOS := STATUS.(8:8);                                     <<06095>>05095000
      TOS.(0:1) := P.(1:1);                                    <<06095>>05100000
      TOS := MAPPEDCSTTOPHYCST(*,0);                           <<06095>>05105000
      TESTSTOP(*,TRAP'LOC,CURPRC);                             <<06642>>05110000
      IF  >  THEN  RETURN;                                              05115000
      IF  =  THEN                                              <<1040>> 05120000
          BEGIN                                                <<1040>> 05125000
          << FLAG BREAK ON 2ND OF 2 WORD INSTR >>              <<1040>> 05130000
          IF TRAP'LOC <> PLOC THEN X := TRUE                   <<02011>>05135000
          ELSE X := FALSE;                                     <<1040>> 05140000
          DEBUG;                                               <<1040>> 05145000
          END;                                                 <<1040>> 05150000
      END;                                                              05155000
   << SET UP CALL TO ABORT >>                                  <<03040>>05160000
   X := INSTR;                                                 <<03040>>05165000
   PLOC := TRAP'LOC+1;      << ONE PAST ILLEGAL WORD >>        <<03040>>05170000
   ABORT([8/1,8/0],7,0); << WITH INSTR IN XREG >>              <<03040>>05175000
   END;                                                                 05180000
$PAGE                                                          <<06655>>05185000
PROCEDURE  STTVIOLATION;                                                05190000
   OPTION PRIVILEGED,UNCALLABLE;                                        05195000
   BEGIN                                                                05200000
   ENABLE;                                                              05205000
   ABORT([8/1,8/0],31,0); << WITH INSTR IN XREG >>             <<03040>>05210000
   END;                                                                 05215000
                                                                        05220000
PROCEDURE  CSTVIOLATION;                                                05225000
   OPTION PRIVILEGED,UNCALLABLE;                                        05230000
   BEGIN                                                                05235000
   ENABLE;                                                              05240000
   ABORT([8/1,8/0],30,0); << WITH INSTR IN XREG >>             <<03040>>05245000
   END;                                                                 05250000
                                                                        05255000
PROCEDURE  DSTVIOLATION;                                                05260000
   OPTION PRIVILEGED,UNCALLABLE;                                        05265000
   << DB-BANK MAY BE INVALID >>                                         05270000
   SUDDENDEATH(16);                                                     05275000
$PAGE                                                          <<06655>>05280000
PROCEDURE STACKOVERFLOW;                                       <<MPEIV>>05285000
OPTION PRIVILEGED,UNCALLABLE;                                  <<MPEIV>>05290000
                                                               <<MPEIV>>05295000
COMMENT                                                        <<MPEIV>>05300000
                                                               <<MPEIV>>05305000
STACKOVERFLOW IS THE INTERRUPT HANDLER FOR INTERNAL TRAPS      <<MPEIV>>05310000
CAUSED BY AN INSTRUCTION ATTEMPTING TO PUSH S BEYOND Z.WHEN    <<MPEIV>>05315000
SUCH A CONDITION IS DETECTED BY MICROCODE, CONTROL BRANCES     <<MPEIV>>05320000
TO THIS PROCEDURE ON THE ICS WITH INTERRUPTS DISABLED.         <<MPEIV>>05325000
                                                               <<MPEIV>>05330000
THE SYSTEM MUST CRASH IF THE OVERFLOWING STACK IS FROZEN,      <<MPEIV>>05335000
LOCKED OR CORE RESIDENT, SINCE THERE'S NO WAY TO EXTEND        <<MPEIV>>05340000
THESE.  OTHERWISE, A MESSAGE IS SENT TO THE DISPATCHER TO      <<MPEIV>>05345000
WRITE THE STACK, RELEASE ITS SPACE, AND FLAG THE PROCESS       <<MPEIV>>05350000
AS REQUIRING SCHEDULING ATTENTION. (The SLL memory request     <<06655>>05355000
pointer of the overflowing process is set to -1, indicating    <<06655>>05360000
to the scheduler that the process' stack must be made present  <<06655>>05365000
before the process can be launched). THE STACK'S NEW SIZE      <<06655>>05370000
(OLDSIZE + STOVRINC) IS PLACED IN THE STACK'S XST ENTRY, AND   <<MPEIV>>05375000
THE STACK'S ST ENTRY IS FLAGGED AS REQUIRING A MODIFICATION.   <<MPEIV>>05380000
                                                               <<MPEIV>>05385000
IF THE CODE CAUSING THE STACKOVERFLOW HAD DISABLED EXTERNAL    <<MPEIV>>05390000
INTERRUPTS OR PDISABLED SWITCHING, IT MUST BE ALLOWED TO CON-  <<MPEIV>>05395000
TINUE UNTIL IT COMPLETES THE ACTION FOR WHICH IT HAD SET       <<MPEIV>>05400000
THE INTERNAL LOCK.  THAT'S THE REASON STACKS ARE ALLOCATED     <<MPEIV>>05405000
AN OVERFLOW AREA BEYOND Z.  IF THE CODE HAD DISABLED INTERRUPTS<<MPEIV>>05410000
THE INTERRUPT REQUEST FLIP FLOP OF THE CLOCK IS SET,           <<MPEIV>>05415000
AND WHEN THE CODE ENABLES INTERRUPTS THE CLOCK INTERRUPT       <<MPEIV>>05420000
HANDLER WILL BE ENTERED AND WILL DO A DISP.  IF THE CODE       <<MPEIV>>05425000
WAS PDISABLED WHEN IT CAUSED THE STACKOVERFLOW, THE DISP AT    <<MPEIV>>05430000
THE END OF THIS PROCEDURE WILL CAUSE CONTROL TO SWITCH         <<MPEIV>>05435000
TO THE DISPATCHER AS SOON AS THE PROCESS UNTANGLES ITSELF.     <<MPEIV>>05440000
                                                               <<MPEIV>>05445000
;                                                              <<MPEIV>>05450000
   BEGIN                                                                05455000
                                                               <<06655>>05460000
   DEFINE                                                      <<06655>>05465000
     OBJIDENT = DOUBLE(STACKDST)#;  << For SENDMSG,GENSPECREQ>><<06655>>05470000
                                                               <<06655>>05475000
EQUATE                                                         <<*8591>>05480000
   ICS'STACKBANK   =  5,                                       <<*8591>>05485000
   ICS'DELTAS      =  6,                                       <<*8591>>05490000
   ICS'DELTAZ      =  8,                                       <<*8591>>05495000
   ICS'STACKBASE   =  9,                                       <<*8591>>05500000
   ICS'STACKDST    = 16,                                       <<*8591>>05505000
   ICS'PDISABLEDCNT= 18;                                       <<*8591>>05510000
                                                               <<*8591>>05515000
   INTEGER ARRAY  PCBX(*) = Q+0;                                        05520000
   INTEGER  S0 = S-0,                                                   05525000
            USERS0 = Q-4,    <<TOP OF STACK AT OVERFLOW TIME>> <<00693>>05530000
            DELTAS = Q - ICS'DELTAS,                           <<*8591>>05535000
            DELTAZ = Q - ICS'DELTAZ,                           <<*8591>>05540000
            STACKBANK = Q-ICS'STACKBANK,                       <<*8591>>05545000
            STACKBASE = Q-ICS'STACKBASE;                       <<*8591>>05550000
   DOUBLE  STDB = Q-5;                                                  05555000
   EQUATE  IXIT = %20360,                                               05560000
           ADDS = %35000,                                               05565000
           SUBS = %35400,                                      <<01415>>05570000
           SETR = %027400,                                     <<01967>>05575000
           EXIT = %31400,                                               05580000
           PSHR = %024400,                                     <<01967>>05585000
                                                               <<01415>>05590000
           SERIES'33 = 8,   <<PCN NUMBERS FOR THE VARIOUS>>    <<01415>>05595000
           ICF'44    = 3,   <<CPU THAT USE THIS CODE     >>    <<01415>>05600000
          ICF'37    = 5,                                       <<*8289>>05605000
           ICF'55    = 4;                                      <<01415>>05610000
                                                               <<01415>>05615000
   DEFINE  DELTAZ' = F(F(QI)-ICS'DELTAZ)#;                     <<*8591>>05620000
EQUATE STACKOVRINC=512,                                        <<01706>>05625000
       EXTRAINC=1152;                                          <<MPEIV>>05630000
EQUATE LOCVARCNT=14;                                           <<01966>>05635000
LOGICAL LS0=S-0;                                               <<MPEIV>>05640000
INTEGER INSTRUCTION=Q+1,                                       <<MPEIV>>05645000
        OLDSIZE=Q+2,                                           <<MPEIV>>05650000
        NEWSIZE=Q+3,                                           <<MPEIV>>05655000
        PAGESREQUIRED=Q+4,                                     <<MPEIV>>05660000
        WORDSREQUIRED=Q+5,                                     <<MPEIV>>05665000
        OLDDELTAZ=Q+6,                                         <<MPEIV>>05670000
        STACKDST=Q+7,                                          <<MPEIV>>05675000
        SBRELDB=Q+8,                                           <<MPEIV>>05680000
        MAXSTACKSIZE=Q+9,                                      <<MPEIV>>05685000
        INCREMENT=Q+10,                                        <<MPEIV>>05690000
        DBRELTOSTKBASE=Q+11;                                   <<MPEIV>>05695000
                                                               <<06210>>05700000
                                                               <<06210>>05705000
INTEGER PAGESALLOC=Q+12;                                       <<01706>>05710000
INTEGER PCBPT=Q+13;                                            <<01966>>05715000
                                                                        05720000
                                                               <<*8591>>05725000
<< The following variables are only used for the portion of >> <<*8591>>05730000
<< StackOverFlow that runs on the ICS.                      >> <<*8591>>05735000
<< Local variable is at Q+3 since Q+1 has the double word   >> <<*8591>>05740000
<< value of DB pushed. This is needed for the IXIT.         >> <<*8591>>05745000
                                                               <<*8591>>05750000
DOUBLE                                                         <<*8591>>05755000
   LAST'STACK'ADDR = Q+3,                                      <<*8591>>05760000
   DSM1            = S-1;                                      <<*8591>>05765000
                                                               <<*8591>>05770000
   << THIS PORTION RUNS ON THE ICS >>                                   05775000
                                                               <<*8591>>05780000
   ASMB(ADDS 4);     << Room for LAST'STACK'ADDR >>            <<*8591>>05785000
   TOS := X;         << Save instruction >>                    <<*8591>>05790000
   TOS := STACKBANK;                                           <<*8591>>05795000
   TOS := STACKBASE;                                           <<*8591>>05800000
   TOS := TOS + RBtoRSdisp;                                    <<*8591>>05805000
   ASMB(LSEA);       << Region size for the stack >>           <<*8591>>05810000
   TOS := (TOS & LSL(PAGEPOWER)) - TRAILERLENGTH;              <<*8591>>05815000
   ASMB(XCH);        << Tos is now offset to RS in header >>   <<*8591>>05820000
   TOS := TOS + RStoRASdisp;  << Point to top of reg. header >><<*8591>>05825000
   ASMB(ADD);                                                  <<*8591>>05830000
   LAST'STACK'ADDR := TOS;       << Last valid stack address >><<*8591>>05835000
                                                               <<*8591>>05840000
   IF LPCB(CURPRC + STKINFOWORDNUM).STOVRALLFLAG THEN          <<*8591>>05845000
      SUDDENDEATH(640);                                        <<*8591>>05850000
                                                               <<*8591>>05855000
   X := TOS;      << Instruction >>                            <<*8591>>05860000
                                                               <<*8591>>05865000
   IF  X = IXIT  THEN  DELTAS := DELTAS-4;                              05870000
   TOS := STDB;                                                         05875000
   TOS := TOS+DELTAS-1;          << USER Q+1 >>                         05880000
   TOS := X;                     << BUILD A MARKER TO GET OFF ICS >>    05885000
   TOS := @STOV'USER;                                                   05890000
   IF MAPPINGFIRMWARE THEN ASMB( TSBC 1 ); << SET PHYSICAL >>  <<06095>>05895000
   ASMB( SDEA );                                                        05900000
   TOS := TOS+2;                                                        05905000
                                                               <<*8620>>05910000
   << Check for bank wrap around or falling out of region >>   <<*8620>>05915000
                                                               <<*8620>>05920000
   IF CARRY OR DSM1 >= LAST'STACK'ADDR THEN                    <<*8620>>05925000
      SUDDENDEATH(646);                                        <<*8591>>05930000
                                                               <<*8591>>05935000
   PUSH( STATUS );                                                      05940000
   TOS := 4;                                                            05945000
   ASMB( SDEA );                                                        05950000
   TOS := TOS+2;                                                        05955000
                                                               <<*8620>>05960000
   << Check for bank wrap around or falling out of region >>   <<*8620>>05965000
                                                               <<*8620>>05970000
   IF CARRY OR DSM1 >= LAST'STACK'ADDR THEN                    <<*8620>>05975000
      SUDDENDEATH(646);                                        <<*8591>>05980000
                                                               <<*8591>>05985000
   PUSH( DB );                                                          05990000
   ASMB( SDEA );                                                        05995000
   DELTAS := DELTAS+4;                                                  06000000
   DELTAZ := DELTAZ + 120;                                              06005000
                                                               <<*8591>>06010000
   ASMB(SUBS 4);     << Put S back where it was on entry >>    <<*8591>>06015000
   ASMB( PSDB; IXIT );                                                  06020000
                                                                        06025000
STOV'USER:  << THE MARKER ABOVE EXITS TO HERE >>                        06030000
   TOS:=X;  <<SAVE CIR FOR CALL TO STACKOVERFLOW>>             <<00693>>06035000
                                                               <<01415>>06040000
   <<ADJUST DELTA P TO POINT TO INSTRUCTION WITH SK OVRFLW>>   <<01415>>06045000
                                                               <<01415>>06050000
   ASSEMBLE (PCN);              <<GET CPU NUMBER>>             <<01415>>06055000
   ASSEMBLE (DUP,DUP);      <<CPU NUMBER AGAIN>>               <<*8289>>06060000
   IF TOS = ICF'37 THEN DDEL ELSE                              <<*8289>>06065000
   IF TOS <> ICF'44 THEN                                       <<01967>>06070000
      BEGIN          <<FOR SERIES 33 AND SERIES 55>>           <<01967>>06075000
        X := LOGICAL (X) LAND %177400;  <<GET THE OPCODE ONLY>><<01967>>06080000
                                                               <<01967>>06085000
        IF TOS = ICF'55 THEN                                   <<01967>>06090000
           BEGIN             <<SERIES 55>>                     <<01967>>06095000
             IF X = ADDS OR X = SUBS OR     <<ADJUST P TO >>   <<01967>>06100000
                X = SETR OR X=EXIT OR       <<RETRY>>          <<01967>>06105000
                X = PSHR THEN               <<INSTRUCTION>>    <<01967>>06110000
                      P := P - 1;                              <<01967>>06115000
             IF INSTRUCTION = %020477     <<DOUBLE WORD>>      <<01967>>06120000
                THEN P := P - 2;        <<COBOL INSTRUCTION>>  <<01967>>06125000
           END                                                 <<01967>>06130000
          ELSE                                                 <<01967>>06135000
                                                               <<01967>>06140000
           BEGIN            <<SERIES 33>>                      <<01967>>06145000
             <<CODE FOR THE SERIES 33 ADJUSTMENT>>             <<01967>>06150000
 << MOST INSTRUCTIONS DO NOT HAVE TO BE RETRIED BECAUSE THE >> <<01967>>06155000
 << CHECK FOR THE INTERRUPT FLAG FOR STCKOVERFLOW IS MADE   >> <<01967>>06160000
 << AFTER THE INSTRUCTION IS EXECUTED.  THE EXCEPTIONS ARE  >> <<01967>>06165000
 << CHECKED FOR BELOW. (MICROCODE IS DOING THE CHECKING)    >> <<01967>>06170000
             IF X = ADDS OR X = SUBS OR                        <<01967>>06175000
                 X = SETR OR X = EXIT                          <<01967>>06180000
                  THEN P := P - 1;                             <<01967>>06185000
           END                                                 <<01967>>06190000
      END                                                      <<01967>>06195000
                                                               <<01967>>06200000
   ELSE                                                        <<01415>>06205000
      BEGIN                     <<JAGUAR ICF/44 ADJUSTMENT>>   <<01415>>06210000
      <<SERIES II/III TESTS FOR APL TOO>>                      <<01415>>06215000
      DEL;              <<DELETE EXTRA CPU NUMBER>>            <<01967>>06220000
      IF X <> IXIT THEN                                        <<01415>>06225000
         BEGIN                                                 <<01415>>06230000
         P := P - 1;                                           <<01415>>06235000
         X := LOGICAL(X) LAND %170077;    <<CLEAR LEFT SK OP>> <<01415>>06240000
         IF 1 <= X <= 63 THEN                                  <<01415>>06245000
            BEGIN  <<IT IS A STACK INST. WITH RIGHT SK OP>>    <<01415>>06250000
            TOS := STATUS;  <<IS LEFT SK OP ACTIVE?>>          <<01415>>06255000
            ASSEMBLE (TCBC 3);                                 <<01415>>06260000
            IF <> THEN P := P + 1;                             <<01415>>06265000
            STATUS := TOS;                                     <<01415>>06270000
            END;                                               <<01415>>06275000
         END;                                                  <<01415>>06280000
      IF INSTRUCTION = %020477     <<DOUBLE WORD>>             <<01967>>06285000
          THEN P := P - 1;      <<COBOL INSTRUCTIONS>>         <<01967>>06290000
      END;       <<OF DELTA P ADJUSTMENT>>                     <<01415>>06295000
                                                               <<01415>>06300000
ASMB(ADDS LOCVARCNT);                                          <<01564>>06305000
<<INSTRUCTION ALREADY AT Q+1>>                                 <<01564>>06310000
TRAPSOFF;                                                      <<01858>>06315000
IF GCLASSENABLEDMASK.CLASS0 THEN                               <<01564>>06320000
   BEGIN  <<MEASURE STK OVRFLOW EVENT>>                        <<01564>>06325000
   TOS:=MEASSTATXDSBANK;                                       <<01564>>06330000
   TOS:=MEASSTATXDSBASE;                                       <<01564>>06335000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPSTKOVERFLOW;                <<01564>>06340000
   ASMB(LSEA);                                                 <<01564>>06345000
   TOS:=TOS+1;                                                 <<01564>>06350000
   ASMB(SSEA;DDEL);                                            <<01564>>06355000
   END;                                                        <<01564>>06360000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01809>>06365000
   BEGIN <<PROCESS LEVEL STACKOVERFLOW>>                       <<01809>>06370000
   TOS:=MEASPROCXDSBANK;                                       <<01809>>06375000
   TOS:=MEASPROCXDSBASE;                                       <<01809>>06380000
   TOS := TOS + (CURPRC)/PCBSIZE*                              <<06642>>06385000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPAND;                     <<01809>>06390000
   ASMB(LSEA);                                                 <<01809>>06395000
   TOS:=TOS+1;                                                 <<01809>>06400000
   ASMB(SSEA;DDEL);                                            <<01809>>06405000
   END;                                                        <<01809>>06410000
DISABLE;                                                       <<01564>>06415000
PCBPT := CURPRC;                                               <<06642>>06420000
ABSOLUTE(SYSWAITTODISPMSG).MEMTRAPFLAG:=1;                     <<01564>>06425000
X:=STACKDST:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKDST);          <<01564>>06430000
TOS := MMSTATSPECREQ;                                          <<*7949>>06435000
TOS := OBJIDENT;                                               <<*7949>>06440000
MMSTAT'(*,*,*,STACK'OVERFLOW,ICS(-ICS'DELTAZ),0,0);            <<*7949>>06445000
OLDSIZE:=DST(X:=STACKDST&LSL(2)).DATASIZEFIELD&LSL(2);         <<01564>>06450000
TOS:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKBANK);                 <<01564>>06455000
TOS:=ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'STACKBASE);                 <<01564>>06460000
TOS:=TOS+RBTORSDISP;                                           <<01706>>06465000
ASMB(LSEA);                                                    <<01706>>06470000
PAGESALLOC:=TOS;                                               <<01706>>06475000
TOS:=TOS+RSTORBDISP;                                           <<01706>>06480000
TOS:=TOS+SBTORELDB;                                            <<01564>>06485000
ASMB(LSEA);                                                    <<01564>>06490000
DBRELTOSTKBASE:=TOS;                                           <<01564>>06495000
TOS:=TOS-SBTORELDB;                                            <<01564>>06500000
TOS:=TOS+STBTOMAXDATA; <<21 DECIMAL>>                          <<01564>>06505000
ASMB(LSEA);<<MAX FOR PCBXTOZ>>                                 <<01564>>06510000
MAXSTACKSIZE:=TOS;                                             <<01564>>06515000
TOS:=TOS+MAXDATATORELZ; <<9>>                                  <<01564>>06520000
ASMB(LSEA);                                                    <<01564>>06525000
OLDDELTAZ:=S0;                                                 <<01564>>06530000
TOS:=TOS+120;                                                  <<01564>>06535000
ASMB(SSEA); <<IN CASE BLOCK IN GETDATASEGCHANGESTATE>>         <<01564>>06540000
IF OLDDELTAZ >= MAXSTACKSIZE-DBRELTOSTKBASE THEN               <<01706>>06545000
   BEGIN <<STACK HAS GROWN BEYOND ALLOWABLE SIZE>>             <<01564>>06550000
   PROCSTATE.STOVFLAG := 1;                                    <<06642>>06555000
   IF <> THEN SUDDENDEATH(641);                                <<01687>>06560000
   INCREMENT:=EXTRAINC;                                        <<01564>>06565000
   TOS:=TOS-MAXDATATORELZ;                                     <<01564>>06570000
   TOS:=MAXSTACKSIZE+EXTRAINC;                                 <<01564>>06575000
   ASMB(SSEA);                                                 <<01564>>06580000
   TOS:=TOS+MAXDATATORELZ;                                     <<01564>>06585000
   END                                                         <<01564>>06590000
ELSE                                                           <<01564>>06595000
   BEGIN  <<STACK OK, CHECK FOR ADDS 0 INSTR >>                <<01564>>06600000
      IF INSTRUCTION <> %35000 THEN INCREMENT := STACKOVRINC   <<01564>>06605000
      ELSE INCREMENT := STACKOVRINC + USERS0;                  <<01564>>06610000
   IF LOGICAL(OLDDELTAZ+INCREMENT) >                           <<01564>>06615000
      LOGICAL(MAXSTACKSIZE-DBRELTOSTKBASE)  THEN               <<01564>>06620000
      INCREMENT := (MAXSTACKSIZE-DBRELTOSTKBASE) - OLDDELTAZ;  <<01564>>06625000
   INCREMENT:=LOGICAL(INCREMENT+3) LAND -4;                    <<01706>>06630000
   END;                                                        <<01564>>06635000
PAGESREQUIRED:=(OLDSIZE+INCREMENT+OVERHEAD-1)                  <<01564>>06640000
                   &LSR(PAGEPOWER)+1;                          <<01564>>06645000
WORDSREQUIRED:=PAGESREQUIRED&LSL(PAGEPOWER);                   <<01564>>06650000
<<NEWSIZE:=WORDSREQUIRED-(OVERHEAD+128) CAUSES VDS OVRFLOW>>   <<01564>>06655000
NEWSIZE:=OLDSIZE+INCREMENT;                                    <<01564>>06660000
TOS:=TOS+RELZTORBDISP+RBTORASDISP;                             <<01564>>06665000
ASMB(LSEA);                                                    <<01564>>06670000
IF TOS.REGIOFZFLAG=1 THEN                                      <<01564>>06675000
   BEGIN                                                       <<01564>>06680000
   IF STATUS.(1:1) = 0 THEN SUDDENDEATH(642);                  <<01687>>06685000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) > 1 THEN         <<02090>>06690000
   COMMENT:  The purpose of the following code is to cover up  <<k7614>>06695000
             a pdisable problem in which an interrupt handler  <<k7614>>06700000
             appears to execute a pdisable without a           <<k7614>>06705000
             corresponding penable.  This strange problem      <<k7614>>06710000
             always appears to leave the pdisable count at 1.  <<k7614>>06715000
             If this condition is met, we shall execute a      <<k7614>>06720000
             penable on behalf of the defective software       <<k7614>>06725000
             [a small prayer is in order here] and continue    <<k7614>>06730000
             execution (SOFT'DEATH will log this event). ;     <<k7614>>06735000
                                                               <<k7614>>06740000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) = 2 THEN      <<k7614>>06745000
      BEGIN                                                    <<k7614>>06750000
      PENABLE;  <<It's a miracle>>                             <<k7614>>06755000
      SOFT'DEATH(642);                                         <<k7614>>06760000
      END                                                      <<k7614>>06765000
   ELSE                                                        <<k7614>>06770000
      SUDDENDEATH(642);     <<Leave the SF hook in>>           <<k7614>>06775000
                                                               <<02090>>06780000
   END;                                                        <<01564>>06785000
PENABLE;                                                       <<01564>>06790000
TRYAGAIN:                                                      <<01949>>06795000
GETDATASEGCHANGESTATE(STACKDST);                               <<01564>>06800000
IF < THEN SUDDENDEATH(643) ELSE IF > THEN GO TRYAGAIN;         <<01949>>06805000
<<PDISABLE IN EFFECT NOW, AND STACK MARKED ABSENT!>>           <<01564>>06810000
STKINFO.STOVRALLFLAG := 1;                                     <<06642>>06815000
TOS:=DST(X:=STACKDST&LSL(2)+2);                                <<01564>>06820000
TOS:=DST(X:=X+1);                                              <<01564>>06825000
TOS:=TOS+MAXDATATORELDB+STBTOMAXDATA;                          <<01564>>06830000
ASMB(LSEA); <<STACK BASE TO DB>>                               <<01564>>06835000
SBRELDB:=TOS;                                                  <<01564>>06840000
TOS:=TOS+RELDBTORELZ; <<9>>                                    <<01564>>06845000
TOS:=OLDDELTAZ+INCREMENT;                                      <<01564>>06850000
ASMB(SSEA);                                                    <<01564>>06855000
IF PAGESALLOC >= PAGESREQUIRED THEN                            <<01706>>06860000
   BEGIN <<CURRENT REGION IS OK>>                              <<01564>>06865000
                                                               <<s8583>>06870000
   << No need to cause a swapin for this guy, can fix the    >><<s8583>>06875000
   << stack overflow without making stack absent.            >><<s8583>>06880000
                                                               <<s8583>>06885000
   ABSOLUTE(SYSWAITTODISPMSG).MEMTRAPFLAG := 0;                <<s8583>>06890000
                                                               <<s8583>>06895000
   PCB(CURPRC + STKINFOWORDNUM).                               <<06642>>06900000
   STOVRALLFLAG:=0;                                            <<01564>>06905000
   DST(X:=STACKDST&LSL(2)).DATASIZEFIELD:=NEWSIZE&LSR(2);      <<01564>>06910000
   DST(X).ABSENTFLAG:=0;                                       <<01564>>06915000
   ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'DELTAZ):=OLDDELTAZ +          <<01564>>06920000
   INCREMENT;                                                  <<01564>>06925000
   <<FLIP DB TO STACK DB FOR THE SET Z INSTRUCTION>>           <<01800>>06930000
   TOS:=ICS(-ICS'STKBANKCELL);                                 <<01800>>06935000
   TOS:=ICS(-ICS'ABSSTKDBCELL);                                <<01800>>06940000
   ASMB(XCHD);                                                 <<01800>>06945000
   TOS:=OLDDELTAZ+INCREMENT;                                   <<01784>>06950000
   SET(Z); <<STORE NEW DELTA Z INTO REGISTER>>                 <<01784>>06955000
   ASMB(XCHD;DDEL); <<DB BACK TO WHERE IT BELONGS>>            <<01800>>06960000
   PENABLE;                                                    <<01564>>06965000
   END                                                         <<01564>>06970000
ELSE                                                           <<01564>>06975000
   BEGIN <<CURRENT REGION ISN'T BIG ENOUGH>>                   <<01564>>06980000
   GENSPECREQ(OBJIDENT,NEWSIZE&LSR(2),0,0);                    <<06655>>06985000
   TOS := OBJIDENT;                                            <<06655>>06990000
   TOS := CURPRC;                                              <<06642>>06995000
   SENDMSG(SCHEDPIN,MAKEABSENTPORT,3,0);                       <<06655>>07000000
   IF STATUS.(1:1) = 0 THEN                                    <<01564>>07005000
      BEGIN <<PROCESS HAD DISABLED INTERRUPTS>>                <<01564>>07010000
      TOS:=3; <<CLOCK DRT>>                                    <<01564>>07015000
      ASMB(SINC);  <<TICK WILL DO A DISP>>                     <<01564>>07020000
      PENABLE;                                                 <<01564>>07025000
      DST(STACKDST&LSL(2)).ABSENTFLAG:=0; <<MARK PRESENT>>     <<01939>>07030000
      RETURN;                                                  <<01564>>07035000
      END                                                      <<01564>>07040000
   ELSE ASMB(DISP;PSEB); <<GET CONTROL TO DISPATCHER>>         <<01564>>07045000
   IF ICS(-ICS'PDISCNTCELL) > 0 THEN                           <<01939>>07050000
      BEGIN  <<PROCESS HAS SWITCHING DISABLED>>                <<01939>>07055000
      DST(STACKDST&LSL(2)).ABSENTFLAG:=0; <<MARK PRESENT>>     <<01939>>07060000
      RETURN; <<DISP ABOVE WILL GET CONTROL TO DISPATCHER>>    <<01939>>07065000
      END;                                                     <<01939>>07070000
   END;                                                        <<01564>>07075000
IF PCB(PCBPT+PROCSTATEWORDNUM).STOVFLAG=1                      <<01966>>07080000
AND PCB(PCBPT+RESABORTINFOWORDNUM).CRITFLAG=0                  <<01966>>07085000
AND PCB(PCBPT+RESABORTINFOWORDNUM).HASSIRFLAG=0                <<01966>>07090000
THEN                                                           <<04527>>07095000
   BEGIN                                                       <<04527>>07100000
   P := P+1; << UPDATE P FOR ABORT ROUTINE >>                  <<04527>>07105000
   << LET KERNEL ROUTINES KNOW WE'RE PROCESSING ABORT >>       <<04527>>07110000
   PCB(PCBPT+RESABORTINFOWORDNUM).STOVABORTFLAG := 1;          <<04527>>07115000
   ABORT ([8/1,8/4],0,0);                                      <<04527>>07120000
   END;                                                        <<04527>>07125000
END  <<STACKOVERFLOW>>;                                        <<01564>>07130000
                                                                        07135000
procedure STACKUNDERFLOW;                                      <<01744>>07140000
option privileged,uncallable;                                  <<01744>>07145000
begin <<STACKUNDERFLOW>>                                       <<01744>>07150000
equate      ICF44                   = 3,                       <<01744>>07155000
                                                               <<01744>>07160000
            ICF37                   = 5,                       <<*8289>>07165000
                                                               <<*8289>>07170000
            ICF55                   = 4,                       <<01744>>07175000
                                                               <<01744>>07180000
            QI                      = 5,                       <<01744>>07185000
                                                               <<01744>>07190000
            CPCB                    = 4;                       <<01744>>07195000
                                                               <<01744>>07200000
                                                               <<01744>>07205000
integer     X                       = X,                       <<01744>>07210000
                                                               <<01744>>07215000
            PROCESSOR'TYPE          = Q+4,                     <<01744>>07220000
                                                               <<01744>>07225000
            NEXT1                   = Q+3;                     <<01744>>07230000
                                                               <<01744>>07235000
                                                               <<01744>>07240000
logical     DELTAP                  = Q-2,                     <<01744>>07245000
                                                               <<01744>>07250000
            STATUS                  = Q-1,                     <<01744>>07255000
                                                               <<01744>>07260000
            INSTRUCTION             = Q+1,                     <<01744>>07265000
                                                               <<01744>>07270000
            CST'ENTRY               = Q+4;                     <<01744>>07275000
                                                               <<01744>>07280000
                                                               <<01744>>07285000
double      NEXT'INSTRUCTIONS       = Q+2;                     <<01744>>07290000
                                                               <<01744>>07295000
                                                               <<01744>>07300000
define      STUN'SIM'ENABLED        = STUN'SIM'BIT=0#,         <<01744>>07305000
                                                               <<01744>>07310000
            STUN'SIM'BIT            = F(F(QI)-31).(1:1)#,      <<01744>>07315000
                                                               <<01744>>07320000
            SIMBIT                  = (8:1)#,                  <<01744>>07325000
                                                               <<01744>>07330000
            MODE                    = (0:1)#,                  <<01744>>07335000
                                                               <<01744>>07340000
            USER'MODE               = STATUS.MODE=0#,          <<01744>>07345000
                                                               <<01744>>07350000
            CST'BASE                = F(0)#,                   <<01744>>07355000
                                                               <<01744>>07360000
            CSTX'BASE               = F(1)#,                   <<01744>>07365000
                                                               <<01744>>07370000
            CST                     = STATUS.(8:8)#,           <<01744>>07375000
                                                               <<01744>>07380000
            FIND'PROCESSOR'TYPE     = asmb(pcn);               <<01744>>07385000
                                      PROCESSOR'TYPE:=tos#,    <<01744>>07390000
                                                               <<01744>>07395000
            FETCH'NEXT'INSTRUCTIONS = X:=CST'ENTRY+2;          <<01744>>07400000
                                      asmb(plda);              <<01744>>07405000
                                      X:=X+1;                  <<01744>>07410000
                                      asmb(plda);              <<01744>>07415000
                                      tos:=tos+DELTAP+1;       <<01744>>07420000
                                      asmb(ldea);              <<01744>>07425000
                                      NEXT'INSTRUCTIONS:=tos#, <<01744>>07430000
                                                               <<01744>>07435000
                                                               <<01744>>07440000
            RESET'S                 = tos:=@NEXT1;             <<01744>>07445000
                                      set(S)#;                 <<01744>>07450000
                                                               <<01744>>07455000
                                                               <<01744>>07460000
                                                               <<01744>>07465000
                                                               <<01744>>07470000
                                                               <<01744>>07475000
                                                               <<01744>>07480000
asmb(adds 3);                                                  <<01744>>07485000
INSTRUCTION:=X;                                                <<01744>>07490000
FIND'PROCESSOR'TYPE;                                           <<01744>>07495000
IF USER'MODE and STUN'SIM'ENABLED and                          <<01744>>07500000
  (PROCESSOR'TYPE=ICF44 OR PROCESSOR'TYPE=ICF55 OR             <<*8289>>07505000
   PROCESSOR'TYPE=ICF37)                                       <<*8289>>07510000
 then                                                          <<01744>>07515000
  begin                                                        <<01744>>07520000
  CST'ENTRY := CST;                                            <<06095>>07525000
  CST'ENTRY.(0:1) := DELTAP.(1:1);                             <<06095>>07530000
  CST'ENTRY := CSTCONV(CST'ENTRY,0) + F(2);                    <<06095>>07535000
  FETCH'NEXT'INSTRUCTIONS;                                     <<01744>>07540000
  enable;                                                      <<01744>>07545000
  RESET'S;           <<set S for STUNSIM call>>                <<01744>>07550000
  STUNSIM;                                                     <<01744>>07555000
  end;                                                         <<01744>>07560000
enable;                                                        <<01744>>07565000
X := INSTRUCTION;                                              <<03040>>07570000
ABORT([8/1,8/0],29,0);                                         <<01744>>07575000
end;     <<STACKUNDERFLOW>>                                    <<01744>>07580000
                                                                        07585000
PROCEDURE  PRIVILEGEDMODEVIOLATION;                                     07590000
   OPTION PRIVILEGED,UNCALLABLE;                                        07595000
   BEGIN                                                                07600000
   ENABLE;                                                              07605000
   ABORT([8/1,8/0],6,0);  << WITH INSTR IN XREG >>             <<03040>>07610000
   END;                                                                 07615000
                                                                        07620000
PROCEDURE USERTRAP;                                                     07625000
   OPTION PRIVILEGED,UNCALLABLE;                                        07630000
   BEGIN                                                                07635000
                                                               <<02010>>07640000
DEFINE  CSTX'BASE = F(1)#,                                     <<02010>>07645000
        CST'BASE = F(0)#,                                      <<02010>>07650000
        CST = STATUS.(8:8)#;                                   <<02010>>07655000
                                                               <<02010>>07660000
INTEGER  X = X,                                                <<02010>>07665000
         INSTRUCTION = Q + 2,                                  <<02010>>07670000
         CST'ENTRY = Q + 3,                                    <<02010>>07675000
         DELTAP = Q - 2,                                       <<02010>>07680000
         STATUS = Q - 1;                                       <<02010>>07685000
                                                               <<02010>>07690000
                                                               <<02010>>07695000
    COMMENT   THIS CODE IS BEING ADDED FOR THE SERIES 44.      <<02010>>07700000
              WHEN A USER TRAP OCCURS ON A DOUBLE WORD COBOL   <<02010>>07705000
              INSTRUCTION, THE X REG CONTAINS THE FIRST WORD   <<02010>>07710000
              OF THE INSTRUCTION (%020477).  HOWEVER, FOR THE  <<02010>>07715000
              DOUBLE WORD INSTRUCTION "CVND", COBOL EXPECTS TO <<02010>>07720000
              SEE THE SECOND WORD IN THE X REGISTER.  THIS ONE <<02010>>07725000
              EXCEPTION IS BEING DONE HERE TO INSURE THAT THE  <<02010>>07730000
              CODE SEGMENT IS NOT SWAPPED OUT AND THE DELTA P  <<02010>>07735000
              CAN BE ADJUSTED CORRECTLY.                       <<02010>>07740000
              NOTE : COMING INTO THIS PROCEDURE, DELTA P POINTS<<02010>>07745000
              TO THE NEXT TRUE INST. AFTER THE DOUBLE WORD     <<02010>>07750000
              COBOL INSTRUCTION. THEREFORE, TO GET THE SECOND  <<02010>>07755000
              WORD, WE WILL DECREMENT P BY 1                   <<02010>>07760000
;                                                              <<02010>>07765000
                                                               <<02010>>07770000
   ASMB(ADDS 2);                                               <<02010>>07775000
   INSTRUCTION := X;       <<SAVE CURRENT INST>>               <<02010>>07780000
   IF INSTRUCTION = %020477   <<SERIES 44 AND 55>>             <<02010>>07785000
      THEN BEGIN                                               <<02010>>07790000
             CST'ENTRY := CST;                                 <<06095>>07795000
             CST'ENTRY.(0:1) := DELTAP.(1:1);                  <<06095>>07800000
             CST'ENTRY := CSTCONV(CST'ENTRY,0) + F(2);         <<06095>>07805000
             X := CST'ENTRY + 2;                               <<02010>>07810000
             ASMB(PLDA);                                       <<02010>>07815000
             X := X + 1;                                       <<02010>>07820000
             ASMB(PLDA);              <<GET CST ADDRESS>>      <<02010>>07825000
             TOS := TOS + DELTAP - 1;   <<ADR OF 2ND WORD>>    <<02010>>07830000
             ASMB(LSEA);                                       <<02010>>07835000
             X := TOS;                                         <<02010>>07840000
           END;                                                <<02010>>07845000
                                                               <<02010>>07850000
   ENABLE;                                                              07855000
   ABORT([8/1,8/0],PARAM,0);                                            07860000
   END;                                                                 07865000
$PAGE                                                          <<06655>>07870000
PROCEDURE CODEABSENCE;                                         <<MPEIV>>07875000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                         <<MPEIV>>07880000
                                                               <<MPEIV>>07885000
COMMENT                                                        <<MPEIV>>07890000
                                                               <<MPEIV>>07895000
CODEABSENCE IS THE INTERNAL INTERRUPT HANDLER FOR PCAL AND     <<MPEIV>>07900000
EXIT REFERENCES TO ABSENT SEGMENTS.  CODEABSENCE RUNS ON THE   <<MPEIV>>07905000
TRAPPING PROCESS' STACK WITH THE FOLLOWING ENVIRONMENT SET     <<MPEIV>>07910000
UP BY FIRMWARE :                                               <<MPEIV>>07915000
                                                               <<MPEIV>>07920000
X REGISTER-                                                    <<MPEIV>>07925000
   THE INSTRUCTION CAUSING THE ABSENCE TRAP IS PLACED BY       <<MPEIV>>07930000
   FIRMWARE INTO THE INDEX REGISTER.                           <<MPEIV>>07935000
                                                               <<MPEIV>>07940000
Q+1 FIRMWARE PARAMETER -                                       <<MPEIV>>07945000
   IF ABSENT ON AN EXIT THEN N = # OF PROCEDURE PARAMETERS     <<MPEIV>>07950000
   TO BE PEELED OFF THE STACK.                                 <<MPEIV>>07955000
   IF ABSENT ON A PCAL, THEN =PLABEL WHERE (3:7)=CSTXEIX AND   <<MPEIV>>07960000
   (10:6) =ENTRY NUMBER.                                       <<MPEIV>>07965000
                                                               <<MPEIV>>07970000
STACK MARKERS-                                                 <<MPEIV>>07975000
IF PCAL, TWO STACK MARKERS. THE FIRST MARKER IS THE NORMAL     <<MPEIV>>07980000
MARKER SET UP BY FIRMWARE FOR A PCAL SO THAT CONTROL AND       <<MPEIV>>07985000
RETURN ON EXIT. THE SECOND MARKER CONTAINS GARBAGE DELTA       <<MPEIV>>07990000
P, DELTA Q = 4, AND STATUS WITH THE CST NUMBER OF THE SEGMENT  <<MPEIV>>07995000
THE PCAL WAS GOING TO IN IT.  CODEABSENCE WILL FIX UP THIS     <<MPEIV>>08000000
MARKER AFTER THE REQUIRED SEG COMES IN BY LOOKING UP THE       <<MPEIV>>08005000
DELTA P IN THE NEW SEGMMENT VIA THE STT, PLACING THIS INTO     <<MPEIV>>08010000
THE STACK MARKER.  THIS MARKER WILL THEN BE EXITED INTO.       <<MPEIV>>08015000
                                                               <<MPEIV>>08020000
FOR EXITS, THERE'S ONLY ONE STACK MARKER, THE REGULAR OLD      <<MPEIV>>08025000
ONE.  WHEN THE SEGMENT COMES IN, CODEABSENCE WILL RETRY THE    <<MPEIV>>08030000
EXIT WITH THE N VALUE OBTAINED FROM FIRMWARE'S PARAMETER.      <<MPEIV>>08035000
                                                               <<MPEIV>>08040000
To get the segment into memory, CODEABSENCE has an SLL entry   <<06655>>08045000
built for the object in the process' SLL and points the SLL    <<06655>>08050000
memory pointer at it.  WAIT is called, waiting on memory       <<06655>>08055000
attention.  (This is accomplished via QUEUEONOBJECT).          <<06655>>08060000
                                                               <<MPEIV>>08065000
;                                                              <<MPEIV>>08070000
                                                               <<MPEIV>>08075000
BEGIN                                                          <<MPEIV>>08080000
                                                               <<MPEIV>>08085000
INTEGER S0=S-0,                                                <<MPEIV>>08090000
        S1=S-1,                                                <<MPEIV>>08095000
        PCALSTATUS=Q-5,                                        <<01949>>08100000
        STATUS=Q-1;                                            <<MPEIV>>08105000
INTEGER FIRMWAREPARM=Q+1,                                      <<03040>>08110000
        PROCINX=Q+6,                                           <<03040>>08115000
        CSTXEIX=Q+7,                                           <<03040>>08120000
        DESCSTINX=Q+8;                                         <<06655>>08125000
                                                               <<06655>>08130000
DOUBLE  OBJID = Q + 9;                                         <<06655>>08135000
LOGICAL ARRAY OBJECTIDENT(*) = OBJID;                          <<06655>>08140000
                                                               <<06655>>08145000
LOGICAL                                                        <<06655>>08150000
        INSTR=Q+2,                                             <<03040>>08155000
        PCALFLAG=Q+3,                                          <<03040>>08160000
        TRACE=Q+11;                                            <<03040>>08165000
DOUBLE SAVEDB=Q+4;                                             <<03040>>08170000
                                                               <<03040>>08175000
SUBROUTINE ABORT'PROC (MODE,CODE,ABORT'PARM);                  <<03040>>08180000
   VALUE MODE,CODE,ABORT'PARM;                                 <<03040>>08185000
   INTEGER MODE,CODE,ABORT'PARM;                               <<03040>>08190000
BEGIN                                                          <<03040>>08195000
   COMMENT:  THIS CODE PLACES THE INSTRUCTION IN X AND         <<03040>>08200000
      CALLS ABORT. MODE.(8:8), CODE AND ABORT'PARM ARE AS      <<03040>>08205000
      DEFINED FOR ABORT;                                       <<03040>>08210000
   X := INSTR;                                                 <<03040>>08215000
   << POP GARBAGE MARKER LAID DOWN FOR PCALS >>                <<03040>>08220000
   MODE.(0:8) := IF PCALFLAG THEN 2 ELSE 1;                    <<03040>>08225000
   ABORT (MODE,CODE,ABORT'PARM);                               <<03040>>08230000
END;                                                           <<03040>>08235000
                                                               <<03040>>08240000
TOS := X; << SET UP INSTR >>                                   <<03040>>08245000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) > 0 THEN         <<02090>>08250000
   COMMENT:  The purpose of the following code is to cover up  <<k7614>>08255000
             a pdisable problem in which an interrupt handler  <<k7614>>08260000
             appears to execute a pdisable without a           <<k7614>>08265000
             corresponding penable.  This strange problem      <<k7614>>08270000
             always appears to leave the pdisable count at 1.  <<k7614>>08275000
             If this condition is met, we shall execute a      <<k7614>>08280000
             penable on behalf of the defective software       <<k7614>>08285000
             [a small prayer is in order here] and continue    <<k7614>>08290000
             execution (SOFT'DEATH will log this event). ;     <<k7614>>08295000
                                                               <<k7614>>08300000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) = 1 THEN      <<k7614>>08305000
      BEGIN                                                    <<k7614>>08310000
      PENABLE;  <<It's a miracle>>                             <<k7614>>08315000
      SOFT'DEATH(644);                                         <<k7614>>08320000
      END                                                      <<k7614>>08325000
   ELSE                                                        <<k7614>>08330000
      SUDDENDEATH(644);     <<Leave the SF hook in>>           <<k7614>>08335000
                                                               <<02090>>08340000
                                                               <<MPEIV>>08345000
TRAPSOFF;                                                      <<01858>>08350000
PDISABLE;                                                      <<MPEIV>>08355000
ENABLE;                                                        <<MPEIV>>08360000
                                                               <<MPEIV>>08365000
<<FILL IN THE LOCAL VARIABLES>>                                <<MPEIV>>08370000
Comment  If we have a code absence for a PCAL instruction,     <<04269>>08375000
         and we get a control Y pseudo interrupt while waiting <<04269>>08380000
         for the segment to come in , the delayed control Y    <<04269>>08385000
         flag is set in the delta P by PSEUDOINT inside of     <<04269>>08390000
         bit (0:1). However, when the code segment is brought  <<04269>>08395000
         in, the top two bits of the delta P word will be set  <<04269>>08400000
         to zero (in the old code), and the delayed control Y  <<04269>>08405000
         will be forever lost. Now the garbage delta P is set  <<04269>>08410000
         to zero before queueing on the segment, and the delta <<04269>>08415000
         P which is restored does not mask off bit 0.          <<04269>>08420000
;                                                              <<04269>>08425000
                                                               <<MPEIV>>08430000
IF INSTR.(0:8) = %(2)00110010 THEN    << IT'S A PCAL >>        <<06095>>08435000
   BEGIN                                                       <<04269>>08440000
   <<ZERO ANY GARBAGE IN P, SO WE DO NOT SEE IT AS CTLY/TRACE>><<06095>>08445000
   P := IF MAPPINGFIRMWARE THEN                                <<06095>>08450000
           LOGICAL(P) LAND %40000 << SAVE THE MAP FLAG >>      <<06095>>08455000
        ELSE                                                   <<06095>>08460000
           0;                                                  <<06095>>08465000
   TOS := TRUE;                                                <<04269>>08470000
   END                                                         <<04269>>08475000
ELSE                                                           <<04269>>08480000
   TOS := FALSE;                                               <<04269>>08485000
TOS:=%1000D;                                                   <<MPEIV>>08490000
X := CURPRC;                                                   <<06642>>08495000
ASMB(XCHD); <<FILLS IN SAVEDB>>                                <<MPEIV>>08500000
TOS:=X;<<PROCINX>>                                             <<MPEIV>>08505000
TOS := PCB(CURPRC+PBXWORDNUM);                                 <<06642>>08510000
TOS := SAVEDB;                                                 <<06095>>08515000
SET( DB );                                                     <<06095>>08520000
TOS:=0; << RESERVED FOR DESCSTINX, IT'LL BE INIT LATER >>      <<06095>>08525000
TOS := 0D;    << For OBJID >>                                  <<06655>>08530000
TOS :=STATUS.(8:8);                                            <<06095>>08535000
TOS.(0:1):=P.(1:1);                                            <<06095>>08540000
TOS:=MAPPEDCSTTOPHYCST(*,0);                                   <<06095>>08545000
IF <> THEN SUDDENDEATH(999); <<** FIX ** FIX ** FIX ** FIX**>> <<06095>>08550000
TOS := SYSDB D;                                                <<06095>>08555000
SET( DB );                                                     <<06095>>08560000
DESCSTINX := IF OBJECTIDENT(OBJIDTYPEFIELD) = SLOBJECT         <<06655>>08565000
                THEN OBJECTIDENT(OBJIDNUMFIELD)&LSL(2) +       <<06655>>08570000
                     LOGICAL(DFC)                                       08575000
             ELSE OBJECTIDENT(OBJIDNUMFIELD)&LSL(2) +          <<06655>>08580000
                  LOGICAL(CSTXBLK(CSTXEIX));                   <<06655>>08585000
TOS:=FALSE; <<FILL IN TRACE FLAG LATER>>                       <<MPEIV>>08590000
IF DST(DESCSTINX).CODESIZEFIELD = 0 THEN                       <<MPEIV>>08595000
   BEGIN <<BAD ENTRY>>                                         <<MPEIV>>08600000
   DST(X).REFERENCEDFLAG:=0;PENABLE;                           <<MPEIV>>08605000
   ABORT'PROC (0,30,0);RETURN;                                 <<03040>>08610000
   END;                                                        <<MPEIV>>08615000
IF LOGICAL(DST(X:=DESCSTINX+1)).ROCFLAG THEN                   <<MPEIV>>08620000
   BEGIN <<RECOVERABLE>>                                       <<MPEIV>>08625000
   RECOVEROC(OBJID,DESCSTINX,0d);                              <<06655>>08630000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<MPEIV>>08635000
      BEGIN  <<MEASURE RECOVERY OF CODE OVERLAY CANDIDATE>>    <<MPEIV>>08640000
      TOS:=MEASSTATXDSBANK;                                    <<MPEIV>>08645000
      TOS:=MEASSTATXDSBASE;                                    <<MPEIV>>08650000
      TOS:=TOS+C0SUB0'SEGRELOFF;                               <<MPEIV>>08655000
      IF OBJECTIDENT(OBJIDPBXFIELD) = PBXOBJECT THEN           <<06655>>08660000
         TOS:=TOS+C'PBXRECOVERY                                <<MPEIV>>08665000
         ELSE TOS:=TOS+C'SLRECOVERY;                           <<MPEIV>>08670000
      ASMB(LSEA;INCA;SSEA;DDEL);                               <<MPEIV>>08675000
      END;                                                     <<MPEIV>>08680000
   END                                                         <<MPEIV>>08685000
ELSE                                                           <<MPEIV>>08690000
   BEGIN<<ENTER REQUEST FOR SEG AND WAIT>>                     <<02014>>08695000
   TOS:=SAVEDB;                                                <<02014>>08700000
   ASMB(XCHD);                                                 <<02014>>08705000
   DO                                                          <<02014>>08710000
      BEGIN                                                    <<02014>>08715000
      QUEUEONOBJECT(OBJID);                                    <<06655>>08720000
      PDISABLE;                                                <<02014>>08725000
                                                               <<06655>>08730000
      << It may have moved >>                                  <<06655>>08735000
                                                               <<06655>>08740000
      IF OBJECTIDENT(OBJIDTYPEFIELD) = OBJIDPGMTYPE THEN       <<06655>>08745000
          DESCSTINX := CONVSEGIDTOSTINX(OBJID);                <<06655>>08750000
      END                                                      <<02014>>08755000
   UNTIL DST(DESCSTINX) > 0;                                   <<02014>>08760000
   ASMB(XCHD);                                                 <<02014>>08765000
   SAVEDB:=TOS;                                                <<02014>>08770000
   <<THE REQUIRED SEGMENT IS AROUND NOW>>                      <<02014>>08775000
   END;                                                        <<MPEIV>>08780000
IF NOT PCALFLAG THEN                                           <<MPEIV>>08785000
   BEGIN <<RETRY EXIT>>                                        <<MPEIV>>08790000
                                                               <<04528>>08795000
   COMMENT :                                                   <<04528>>08800000
                                                               <<04528>>08805000
      The code below will avert a SF10 with a process          <<04528>>08810000
    which has a corrupted stack marker.                        <<04528>>08815000
                                                               <<04528>>08820000
   ;                                                           <<04528>>08825000
                                                               <<04528>>08830000
   IF INTEGER(LOGICAL(P) LAND %37777) >                        <<04528>>08835000
      DST(DESCSTINX).CODESIZEFIELD&LSL(2) AND                  <<04528>>08840000
      (PCB(CURPRC+PIINFOWORDNUM).PSIMFIELD <> 5 LAND           <<06642>>08845000
      PCB(CURPRC+RESABORTINFOWORDNUM).DELAYSOFTFLAG<>1) THEN   <<06642>>08850000
      BEGIN                                                    <<04528>>08855000
      PENABLE;                                                 <<*8085>>08860000
      ABORT'PROC ( 0, 24, 0 );   << BOUNDS VIOLATION >>        <<04528>>08865000
      RETURN                                                   <<04528>>08870000
      END;                                                     <<04528>>08875000
   TOS:=SAVEDB;                                                <<MPEIV>>08880000
   ASMB(XCHD);                                                 <<MPEIV>>08885000
   TOS:=LOGICAL(FIRMWAREPARM) LOR %31400;                      <<MPEIV>>08890000
   PENABLE;                                                    <<MPEIV>>08895000
   ASMB(XEQ 0);                                                <<MPEIV>>08900000
   END                                                         <<MPEIV>>08905000
ELSE                                                           <<MPEIV>>08910000
   BEGIN <<MAKE PCAL TESTS FOR FIRMWARE>>                      <<MPEIV>>08915000
   X := DSTSYSBASEINX + CONVSEGIDTOSTINX(OBJID);               <<06655>>08920000
   IF SEGDESCFIRMINFO.TRACEFLAG=1 THEN TRACE:=TRUE;            <<MPEIV>>08925000
   TOS:=SEGDESCBANK;                                           <<MPEIV>>08930000
   TOS:=SEGDESCADDR;                                           <<MPEIV>>08935000
   TOS:=SEGDESCFIRMINFO.CODESIZEFIELD&LSL(2)-1; <<PL(0)>>      <<MPEIV>>08940000
   ASMB(LADD;LSEA);                                            <<MPEIV>>08945000
   <<  IF NO MAPPING FIRMWARE                             >>   <<06095>>08950000
   <<     LOAD TOTAL NUMBER OF STT ENTRIES, THE CHECK     >>   <<06095>>08955000
   <<     TO SEE IF IT IS INTERNAL/EXTERNAL WILL BE       >>   <<06095>>08960000
   <<     DONE LATER.                                     >>   <<06095>>08965000
   <<  IF MAPPING FIRMWARE                                >>   <<06095>>08970000
   <<     LOAD NUMBER OF INTERNAL STT ENTRIES, WE WILL    >>   <<06095>>08975000
   <<     CHECK BOUNDS AND INTERNAL/EXTERNAL AT THE       >>   <<06095>>08980000
   <<     SAME TIME.                                      >>   <<06095>>08985000
   TOS := IF MAPPINGFIRMWARE THEN TOS.(0:8) ELSE TOS.(8:8);    <<06095>>08990000
   TOS:=FIRMWAREPARM.(1:7); <<TARGET STT #>>                   <<MPEIV>>08995000
   IF S0 > S1 THEN                                             <<MPEIV>>09000000
      BEGIN <<STT IS TOO LARGE>>                               <<MPEIV>>09005000
      TOS:=SAVEDB;                                             <<MPEIV>>09010000
      ASMB(XCHD);                                              <<MPEIV>>09015000
      PENABLE;                                                 <<MPEIV>>09020000
      ABORT'PROC (0,31,0);  <<BADSTT>>                         <<03040>>09025000
      RETURN;                                                  <<MPEIV>>09030000
      END;                                                     <<MPEIV>>09035000
   ASMB(DELB,LSUB;LSEA);                                       <<MPEIV>>09040000
   IF < THEN                                                   <<MPEIV>>09045000
      BEGIN <<STT BEING REFERENCED IS EXTERNAL>>               <<MPEIV>>09050000
      TOS:=SAVEDB;ASMB(XCHD);PENABLE;                          <<MPEIV>>09055000
      ABORT'PROC (0,31,0);  <<EXTSTTREF>>                      <<03040>>09060000
      RETURN;                                                  <<MPEIV>>09065000
      END;                                                     <<MPEIV>>09070000
   ASMB(TBC UNCALLABLEBIT);                                    <<MPEIV>>09075000
   IF <> THEN                                                  <<MPEIV>>09080000
      BEGIN <<ENTRY IS UNCALLABLE>>                            <<MPEIV>>09085000
      IF (PCALFLAG LAND PCALSTATUS>=0)                         <<01949>>09090000
      LOR (NOT PCALFLAG LAND STATUS>=0) THEN                   <<01949>>09095000
         BEGIN <<NOT PRIVILEGED>>                              <<MPEIV>>09100000
         TOS:=SAVEDB;                                          <<MPEIV>>09105000
         ASMB(XCHD);                                           <<MPEIV>>09110000
         PENABLE;                                              <<MPEIV>>09115000
         ABORT'PROC (0,17,0);  <<UNCALLABLEREF>>               <<03040>>09120000
         RETURN;                                               <<MPEIV>>09125000
         END;                                                  <<MPEIV>>09130000
      END;                                                     <<MPEIV>>09135000
                                                               <<MPEIV>>09140000
   <<PUT THE DELTA P INTO THE SECOND STACK MARKER>>            <<MPEIV>>09145000
                                                               <<MPEIV>>09150000
   << MASK OFF DELTA P, OR IN MAPFLAG >>                       <<06095>>09155000
   P := TOS LAND %37777 LOR LOGICAL(P);                        <<06095>>09160000
   IF P.(2:14) > DST(DESCSTINX).CODESIZEFIELD&LSL(2)           <<04269>>09165000
   THEN SUDDENDEATH(645);                                      <<01687>>09170000
                                                               <<MPEIV>>09175000
   <<CHECK IF SEGMENT IS BEING TRACED>>                        <<MPEIV>>09180000
                                                               <<MPEIV>>09185000
   IF TRACE THEN                                               <<MPEIV>>09190000
      BEGIN                                                    <<MPEIV>>09195000
      TOS:=ABSOLUTE(TRACELABEL);                               <<MPEIV>>09200000
      IF < THEN                                                <<MPEIV>>09205000
         BEGIN                                                 <<MPEIV>>09210000
         DISABLE;                                              <<MPEIV>>09215000
         ASMB(PCAL 0);                                         <<MPEIV>>09220000
         END                                                   <<MPEIV>>09225000
      ELSE                                                     <<MPEIV>>09230000
         BEGIN <<TRACE ROUTINE ISN'T AROUND>>                  <<MPEIV>>09235000
         TOS:=SAVEDB;ASMB(XCHD);PENABLE;                       <<03040>>09240000
         ABORT'PROC (0,22,0);  <<TRACEABS>>                    <<03040>>09245000
         END;                                                  <<MPEIV>>09250000
      END;                                                     <<MPEIV>>09255000
   TOS:=SAVEDB;                                                <<MPEIV>>09260000
   ASMB(XCHD);                                                 <<MPEIV>>09265000
   PENABLE;                                                    <<MPEIV>>09270000
   END;                                                        <<MPEIV>>09275000
END  <<CODEABSENCE>>;                                          <<MPEIV>>09280000
PROCEDURE TRACE;                                               <<06095>>09285000
                                                               <<06095>>09290000
OPTION PRIVILEGED,UNCALLABLE;                                  <<06095>>09295000
                                                               <<06095>>09300000
<<*********************************************************>>  <<06095>>09305000
<< THIS PROCEDURE HANDLES TRACE TRAP.                      >>  <<06095>>09310000
<<                                                         >>  <<06095>>09315000
<<   TRAPPED WHEN PCAL :                                   >>  <<06095>>09320000
<<     IT IS "TRACE".                                      >>  <<06095>>09325000
<<     TWO MARKERS WERE PUT DOWN BY MICROCODE. FIRST ONE   >>  <<06095>>09330000
<<     IS "FROM" MARKER, AND THE SECOND ONE IS "TO" MARKER.>>  <<06095>>09335000
<<     THE DELTA P IN THE SECOND MARKER NEEDS TO BE        >>  <<06095>>09340000
<<     REPIRED.                                            >>  <<06095>>09345000
<<     X REGISTER CONTAINS THE TRAPPED INSTRUCTION.        >>  <<06095>>09350000
<<     Q+1 LOCATION CONTAINS EXTERNAL LABEL OF PCAL.       >>  <<06095>>09355000
<<                                                         >>  <<06095>>09360000
<<   TRAPPED WHEN EXIT :                                   >>  <<06095>>09365000
<<     IT IS TRACE OR DELAYED SOFT INTERRUPT.              >>  <<06095>>09370000
<<     CHECK SOFT INTERRUPT MODE AND DELAYED SOFT INT. BIT >>  <<06095>>09375000
<<     IN PCB AND MODE OF THE SEGMENT TO BE EXIT TO TO     >>  <<06095>>09380000
<<     DETERMINE IF IT'S A RIGHT MARKER TO PROCESS THE     >>  <<06095>>09385000
<<     DELAYED CONTROL-Y. IF NOT, THEN TRACE.              >>  <<06095>>09390000
<<     X REGISTER CONTAINS THE TRAPPED INSTRUCTION.        >>  <<06095>>09395000
<<     Q+1 LOCATION CONTAINS NUMBER OF WORD TO BE POPED    >>  <<06095>>09400000
<<     (NUMBER OF PROCEDURE PARAMETERS).                   >>  <<06095>>09405000
<<*********************************************************>>  <<06095>>09410000
Comment This procedure will not check to see of the            <<*7854>>09415000
        interrupted code is system code or not. This           <<*7854>>09420000
        change has been implemented as a result of             <<*7854>>09425000
        the possibility of PAUSE and IOWAIT being              <<*7854>>09430000
        called from within system code. When such is           <<*7854>>09435000
        the case, and a soft interrupt like control y          <<*7854>>09440000
        is intercepted, the process is awoken from a           <<*7854>>09445000
        timer or iowait wait and modifies the immediate        <<*7854>>09450000
        stack marker to trap to ININ upon exit. The            <<*7854>>09455000
        delta p is also modified so that the pcal to           <<*7854>>09460000
        PAUSE or IOWAIT be retried upon exit from the          <<*7854>>09465000
        soft interrupt handler. Under normal conditions        <<*7854>>09470000
        where the user or system do not call PAUSE or          <<*7854>>09475000
        IOWAIT , PSEUDOINT makes shure that the handler        <<*7854>>09480000
        will not run during system code. But since by          <<*7854>>09485000
        design and specifications IOWAIT and PAUSE can         <<*7854>>09490000
        be interrupted, and system code can call it, the       <<*7854>>09495000
        procedure will not check for interrupted system        <<*7854>>09500000
        code.                                                  <<*7854>>09505000
;                                                              <<*7854>>09510000
BEGIN                                                          <<06095>>09515000
                                                               <<06095>>09520000
   ARRAY      Q0ARRAY (*) = Q+0;                               <<06095>>09525000
   INTEGER    INST        = Q+2;    << INSTR FROM X REG  >>    <<06095>>09530000
   INTEGER    DSTOFFSET   = Q+3;    << CST OR CSTX ENTRY >>    <<06095>>09535000
                                    << OFFSET FROM DSTB  >>    <<06095>>09540000
   INTEGER    PLABEL       = Q + 4;                            <<*7854>>09545000
   LOGICAL    MCY          = Q + 5;<< mode of usr when CY on >><<*7854>>09550000
                                                               <<06095>>09555000
   SUBROUTINE ABORT'PROC(MODE, CODE, ABORT'PARM);              <<06095>>09560000
                                                               <<06095>>09565000
      VALUE MODE, CODE, ABORT'PARM;                            <<06095>>09570000
      INTEGER MODE, CODE, ABORT'PARM;                          <<06095>>09575000
                                                               <<06095>>09580000
      <<***************************************************>>  <<06095>>09585000
      << THIS ROUTINE PLACES THE INSTRUCTION IN X AND      >>  <<06095>>09590000
      << CALLS ABORT. MODE, CODE AND ABORT'PARM ARE AS     >>  <<06095>>09595000
      << DEFINED FOR ABORT.                                >>  <<06095>>09600000
      <<***************************************************>>  <<06095>>09605000
                                                               <<06095>>09610000
      BEGIN                                                    <<06095>>09615000
         X:=INST;                                              <<06095>>09620000
         ABORT(MODE, CODE, ABORT'PARM);                        <<06095>>09625000
      END;                                                     <<06095>>09630000
                                                               <<06095>>09635000
   LOGICAL SUBROUTINE MODEOK;                                  <<06095>>09640000
                                                               <<06095>>09645000
      <<***************************************************>>  <<06095>>09650000
      << THIS ROUTINE CHECKS MODES OF THE TRAP PROCEDURE   >>  <<06095>>09655000
      << AND THE TRAPPED SEGMENT. THE PRIVILEGED TRAPPED   >>  <<06095>>09660000
      << SEGMENT CAN'T TRAP INTO USER MODE TRAP PROCEDURE. >>  <<06095>>09665000
      <<***************************************************>>  <<06095>>09670000
                                                               <<06095>>09675000
      BEGIN                                                    <<06095>>09680000
         IF PCB(CURPRC + PIINFOWORDNUM).PSIMFIELD = 5 THEN     <<06642>>09685000
            BEGIN                                              <<06095>>09690000
               PUSH (Q, DL);                                   <<06095>>09695000
               ASMB (XCH, SUB);                                <<06095>>09700000
               TOS := TOS - Q0ARRAY(S0-2);                     <<06095>>09705000
               MCY := Q0ARRAY(TOS + 6).(3:1);                  <<07363>>09710000
               IF NOT (MCY LAND                                <<06095>>09715000
                       LOGICAL(STATUS.(0:1)) ) THEN            <<06095>>09720000
                          MODEOK:=TRUE;                        <<06095>>09725000
            END;                                               <<06095>>09730000
         IF PCB(CURPRC + RESABORTINFOWORDNUM).                 <<06642>>09735000
                 DELAYSOFTFLAG = 1 THEN                        <<06642>>09740000
            BEGIN                                              <<06095>>09745000
               ASMB(ADDS 4);                                   <<06095>>09750000
               RECEIVEMSG(USERMSGPORT,4,SAVEMSG);              <<06095>>09755000
               IF NOT (LOGICAL(S0.(0:1)) LAND                  <<06095>>09760000
                       LOGICAL(STATUS.(0:1)) ) THEN            <<06095>>09765000
                  BEGIN                                        <<*8528>>09770000
                  ASMB(SUBS 4);                                <<*8528>>09775000
                  MODEOK := TRUE;                              <<*8528>>09780000
                  END                                          <<*8528>>09785000
               ELSE                                            <<*8528>>09790000
                  BEGIN                                        <<*8528>>09795000
                  ASMB(SUBS 4);                                <<*8528>>09800000
                  MODEOK := FALSE;                             <<*8528>>09805000
                  END;                                         <<*8528>>09810000
                                                               <<*8528>>09815000
            END;                                               <<06095>>09820000
      END;                                                     <<06095>>09825000
                                                               <<06095>>09830000
   << ***** BEGINNING OF TRACE *****>>                         <<06095>>09835000
                                                               <<06095>>09840000
   ASMB(ADDS 4);                                               <<*7854>>09845000
   INST:=X;                                                    <<06095>>09850000
   IF INST.(0:8) = %(2)00110010 THEN  << PCAL >>               <<06095>>09855000
      BEGIN                                                    <<06095>>09860000
         DSTOFFSET := CSTCONV(PARAM, 0);                       <<06095>>09865000
         TOS := DST(DSTOFFSET+2);    << BANK # >>              <<06095>>09870000
         TOS := DST(DSTOFFSET+3);    << BANK OFFSET >>         <<06095>>09875000
         TOS := TOS + DST(DSTOFFSET).(4:12)&LSL(2) - 1         <<06095>>09880000
                - PARAM.(1:7);  << BANKOFFSET + SEGLENGTH >>   <<06095>>09885000
                                << - STTHEAD - STTNUMBER  >>   <<06095>>09890000
         ASMB(LSEA); << GET STT FOR CALLED SEGMENT >>          <<06095>>09895000
         IF < THEN SUDDENDEATH(289);                           <<06095>>09900000
         P.(2:14) := TOS.(2:14);                               <<06095>>09905000
         DDEL;  << DELETE BANK# AND BANK OFFSET >>             <<06095>>09910000
         TOS := PARAM;                                         <<06095>>09915000
         TOS := INST;                                          <<06095>>09920000
         TOS := 0;                                             <<06095>>09925000
         TOS := F(TRACELABEL);                                 <<06095>>09930000
         IF < THEN  << TRACE PROGRAM EXISTED >>                <<06095>>09935000
            BEGIN                                              <<06095>>09940000
               ASMB(PCAL 0);                                   <<06095>>09945000
               RETURN;                                         <<06095>>09950000
            END;                                               <<06095>>09955000
         ENABLE;                                               <<06095>>09960000
         ABORT'PROC([8/2,8/0],22,0); << POP DEST MARKER >>     <<06095>>09965000
      END                                                      <<06095>>09970000
   ELSE   << EXIT >>                                           <<06095>>09975000
      BEGIN                                                    <<06095>>09980000
         P.(0:1) := 0;<< CLEAR TRACE/CONTROL-Y BIT IN MARKER>> <<06095>>09985000
         PLABEL.(0:1) := P.(1:1);  << SET MAP FLAG >>          <<06095>>09990000
         PLABEL.(8:8) := STATUS.(8:8); << SET SEG NUMBER >>    <<06095>>09995000
         DSTOFFSET := CSTCONV(PLABEL,0);                       <<06095>>10000000
         IF (PCB(CURPRC + PIINFOWORDNUM).PSIMFIELD = 5 OR      <<06642>>10005000
            LPCB(CURPRC + RESABORTINFOWORDNUM).                <<06642>>10010000
                DELAYSOFTFLAG) AND                             <<06642>>10015000
            MODEOK THEN                                        <<*7854>>10020000
            BEGIN                                              <<06095>>10025000
               DELAYEDINT;                                     <<06095>>10030000
            END                                                <<06095>>10035000
         ELSE                                                  <<06095>>10040000
            BEGIN                                              <<06095>>10045000
               IF DELTAQ < 0 THEN DELTAQ.(0:1) := 1;           <<06095>>10050000
               TOS := PARAM;                                   <<06095>>10055000
               TOS := INST;                                    <<06095>>10060000
               TOS := 0;                                       <<06095>>10065000
               TOS := F(TRACELABEL);                           <<06095>>10070000
               IF <> THEN                                      <<06095>>10075000
                  ASMB(PCAL 0)                                 <<06095>>10080000
               ELSE                                            <<06095>>10085000
                  BEGIN                                        <<06095>>10090000
                     ENABLE;                                   <<06095>>10095000
                     ABORT'PROC([8/1,8/0],22,0);               <<06095>>10100000
                  END;                                         <<06095>>10105000
            END;                                               <<06095>>10110000
         TOS := LOGICAL(PARAM) LOR %31400;                     <<06095>>10115000
         ASMB(XEQ 0);                                          <<06095>>10120000
         HELP;                                                 <<06095>>10125000
      END;                                                     <<06095>>10130000
END;                                                           <<06095>>10135000
                                                                        10140000
PROCEDURE  STTUNCALLABLE;                                               10145000
   OPTION PRIVILEGED,UNCALLABLE;                                        10150000
   BEGIN                                                                10155000
   ENABLE;                                                              10160000
   << ABORT WITH INSTR. IN XREG >>                             <<03040>>10165000
   ABORT([8/1,8/0],17,0);                                               10170000
   END;                                                                 10175000
                                                                        10180000
$PAGE                                                          <<06655>>10185000
PROCEDURE DATAABSENCE;                                         <<MPEIV>>10190000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                         <<MPEIV>>10195000
                                                               <<MPEIV>>10200000
COMMENT                                                        <<MPEIV>>10205000
                                                               <<MPEIV>>10210000
DATAABSENCE IS THE INTERNAL INTERRUPT HANDLER FOR MOVES        <<MPEIV>>10215000
ATTEMPTED TO AN ABSENT DATA SEGMENT. DATAABSENCE RUNS ON       <<MPEIV>>10220000
THE TRAPPING PROCESS' STACK, AND FIRMWARE HAS PUSHED THE       <<MPEIV>>10225000
TARGET DATA SEGMENT NUMBER INTO Q+1. The process attempting    <<06655>>10230000
the move will have an entry for the required data segment      <<06655>>10235000
placed in its SLL with the SLL memory pointer aimed at it.     <<06655>>10240000
(This is accomplished via QUEUEONOBJECT).                      <<06655>>10245000
THE PROCESS WILL THEN BE WAITED UNTIL THE SEG IS MADE          <<MPEIV>>10250000
PRESENT, THEN THE MOVE WILL BE RETRIED BY DECREMENTING         <<MPEIV>>10255000
THE P REGISTER VALUE IN THE STACK MARKER AND EXITING.          <<MPEIV>>10260000
                                                               <<MPEIV>>10265000
;                                                              <<MPEIV>>10270000
                                                               <<MPEIV>>10275000
BEGIN                                                          <<MPEIV>>10280000
                                                               <<MPEIV>>10285000
DEFINE OBJIDENT = DOUBLE(FIRMWAREPARM)#;<< For QUEUEONOBJDECT>><<06655>>10290000
                                                               <<06655>>10295000
INTEGER FIRMWAREPARM=Q+1,                                      <<03040>>10300000
        INSTR=Q+2,                                             <<03040>>10305000
        S0=S-0;                                                <<03040>>10310000
                                                               <<03040>>10315000
TOS := X; << SET UP INSTR >>                                   <<03040>>10320000
IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) > 0 THEN         <<02090>>10325000
   COMMENT:  The purpose of the following code is to cover up  <<k7614>>10330000
             a pdisable problem in which an interrupt handler  <<k7614>>10335000
             appears to execute a pdisable without a           <<k7614>>10340000
             corresponding penable.  This strange problem      <<k7614>>10345000
             always appears to leave the pdisable count at 1.  <<k7614>>10350000
             If this condition is met, we shall execute a      <<k7614>>10355000
             penable on behalf of the defective software       <<k7614>>10360000
             [a small prayer is in order here] and continue    <<k7614>>10365000
             execution (SOFT'DEATH will log this event). ;     <<k7614>>10370000
                                                               <<k7614>>10375000
   IF ABSOLUTE(ABSOLUTE(ICS'QI)-ICS'PDISCNTCELL) = 1 THEN      <<k7614>>10380000
      BEGIN                                                    <<k7614>>10385000
      PENABLE;  <<It's a miracle>>                             <<k7614>>10390000
      SOFT'DEATH(644);                                         <<k7614>>10395000
      END                                                      <<k7614>>10400000
   ELSE                                                        <<k7614>>10405000
      SUDDENDEATH(644);     <<Leave the SF hook in>>           <<k7614>>10410000
                                                               <<02090>>10415000
                                                               <<MPEIV>>10420000
TRAPSOFF;                                                      <<01858>>10425000
PDISABLE;                                                      <<MPEIV>>10430000
DISABLE;                                                       <<MPEIV>>10435000
IF DST(X:=FIRMWAREPARM&LSL(2)).DATASIZEFIELD = 0 THEN          <<MPEIV>>10440000
   BEGIN <<DAD DST ENTRY>>                                     <<MPEIV>>10445000
   DST(X).REFERENCEDFLAG:=0;                                   <<MPEIV>>10450000
   PENABLE;X:=INSTR;ABORT([8/1,8/0],17,0);RETURN;              <<03040>>10455000
   END;                                                        <<MPEIV>>10460000
IF LOGICAL(DST(X:=FIRMWAREPARM&LSL(2)+1)).ROCFLAG THEN         <<MPEIV>>10465000
   BEGIN  <<RECOVERABLE>>                                      <<MPEIV>>10470000
   IF GCLASSENABLEDMASK.CLASS0 THEN                            <<MPEIV>>10475000
      BEGIN  <<MEASURE DATA SEG RECOVERY>>                     <<MPEIV>>10480000
      TOS:=MEASSTATXDSBANK;                                    <<MPEIV>>10485000
      TOS:=MEASSTATXDSBASE;                                    <<MPEIV>>10490000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'DATARECOVERY;                <<MPEIV>>10495000
      ASMB(LSEA);                                              <<MPEIV>>10500000
      TOS:=TOS+1;                                              <<MPEIV>>10505000
      ASMB(SSEA;DDEL);                                         <<MPEIV>>10510000
      END;                                                     <<MPEIV>>10515000
   TOS:=%1000D;                                                <<MPEIV>>10520000
   X := CURPRC;                                                <<06642>>10525000
   ASMB(XCHD);                                                 <<MPEIV>>10530000
   RECOVEROC(OBJIDENT,FIRMWAREPARM&LSL(2),0d);                 <<06655>>10535000
   ASMB(XCHD);                                                 <<MPEIV>>10540000
   PENABLE;                                                    <<MPEIV>>10545000
   END                                                         <<MPEIV>>10550000
ELSE                                                           <<MPEIV>>10555000
   QUEUEONOBJECT(OBJIDENT);                                    <<06655>>10560000
P:=P-1; <<EXIT WILL CAUSE MOVE INSTRUCTION TO BE RETRIED>>     <<MPEIV>>10565000
END  <<DATAABSENCE>>;                                          <<MPEIV>>10570000
                                                                        10575000
PROCEDURE  POWERON;                                                     10580000
   OPTION PRIVILEGED,UNCALLABLE;                                        10585000
BEGIN                                                                   10590000
                                                                        10595000
ENTRY                                                          <<*8289>>10600000
   MMPOWERFAIL;                                                <<*8289>>10605000
                                                               <<*8289>>10610000
EQUATE                                                                  10615000
   ICF'44       = 3,      << CPU NUMBER>>                      <<02009>>10620000
   CSTB        = 0,     <<CST BASE>>                           <<01372>>10625000
   COMPWAIT    = %13,   << SIODM COMPLETOR WAIT STATE >>                10630000
   CONSLDEV    = %74,   << SYSDB INDEX >>                               10635000
   DDLTP       = 4,     << DLT POINTER INDEX IN DIT >>                  10640000
   DILTP       = 5,     << ILT POINTER INDEX IN DIT >>                  10645000
   DLINK       = 1,     << LINK OFFSET IN DIT >>                        10650000
   DRT3        = 3,                                                     10655000
   DRTSIZE     = 4,                                                     10660000
   DSTAT       = 6,     << STATUS INDEX IN DIT >>                       10665000
   DSTOP       = 7,     << STOP WORD OF TREM. DIT >>                    10670000
   DTYPE       = 5,     << DEV TYPE INDEX IN DLT >>                     10675000
   ENABLEINT   = %70351,<< ENABLE CLOCK INTERRUPTS >>                   10680000
   ENABLETERM  = %015510,<< ESCAPE H TO START TERMINET >>               10685000
   FHDISC      = 1,     << FHD TYPE >>                                  10690000
   ICNTRL      = 7,    << CONTROLLER INFO OF ILT >>                     10695000
   IFLAG       = 13,   << FLAGS WORD OF ILT >>                          10700000
   IMASK       = 7,    << INTERRUPT MASK WORD >>                        10705000
   LOWESTDRT   = 8,                                                     10710000
   PFPROC      = %144,  << POWERFAIL PROC SYSDB INDEX >>                10715000
   POWERFAIL   = %72,   << POWERFAIL FLAG SYSDB INDEX >>                10720000
   SCSR        = %26,   << STATUS REGISTER OF SYS CLOCK >>     <<01183>>10725000
   TEMPLR      = %22,   << TEMP STORAGE FOR LIMIT REG >>       <<01183>>10730000
   SERIES'33   = 8,     << CPU # OF SERIES 33 >>               <<01183>>10735000
   SERIES'37   = 5,     << CPU # OF MM >>                      <<*8289>>10740000
   ICF'55      = 4;      <<CPU # OF ICF55>>                    <<06827>>10745000
                                                                        10750000
DEFINE                                                                  10755000
   MULTI'IMB   = CPUNUM = ICF'55 OR CPUNUM = SERIES'37#,       <<*8289>>10760000
   CHANQ       = (1:6)#, << CHANNEL QUEUE NUM. IN ILT >>                10765000
   DRTNUMBER   = (7:9)#,  <<DRT NUMBER FIELD IN ILT>>          <<03008>>10770000
   CHAN'NUM    = (9:4)#,  <<4-BIT-CHANNEL NUMBER>>             <<03008>>10775000
   IMB'NUM     = (7:2)#,  <<2-BIT-IMB NUMBER>>                 <<03008>>10780000
   RIOA        = CON %20302; CON %13#, <<FOR ICF55>>           <<03008>>10785000
   DRVRDY      = (3:1)#, << DRIVE READY BIT IN DISC STATUS >>           10790000
   IAK         = (8:1)#, << INT ACK BIT OF DIT >>                       10795000
   REQUEST     = (3:1)#, << SERVICE REQUEST BIT OF DFLAGS >>            10800000
   STATEF      = (12:4)#,<< SIODM STATE FIELD OF DIT >>                 10805000
   TRM         = (0:1)#, <<A TERMINAL DIT>>                    <<04424>>10810000
   TYPE        = (8:8)#; << TYPE FIELD OF DLT >>                        10815000
                                                                        10820000
INTEGER                                                                 10825000
   ABSQI       = Q+7,                                                   10830000
   I           = Q+6,                                                   10835000
   LR          = Q+5,                                                   10840000
   MAXDRT      = DB+%71,                                                10845000
   PARAM       = Q+3,                                                   10850000
   PF          = DB+POWERFAIL,                                          10855000
   PFAILPIN    = DB+PFPROC,                                             10860000
   SM2         = S-2,                                                   10865000
   S0            = S-0,                                       <<01.02>> 10870000
   SYSCONSOLE  = DB+CONSLDEV,                                           10875000
   SYSUP       = DB+%73; << SYSTEM UP FLAG >>                           10880000
                                                                        10885000
INTEGER POINTER                                                         10890000
  MEASINFOTABPTR = %261,  << FOR CLOCK INTERFACE >>            <<MPEIV>>10895000
   BUSY        = DB+%55,                                                10900000
   HEAD        = DB+%56,                                                10905000
   PS0         = S-0,                                                   10910000
   PS1         = S-1,                                                   10915000
   PS2          = S-2;                                         <<06827>>10920000
                                                                        10925000
                                                               <<04147>>10930000
<< These defines are for clearing the memory RAM after >>      <<04147>>10935000
<< a powerfail.  This needs to be done since the RAM is>>      <<04147>>10940000
<< garbage after a powerfail.  It also must be done    >>      <<04147>>10945000
<< before the Memlog process is launched.              >>      <<04147>>10950000
                                                               <<04147>>10955000
integer                                                        <<04147>>10960000
   S1 = S - 1;                                                 <<04147>>10965000
                                                               <<04147>>10970000
                                                               <<04147>>10975000
define                                                         <<04147>>10980000
   DUPLICATE = assemble( DUP )#,                               <<04147>>10985000
   MCMD      = assemble( CON %20104; CON 4)#,                  <<*8289>>10990000
   PFL       = CON %20104; CON %21#;                           <<*8289>>10995000
                                                               <<04147>>11000000
                                                                        11005000
INTEGER                                                        <<03008>>11010000
  LDEV     = Q+8,                                              <<03008>>11015000
  IMB      = Q+9,                                              <<03008>>11020000
  CHANNL   = Q+10,                                             <<03008>>11025000
  CPUNUM   = Q+11,                                             <<03008>>11030000
  NRIMB    = Q+12,                                             <<06829>>11035000
  LPDT'INDEX = Q+13;                                           <<06829>>11040000
ARRAY                                                          <<03008>>11045000
  TEMPMASK (*) = Q+14;                                         <<06829>>11050000
                                                               <<03008>>11055000
                                                               <<03008>>11060000
COMMENT                                                        <<03008>>11065000
============================================================== <<03008>>11070000
  POWER-FAIL SET UP THE STACK LIKE THIS:                       <<03008>>11075000
                                                               <<03008>>11080000
Q+1  DB BANK                                                   <<03008>>11085000
Q+2  DB                                                        <<03008>>11090000
Q+3  PARAM      <-- S AT ENTRY                                 <<03008>>11095000
Q+4  ADDS VALUE <-- S AFTER ADDS 1                             <<03008>>11100000
Q+5  LR                                                        <<03008>>11105000
Q+6                                                            <<03008>>11110000
Q+7  ABSQI=ABS(QI)   <-- S AFTER VALUES HAVE BEEN RESTORED     <<03008>>11115000
Q+8  CST(2)-0        (ADDITIONAL LOCALS SAFELY DECLARED HERE)  <<03008>>11120000
Q+9  CST(2)-1                                                  <<03008>>11125000
Q+10 CST(2)-2                                                  <<03008>>11130000
Q+11 CST(2)-3                                                  <<03008>>11135000
Q+12 SAVE QI-6                                                 <<03008>>11140000
Q+13 SAVE QI+3                                                 <<03008>>11145000
Q+14 SAVE QI+4                                                 <<03008>>11150000
Q+15 PUSH(S)                                                   <<03008>>11155000
Q+16 PUSH(Q)                                                   <<03008>>11160000
Q+17 PUSH(DL)   <-- S AFTER ADDS 0, READY TO POP VALUES        <<03008>>11165000
                    SET UP BY POWER-FAIL                       <<03008>>11170000
                                                               <<03008>>11175000
============================================================== <<03008>>11180000
END COMMENT;                                                   <<03008>>11185000
                                                               <<03008>>11190000
                                                               <<03008>>11195000
                                                                        11200000
   ASMB(ADDS 1;ADDS 0); << RESTORE S >>                                 11205000
   TOS := 0;                                                            11210000
   TOS := SYSDB;                                                        11215000
   SET(DB,DL,Q,S); << RESTORE OTHER REGISTERS >>                        11220000
   ABS(ABSQI+4) := TOS; << RESTORE QI + 4 >>                            11225000
   ABS(X:=X-1) := TOS;                                                  11230000
   ABS(X:=X-9) := TOS; << QI+3, AND QI-6 >>                             11235000
                                                               <<01372>>11240000
   <<RESTORE CST(2) WHICH WAS REBUILT BY POWERFAIL>>           <<01372>>11245000
                                                               <<01372>>11250000
   X:=ABS(CSTB)+11;    <<CST(2) WORD 3>>                       <<01372>>11255000
   ABS(X):=TOS;        <<WORD 3>>                              <<01372>>11260000
   ABS(X:=X-1):=TOS;   <<WORD 2>>                              <<01372>>11265000
   ABS(X:=X-1):=TOS;   <<WORD 1>>                              <<01372>>11270000
   ABS(X:=X-1):=TOS;   <<WORD 0>>                              <<01372>>11275000
                                                               <<01372>>11280000
   ASMB( ADDS 10);  <<PROTECT LOCALS Q+8 THRU Q+17>>           <<03008>>11285000
                                                               <<03008>>11290000
                                                               <<03008>>11295000
   COMMENT     CORRECT THE MASK FOR GETTING THE BANK NUMBER    <<02009>>11300000
               FOR THE ICF'44;                                 <<02009>>11305000
   ASSEMBLE(PCN);     <<GET CPU NUMBER>>                       <<02009>>11310000
   IF TOS = ICF'44 THEN                                        <<02009>>11315000
      BEGIN                                                    <<02009>>11320000
        TOS := %377;    <<BANK MASK>>                          <<02009>>11325000
        ASSEMBLE(CON %20104; CON %4);                          <<02009>>11330000
      END;                                                     <<02009>>11335000
   GOTO RECOVER'IO;                                            <<*8289>>11340000
                                                               <<*8289>>11345000
                                                               <<*8289>>11350000
                                                               <<*8289>>11355000
                                                               <<*8289>>11360000
                                                               <<*8289>>11365000
                                                               <<*8289>>11370000
                                                               <<*8289>>11375000
                                                               <<*8289>>11380000
                                                               <<*8289>>11385000
                                                               <<*8289>>11390000
                                                               <<*8289>>11395000
                                                               <<*8289>>11400000
                                                               <<*8289>>11405000
                                                               <<*8289>>11410000
                                                               <<*8289>>11415000
                                                               <<*8289>>11420000
                                                               <<*8289>>11425000
                                                               <<*8289>>11430000
                                                               <<*8289>>11435000
                                                               <<*8289>>11440000
                                                               <<*8289>>11445000
                                                               <<*8289>>11450000
                                                               <<*8289>>11455000
                                                               <<*8289>>11460000
                                                               <<*8289>>11465000
MMPOWERFAIL:                                                   <<*8289>>11470000
   ASMB( ADDS 14 ); << PROTECT LOCALS Q+4 THRU Q+17 >>         <<*8289>>11475000
   ABSQI := ABS(5);                                            <<*8289>>11480000
                                                               <<*8289>>11485000
   TOS := SYSDB D;                                             <<*8289>>11490000
   SET( DB );                                                  <<*8289>>11495000
   SYSUP := 0;                                                 <<*8289>>11500000
                                                               <<*8289>>11505000
   IF 1 <= PF <= 3 THEN                                        <<*8289>>11510000
      TOS := 0  << DON'T SAVE REGISTERS, AND DON'T >>          <<*8289>>11515000
                << RESTART PREVIOUS POWER FAIL TRAP>>          <<*8289>>11520000
   ELSE                                                        <<*8289>>11525000
      BEGIN                                                    <<*8289>>11530000
      PF := 1;                                                 <<*8289>>11535000
      TOS := 1; << NO PREVIOUS EXECUTING POWER FAIL >>         <<*8289>>11540000
                << ON THE ICS, SAVE THE REGISTERS   >>         <<*8289>>11545000
      END;                                                     <<*8289>>11550000
   ASMB( PFL );  << SIGNAL MICROCODE POWER FAIL >>             <<*8289>>11555000
                 << PROCESSING COMPLETE         >>             <<*8289>>11560000
                 << EXECUTION WILL RESUME AT THE>>             <<*8289>>11565000
                 << NEXT INSTRUCTION WHEN POWER >>             <<*8289>>11570000
                 << IS RESTORED                 >>             <<*8289>>11575000
                                                               <<02009>>11580000
RECOVER'IO:                                                    <<*8289>>11585000
                                                               <<*8289>>11590000
   PF := 2;                                                             11595000
   MMSTAT'(240,0,0,PF,SYSUP,0,0);                              <<*7753>>11600000
                                                               <<03008>>11605000
                                                               <<03008>>11610000
    <<======================================================>> <<03008>>11615000
    <<THE NORMAL OPERATIONS OF READ/SET MASK ARE COMPLICATED>> <<03008>>11620000
    <<BY THE INTRODUCTION OF A 4-WORD INTERRUPT MASK FOR THE>> <<03008>>11625000
    <<ICF/55.    FOR NON ICF/55 CPUS:                       >> <<03008>>11630000
    <<    INTERRUPT MASK STORED AT %7                       >> <<03008>>11635000
    <<    READ MASK RETURNS THE (1 WORD) MASK ON TOS        >> <<03008>>11640000
    <<    SET MASK EXPECTS  THE (1 WORD) MASK ON TOS        >> <<03008>>11645000
    <<           FOR THE ICF/55 CPU:                        >> <<03008>>11650000
    <<    INTERRUPT MASK STORED AT %32  (MASK FOR IMB 0)    >> <<03008>>11655000
    <<                             %33  (MASK FOR IMB 1)    >> <<03008>>11660000
    <<                             %34  (MASK FOR IMB 2)    >> <<03008>>11665000
    <<                             %35  (MASK FOR IMB 3)    >> <<03008>>11670000
    <<    SET MASK / READ MASK EXPECT OR RETURN TOP OF STACK>> <<03008>>11675000
    <<                             S-3  (MASK FOR IMB 3)    >> <<03008>>11680000
    <<                             S-2  (MASK FOR IMB 2)    >> <<03008>>11685000
    <<                             S-1  (MASK FOR IMB 1)    >> <<03008>>11690000
    <<                  TOS ==>    S-0  (MASK FOR IMB 0)    >> <<03008>>11695000
    <<======================================================>> <<03008>>11700000
                                                               <<03008>>11705000
                                                               <<03008>>11710000
   ASMB(PCN);           <<GET THE CPU NUMBER>>                 <<03008>>11715000
   CPUNUM := TOS;       <<AND SAVE IT>>                        <<03008>>11720000
                                                               <<03008>>11725000
   IF MULTI'IMB THEN                                           <<*8289>>11730000
      BEGIN                                                    <<*8289>>11735000
      NRIMB := 3;                                              <<*8289>>11740000
      TOS := -1D;                                              <<*8289>>11745000
      TOS := -1D;                                              <<*8289>>11750000
      END                                                      <<*8289>>11755000
   ELSE                                                        <<*8289>>11760000
      BEGIN                                                    <<*8289>>11765000
      NRIMB := 0;                                              <<*8289>>11770000
      TOS := -1;                                               <<*8289>>11775000
      END;                                                     <<*8289>>11780000
   <<  FIND OUT WHAT IMB'S EXIST               >>              <<03008>>11785000
   <<  RMSK RETURNS ZERO IF IMB DOESN'T EXIST  >>              <<03008>>11790000
   ASSEMBLE( SMSK;                                             <<03008>>11795000
             RMSK );  << IMB 0 = S-0, IMB 3 = S-3 >>           <<03008>>11800000
   X := 0;                                                     <<03008>>11805000
   DO BEGIN                                                    <<03008>>11810000
      TEMPMASK(X) := TOS;                                      <<03008>>11815000
      X := X+1;                                                <<03008>>11820000
      END UNTIL X > NRIMB;                                     <<03008>>11825000
                                                               <<03008>>11830000
   <<  DO A ROLL CALL ON ALL IMB'S THAT EXIST  >>              <<03008>>11835000
   << RETURNS A SET BIT FOR EACH GIC THAT EXISTS ON THE IMB>>  <<03008>>11840000
   << OTHERWISE A ZEROED BIT. USE THIS INFO LATER FOR INIT>>   <<03008>>11845000
                                                               <<03008>>11850000
   X := 0;                                                     <<03008>>11855000
   DO BEGIN                                                    <<03008>>11860000
      IF TEMPMASK(X) <> 0 THEN  << IMB EXISTS? >>              <<03008>>11865000
         BEGIN                                                 <<03008>>11870000
         IF MULTI'IMB THEN                                     <<*8289>>11875000
            BEGIN                                              <<03008>>11880000
            TOS := X&LSL(7);  << FORM IMB NR. >>               <<03008>>11885000
            TOS := %120000;   << ROLL CALL    >>               <<03008>>11890000
            ASSEMBLE( RIOA );                                  <<03008>>11895000
            END                                                <<03008>>11900000
         ELSE                                                  <<03008>>11905000
            BEGIN                                              <<03008>>11910000
            TOS := %120000;   << ROLL CALL    >>               <<03008>>11915000
            ASSEMBLE( RIOC );                                  <<03008>>11920000
            END;                                               <<03008>>11925000
         TEMPMASK(X) := TOS; <<REPLACE MASK WITH ROLL CALL>>   <<03008>>11930000
         END;                                                  <<03008>>11935000
      X := X+1;                                                <<03008>>11940000
      END UNTIL X > NRIMB;                                     <<03008>>11945000
                                                               <<03008>>11950000
   <<  INITIALIZE ALL CONFIGURED GICS  >>                      <<03008>>11955000
   <<  LOOP FROM HIGHEST IMB-CHANNEL DOWN TO ZERO         >>   <<03008>>11960000
   <<     BASED ON THE IMB GET THE TEMP INT-MASK WORD     >>   <<03008>>11965000
   <<     IF THE BIT IS SET FOR THE CHANNEL (EXISTS?)     >>   <<03008>>11970000
   <<     THEN INIT THAT CHANNEL                          >>   <<03008>>11975000
                                                               <<03008>>11980000
                                                               <<03008>>11985000
   I := MAXDRT.(7:6); << DELETE DEV# >>                        <<03008>>11990000
   DO BEGIN                                                    <<03008>>11995000
      TOS := TEMPMASK(I.(10:2));  << IMB NR. >>                <<03008>>12000000
      X := I.(12:4);         << CHAN NR. >>                    <<03008>>12005000
      ASSEMBLE( TBC 0,X );                                     <<03008>>12010000
      IF <> THEN                                               <<03008>>12015000
         BEGIN                                                 <<03008>>12020000
         TOS := I&LSL(3);    << ADD DEV NR. >>                 <<03008>>12025000
         ASSEMBLE( INIT );                                     <<03008>>12030000
         END;                                                  <<03008>>12035000
      DEL;                                                     <<03008>>12040000
      I := I-1;                                                <<03008>>12045000
      END UNTIL =;                                             <<03008>>12050000
                                                               <<03008>>12055000
   I := 1;                                                              12060000
   DO                                                                   12065000
   BEGIN << STEP THROUGH LPDT AND CLEAN UP RESOURCES >>                 12070000
      LPDT'INDEX := I * SIZE'OF'LPDT'ENTRY;                    <<06829>>12075000
      TOS := LPDT'DIT'PTR;                                     <<06829>>12080000
    IF NOT LPDT'VIRTUAL'DEVICE  AND (PS0(DILTP) <> 0)          <<*8271>>12085000
       AND ( LPDT'DIT'PTR <> 0 )                               <<*8271>>12090000
                                                               <<*8271>>12095000
      THEN                                                     <<*8271>>12100000
      BEGIN << VALID DIT POINTER >>                                     12105000
         TOS := PS0(DILTP);                                             12110000
         IF GET'DSDEVICE(I) < 2 THEN                           <<01775>>12115000
           BEGIN                <<NOT A DS DEVICE>>           <<01.02>> 12120000
             X := PS0(ICNTRL).CHANQ; << I/O CHANNEL RESOURCE >>         12125000
             IF <> THEN                                       <<01.02>> 12130000
             BEGIN << FREE CHANNEL RESOURCE >>                <<01.02>> 12135000
                BUSY(X) := 0;                                 <<01.02>> 12140000
                WHILE DEQUEUE(DLINK,X) <> -1 DO;              <<01.02>> 12145000
             END;                                             <<01.02>> 12150000
             TOS := PS0(IFLAG);                                         12155000
             TOS := TOS LAND IFLAGMASKWORD; << CLEAR WAIT BIT >>        12160000
             PS1(X) := TOS;  << UPDATE FLAGS OF ILT >>                  12165000
             DEL;  << DELETE ILT POINTER >>                             12170000
             IF PS0.TRM<>1 AND PS0.STATEF = COMPWAIT THEN      <<04424>>12175000
             BEGIN << RESTART THE REQUEST >>                            12180000
                TOS := PS0; << GET DFLAGS FROM DIT >>                   12185000
                TOS.REQUEST := 1;                                       12190000
                TOS.IAK := 1;                                           12195000
                PS1 := TOS;                                             12200000
                PS0(DSTAT):=-1;  <<SET STATUS TO DISC ERROR>>           12205000
                MASTERCLEARHPIB(PS0); << CLEAR I/O CONDITION >><<01301>>12210000
             END;                                                       12215000
           END                                                          12220000
         ELSE DEL; << DELETE ILT POINTER >>                             12225000
      END;                                                              12230000
      DEL;        << Delete DITP from TOS >>                   <<06829>>12235000
   END UNTIL (I := I + 1) > INTEGER(LPDT'MAX'ENTRIES);         <<06829>>12240000
                                                               <<03008>>12245000
IMB := 0;       <<CLEAR TEMPORARY MASK WORDS>>                 <<03008>>12250000
DO TEMPMASK(IMB) := 0                                          <<03008>>12255000
UNTIL (IMB:=IMB+1) > NRIMB;                                    <<03008>>12260000
                                                               <<03008>>12265000
LDEV := 1;     <<LOOP COUNTER>>                                <<03683>>12270000
DO BEGIN    <<RESTART ALL DISC REQUESTS>>                      <<03008>>12275000
   CHECKLDEV(LDEV);                                            <<03008>>12280000
   IF = AND CARRY    <<DISC>>                                  <<03008>>12285000
   THEN BEGIN                                                  <<03008>>12290000
      LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;                 <<06829>>12295000
      TOS := LPDT'DIT'PTR;                                     <<06829>>12300000
      << If state of SIODM is waiting for completion, then >>  <<p7754>>12305000
      << reset the state so it will redo the request.      >>  <<p7754>>12310000
                                                               <<p7754>>12315000
      IF PS0.(12:4) = %13 THEN PS0.(12:4) := 0;                <<p7754>>12320000
      TOS := PS0(DILTP);    <<ILT PTR>>                        <<03008>>12325000
      TOS := PS0(ICNTRL).DRTNUMBER;   <<DRT NO.>>              <<03008>>12330000
      DELB;                 <<DELETE ILT PTR>>                 <<03008>>12335000
                                                               <<03008>>12340000
      CHANNL:= S0.CHAN'NUM;      <<CHANNEL NUMBER>>            <<03008>>12345000
      IMB := TOS.IMB'NUM;   <<IMB NUMBER>>                     <<03008>>12350000
                                                               <<03008>>12355000
      TOS := TEMPMASK(IMB);  <<GET MASK WORD FOR IMB>>         <<03008>>12360000
      X:=CHANNL;                                               <<03008>>12365000
      ASMB( TSBC 0,X);        <<SET BIT FOR CHANNEL>>          <<03008>>12370000
      TEMPMASK(IMB) := TOS;  <<SAVE BACK INTO TEMPMASK>>       <<03008>>12375000
                                                               <<03008>>12380000
      IMB := NRIMB;  <<LOAD TEMPMASK ONTO STACK>>              <<03008>>12385000
      DO TOS := TEMPMASK(IMB)                                  <<03008>>12390000
      UNTIL (IMB:=IMB-1) < 0;                                  <<03008>>12395000
                                                               <<03008>>12400000
      ASMB(SMSK);   <<SET THE MASK>>                           <<03008>>12405000
                                                               <<03008>>12410000
      TOS := 0;                                                <<03008>>12415000
                 << TOS = 0; S-1 = DIT PTR>>                   <<03008>>12420000
      IF PS1.(12:4) <> %14                                     <<p7754>>12425000
         THEN AWAKEIO(*,*)                                     <<p7754>>12430000
      ELSE DDEL;                                               <<p7754>>12435000
   END;  <<ITS A DISC>>                                        <<03008>>12440000
END UNTIL (LDEV := LDEV+1 ) > INTEGER(LPDT'MAX'ENTRIES);       <<06829>>12445000
    <<END OF RESTART ALL DISC REQUESTS>>                       <<03008>>12450000
                                                               <<03008>>12455000
   LYNX'PF'CHECK;     <<FOR ICF'55 LYNX CODE>>                 <<03650>>12460000
    << Clear memory after a Power Fail ...>>                   <<04147>>12465000
    << ... for the MEMLOG process         >>                   <<04147>>12470000
    assemble (PCN);                                            <<04147>>12475000
    if TOS = ICF'55 then begin                                 <<04147>>12480000
     COMMENT : The variable NRIMB is used as a loop index      <<04147>>12485000
       in the following code even though this is not its       <<04147>>12490000
       reason for exsistance. This avoids the dynamic          <<04147>>12495000
       allocation of still another variable;                   <<04147>>12500000
     for *NRIMB   := 0 until 1023 do begin                     <<04147>>12505000
      tos := logical (NRIMB) & lsl(4);                         <<04147>>12510000
      DUPLICATE;                                               <<04147>>12515000
      S1 := [11/0,1/1,4/0];    << write logging RAM >>         <<04147>>12520000
      tos := [6/0,4/%12,       << CSB bus op; Send Word >>     <<04147>>12525000
              3/7,           << CSB address of memory mod >>   <<04147>>12530000
              3/0];            << no reply expected >>         <<04147>>12535000
      MCMD;                                                    <<04147>>12540000
     end     << clear'logging'ram >>                           <<04147>>12545000
    end;                                                       <<04147>>12550000
   ABS(ABSQI-12) := PFAILPIN; << TELL DISP TO AWAKW PF PROCESS >>       12555000
   AWAKE(PFAILPIN,JUNKWAITCODE,NOWAIT);                        <<02833>>12560000
   TRLQTIME := 1; <<SET TIMER FLAG TO GET DISPATCHED>>         <<06827>>12565000
   PF := 3; << THIS WILL CLEAR WRITECHAR IF THERE FROM PREVIOUS PF >>   12570000
   TOS := -1;                                                  <<01183>>12575000
      TOS := DLABEL;                                           <<MPEIV>>12580000
   IF <  THEN  ASMB(PCAL 0);                                   <<01183>>12585000
   ABS(SCSR) := 0;   << CLEAR STATUS REGISTER >>               <<01183>>12590000
   IF CPUNUM = SERIES'33 THEN                                  <<*8289>>12595000
   BEGIN    <<CPU IS A 33>>                                    <<01415>>12600000
      TOS := 1100;   <<DEFAULT VALUE>>                         <<01415>>12605000
      TOS := ABS(17).(1:15);  <<SPECIFIED VALUE>>              <<01415>>12610000
      IF = THEN ASMB (DEL);   <<IF 0, USE DEFAULT>>            <<01415>>12615000
      ASMB (RCCR; DUP);                                        <<01415>>12620000
      ABS(TEMPLR) := TOS;                                      <<01415>>12625000
      ASMB (LADD;SCLR);                                        <<01415>>12630000
   END                                                         <<01415>>12635000
   ELSE                                                        <<01415>>12640000
   IF CPUNUM = ICF'44 OR CPUNUM = ICF'55 THEN                  <<*8289>>12645000
   BEGIN    <<ICF/44 OR ICF/55 CPU>>                           <<01415>>12650000
      TOS := 100;   <<SAME AS ABOVE>>                          <<01415>>12655000
      TOS := ABS(17).(1:15);                                   <<01415>>12660000
      IF = THEN ASMB (DEL);                                    <<01415>>12665000
      ASMB (SCLR);                                             <<01415>>12670000
      ABS(TEMPLR) := 0;                                        <<01415>>12675000
   END;                                                        <<01415>>12680000
   ASMB( TON; SINC );                                          <<*8289>>12685000
   PF := 4;                                                    <<*8289>>12690000
   ASMB( IXIT );                                               <<*8289>>12695000
END;                                                                    12700000
                                                                        12705000
PROCEDURE  CALLHELP;                                                    12710000
   OPTION  PRIVILEGED,UNCALLABLE;                                       12715000
   BEGIN                                                                12720000
   << BUILD A MARKER TO HELP, EXIT THROUGH IT >>                        12725000
   TOS := 0;  << X REGISTER >>                                          12730000
   TOS := F(F(F(0)+@HELP.(8:8)*4).(4:12)*4+F(X:=X+3)-1-@HELP.(1:7));    12735000
   TOS := TOS.(2:14);   << GET RID OF UNCALLABLE BIT >>                 12740000
   IF MAPPINGFIRMWARE THEN TOS.(1:1):=1; << MAPPING FLAG >>    <<06095>>12745000
   PUSH(STATUS);                                                        12750000
   TOS.(8:8) := @HELP;                                                  12755000
   TOS := 4;                                                            12760000
   PUSH(S);                                                             12765000
   SET(Q);                                                              12770000
   END;                                                                 12775000
                                                                        12780000
<< OUTER BLOCK, STT # FOLLOWED BY A CALL TO THE PROCEDURE >>            12785000
ASMB(                                                                   12790000
     CON 1;   PCAL BOUNDSVIOLATION;                                     12795000
     CON 2;   PCAL ILLEGALADDRESS;                                      12800000
     CON 3;    PCAL NONRESPONDINGMODULE;                       <<04793>>12805000
     CON 4;   PCAL GHOST4;                                              12810000
     CON 5;   PCAL GHOST5;                                              12815000
     CON 6;   PCAL DATAPARITY;                                          12820000
     CON 7;   PCAL GHOST7;                                              12825000
     CON 8;   PCAL CALLHELP;                                            12830000
     CON 9;   PCAL POWERFAIL;                                           12835000
     CON 10;  PCAL TEMPWARNINGS;   <<FOR ICF'64>>              <<03094>>12840000
     CON 11;  PCAL EXTGHOST;                                            12845000
     CON 12;  PCAL SYSTEMCLOCK;                                         12850000
     CON 13;  PCAL BREAKPOINT;                                          12855000
     CON 14;  PCAL MMPOWERFAIL;                                <<*8289>>12860000
     CON 15;  PCAL DCULOGGING;   <<FOR SERIES'64>>             <<04184>>12865000
     CON 16;  PCAL UNIMPLEMENTEDINSTRUCTION;                            12870000
     CON 17;  PCAL STTVIOLATION;                                        12875000
     CON 18;  PCAL CSTVIOLATION;                                        12880000
     CON 19;  PCAL DSTVIOLATION;                                        12885000
     CON 20;  PCAL STACKUNDERFLOW;                                      12890000
     CON 21;  PCAL PRIVILEGEDMODEVIOLATION;                             12895000
     CON 22;  PCAL GHOST22;                                             12900000
     CON 23;  PCAL GHOST23;                                             12905000
     CON 24;  PCAL STACKOVERFLOW;                              <<MPEIV>>12910000
     CON 25;  PCAL USERTRAP;                                            12915000
     CON 26;  PCAL GHOST26;                                             12920000
     CON 27;  PCAL GHOST27;                                             12925000
     CON 28;  PCAL GHOST28;                                             12930000
     CON 29;  PCAL GHOST29;                                             12935000
     CON 30;  PCAL GHOST30;                                             12940000
     CON 31;  PCAL CODEABSENCE;                                         12945000
     CON 32;  PCAL TRACE;                                               12950000
     CON 33;  PCAL STTUNCALLABLE;                                       12955000
     CON 34;  PCAL DATAABSENCE;                                         12960000
     CON 35;  PCAL POWERON;                                             12965000
     CON 36;  PCAL GHOST36                                              12970000
);                                                                      12975000
END.                                                                    12980000
