         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
$EDIT VOID = 125000                                            <<R9241>>00090000
$EDIT VOID = 255000                                            <<R9241>>00160000
$EDIT VOID = 300000                                            <<R9241>>00280000
EQUATE VMPAGESIZE=512;  << VMPAGE = 4*MAINMEMPAGES >>          <<D9463>>00320000
<< THE FOLLOWING DEFINES ARE USED TO SUPPORT PRIVILEGED    >>  <<R9241>>00320010
<< MODE BOUNDS CHECKING. GET'XDSEG'LIMITS TRANSFERS THE    >>  <<R9241>>00320020
<< BANK, BASE ADDRESS, AND LIMIT ADDRESS TO ICS QI MINUS   >>  <<R9241>>00320030
<< AREA. THE INDEX REGISTER IS EXPECTED TO BE POINTING TO  >>  <<R9241>>00320040
<< DST ENTRY, WORD 0.                                      >>  <<R9241>>00320050
                                                               <<R9241>>00320060
DEFINE  GET'XDSEG'LIMITS=                                      <<R9241>>00320070
                                                               <<R9241>>00320080
  BEGIN                                                        <<R9241>>00320090
  TOS:= X;                    << SAVE INDEX REG >>             <<R9241>>00320100
  TOS:= DST(X:= X+2);         << GET XDSEG BANK NUM >>         <<R9241>>00320110
  TOS:= DST(X:= X+1);         << GET XDSEG BASE ADDR >>        <<R9241>>00320120
  ASMB(DUP);                  << COPY XDSEG BASE ADDR >>       <<R9241>>00320130
  TOS:= (DST(X:= X-3).(3:13) & LSL(2)) + TOS;                  <<R9241>>00320140
  ICS(- ICS'XDSEGLIMCELL):= TOS;    << ICS GETS XDSEG LIMT >>  <<R9241>>00320150
  ICS(- ICS'XDSEGBASECELL):= TOS;   << ICS GETS XDSEG BASE >>  <<R9241>>00320160
  ICS(- ICS'XDSEGBNKCELL):= TOS;    << ICS GETS XDSEG BANK >>  <<R9241>>00320170
  X:= TOS;                          << RESTORE INDEX REG. >>   <<R9241>>00320180
  END#;                                                        <<R9241>>00320190
                                                               <<R9241>>00320200
DEFINE  XFER'XDSEG'LIMITS=                                     <<R9241>>00320210
                                                               <<R9241>>00320220
  TOS:= 2;                                                     <<R9241>>00320230
  ASMB(SBL)#;                     << CPU REG GET XDSEG INFO >> <<R9241>>00320240
                                                               <<R9241>>00320250
DEFINE   CPUNUM= ASMB(PCN)#,         << GET CPU NUMBER >>      <<R9241>>00320260
         SBF   = CON %20104, %11#,   << SET BOUNDS FLAG >>     <<R9241>>00320270
         SBL   = CON %20104, %12#;   << SET BOUNDS LIMITS >>   <<R9241>>00320280
                                                               <<R9241>>00320290
DEFINE PMBCFIRMWARE = ABS(%1220).(14:1)#;                      <<*9382>>00320300
                                                               <<R9241>>00320310
       ICSIX=7,                                                <<R9241>>00371000
INTEGER POINTER ICS=ICSIX;                                     <<R9241>>00375500
EQUATE SYSMAPPINGFIRMWARE = SYSBASE+%220;                      <<R9241>>00376000
EQUATE DFCIX=%32,                                              <<R9241>>00376100
       SYSDFC=SYSBASE+DFCIX;                                   <<R9241>>00376200
EQUATE DISPAWAKEMSGIX=%50;                                     <<R9241>>00376300
LOGICAL DISPTOAWAKEMSG=DB+DISPAWAKEMSGIX;                      <<R9241>>00376400
EQUATE DFSIX=%33,                                              <<R9241>>00377000
       SYSDFX=SYSBASE+DFSIX;                                   <<R9241>>00378000
EQUATE WRITEREQ=1;   <<FUNCTION CODE>>                         <<R9241>>00379000
                                                               <<R9241>>00415100
EQUATE                                                         <<R9241>>00415200
   UGLYPSEUDOINT  = 4,                                         <<R9241>>00415300
   MAXMSGLEN      = 4,                                         <<R9241>>00415400
   DELETEMSG      = 0,                                         <<R9241>>00415500
   SAVEMSG        = %100000;                                   <<R9241>>00415600
                                                               <<R9241>>00415700
                                                               <<R9241>>00415800
                                                               <<R9241>>00415900
EQUATE  <<MMSTAT MMSTATE PSEUDO-INTERRUPT NUMBERS>>            <<R9241>>00416000
   HARDKILLER      = 0,                                        <<R9241>>00416100
   SOFTKILLER      = 1,                                        <<R9241>>00416200
   CONTROLY        = 2,                                        <<R9241>>00416300
   BREAKER         = 3,                                        <<R9241>>00416400
   SYSOFTINT       = 4,                                        <<R9241>>00416500
   USERSOFTINT     = 5;                                        <<R9241>>00416600
                                                               <<R9241>>00416700
EQUATE  <<PSEUDO-INTERRUPT VALUES>>                            <<R9241>>00416800
   HARDKILLVALUE  = 1,                                         <<R9241>>00416900
   SOFTKILLVALUE  = 2,                                         <<R9241>>00417000
   STOPVALUE      = 3,                                         <<R9241>>00417100
   HYBERNATEVALUE = 4,                                         <<R9241>>00417200
   CONTROLYVALUE  = 5,                                         <<R9241>>00417300
   BREAKVALUE     = 6,                                         <<R9241>>00417400
   NORMALVALUE    = 7;                                         <<R9241>>00417500
                                                               <<R9241>>00417600
EQUATE  <<RETURN VALUES OF TIMEOUT PROCEDURE>>                 <<R9241>>00417700
   TIMEOUTOCCURRED= 0,                                         <<R9241>>00417800
   TRLXEXHAUSTED  = 1,                                         <<R9241>>00417900
   SOFTINTOCCURRED= 2;                                         <<R9241>>00418000
                                                               <<R9241>>00418100
EQUATE                                                         <<R9241>>00418200
   USERMSGPORT    = 1,                                         <<R9241>>00418300
   SYSTEMSGPORT   = 2;                                         <<R9241>>00418400
                                                               <<R9241>>00418500
ARRAY STACK(*)=Q+0,QARRAY(*)=Q+0;                              <<R9241>>00418510
                                                               <<R9241>>00418520
DEFINE GLOBALTRACEFLAG = ABSOLUTE(%1267)#;                     <<R9241>>00418530
DEFINE MAPPINGFIRMWARE = ABS(SYSMAPPINGFIRMWARE)#;             <<R9241>>00418540
   DEFINE FREE'PHY'CST'HEAD = ABSOLUTE (%1225)#,               <<R9241>>00418550
          TOTAL'PHY'CST'NUM = ABSOLUTE (%1224)#;               <<R9241>>00418560
   EQUATE CSTSIZE = 4;                                         <<R9241>>00418570
COMMENT                                                        <<R9241>>00418580
STANDARD SYSTEM TABLES ENTRY ALLOCATION                        <<R9241>>00418590
;                                                              <<R9241>>00418600
                                                               <<R9241>>00418610
LOGICAL ARRAY SYSTABENTRY(*) = DB + 0;                         <<R9241>>00418620
DOUBLE ARRAY DSYSTABENTRY01(*) = DB + 1;                       <<R9241>>00418630
LOGICAL ARRAY SYSTABENTRY00(*)=DB+0,                           <<R9241>>00418640
              SYSTABENTRY01(*)=DB+1,                           <<R9241>>00418650
              SYSTABENTRY02(*)=DB+2,                           <<R9241>>00418660
              SYSTABENTRY03(*)=DB+3,                           <<R9241>>00418670
              SYSTABENTRY04(*)=DB+4,                           <<R9241>>00418680
              SYSTABENTRY05(*)=DB+5,                           <<R9241>>00418690
              SYSTABENTRY16(*)=DB+16;                          <<R9241>>00418700
                                                               <<R9241>>00418710
DEFINE ENTRYWORD00=SYSTABENTRY00(X)#,                          <<R9241>>00418720
       ENTRYWORD01=SYSTABENTRY01(X)#,                          <<R9241>>00418730
       DENTRYWORD01=DSYSTABENTRY01(X)#,                        <<R9241>>00418740
       ENTRYWORD02=SYSTABENTRY02(X)#,                          <<R9241>>00418750
       ENTRYWORD03=SYSTABENTRY03(X)#,                          <<R9241>>00418760
       ENTRYWORD04=SYSTABENTRY04(X)#,                          <<R9241>>00418770
       ENTRYWORD05=SYSTABENTRY05(X)#;                          <<R9241>>00418780
                                                               <<R9241>>00418790
DEFINE UPDATE'ICS'XDSEGBNKCELL =                               <<R9241>>00419100
       BEGIN                                                   <<R9241>>00419200
       ABSOLUTE(ABSOLUTE (5)-ICS'XDSEGBNKCELL) := -1;          <<R9241>>00419300
       XFER'XDSEG'LIMITS;                                      <<R9241>>00419400
       END#;                                                   <<R9241>>00419500
$INCLUDE INCLMEAS                                              <<R9241>>00446200
$INCLUDE INCLICS                                               <<R9241>>00446300
$INCLUDE INCLMSG                                               <<R9241>>00446400
$INCLUDE INCLMIFT                                              <<R9241>>00446500
$INCLUDE INCLSIR                                               <<R9241>>00446600
$INCLUDE INCLTRL                                               <<R9241>>00446700
$INCLUDE INCLPARM                                              <<R9241>>00446800
$INCLUDE INCLREG                                               <<R9241>>00447100
$INCLUDE INCLSTDD                                              <<R9241>>00447200
$INCLUDE INCSYTAB                                              <<R9241>>00447300
$INCLUDE INCLSF                                                <<R9241>>00447400
$INCLUDE INCLPXFT                                              <<R9241>>00447500
$INCLUDE INCLMMST                                              <<R9241>>00447600
$INCLUDE INCLPXDL                                              <<R9241>>00447800
$EDIT VOID = 470000                                            <<R9241>>00455000
OPTION FORWARD;                                                <<R9241>>00690000
$EDIT VOID = 770000                                            <<R9241>>00750000
OPTION FORWARD;                                                <<R9241>>00815000
                                                               <<R9241>>00816100
PROCEDURE SOFT'DEATH(WHICH);                                   <<R9241>>00816200
   VALUE WHICH;                                                <<R9241>>00816300
   INTEGER WHICH;                                              <<R9241>>00816400
   OPTION EXTERNAL;                                            <<R9241>>00816500
                                                               <<R9241>>00816600
PROCEDURE SENDMSG(DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS);        <<R9241>>00816700
VALUE DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS;                     <<R9241>>00816800
INTEGER DESTPIN,DESTPORTNUM,MSGLENGTH;                         <<R9241>>00816900
LOGICAL FLAGS;                                                 <<R9241>>00817000
OPTION EXTERNAL;                                               <<R9241>>00817100
PROCEDURE ABORTTIMEREQ(TRLX);                                  <<R9241>>00817110
VALUE TRLX;                                                    <<R9241>>00817120
INTEGER TRLX;                                                  <<R9241>>00817130
OPTION EXTERNAL;                                               <<R9241>>00817140
                                                               <<R9241>>00817150
DOUBLE PROCEDURE P'ATTACHIO(LDEV,QMISC,DSTX,ADDR,FNCT,CNT,     <<R9241>>00817160
P1,P2,FLAGS,EXTBASE,EXTSIZE);                                  <<R9241>>00817170
VALUE LDEV,QMISC,DSTX,ADDR,FNCT,CNT,P1,P2,FLAGS,EXTBASE,       <<R9241>>00817180
EXTSIZE;                                                       <<R9241>>00817190
INTEGER LDEV,QMISC,DSTX,ADDR,FNCT,CNT,P1,P2,FLAGS;             <<R9241>>00817191
DOUBLE EXTBASE;                                                <<R9241>>00817192
LOGICAL EXTSIZE;                                               <<R9241>>00817193
OPTION PRIVILEGED,EXTERNAL,VARIABLE;                           <<R9241>>00817194
                                                               <<R9241>>00817195
                                                               <<R9241>>00817200
LOGICAL PROCEDURE CHEKTRLFREE;                                 <<R9241>>00817210
OPTION EXTERNAL;                                               <<R9241>>00817220
                                                               <<R9241>>00817230
INTEGER PROCEDURE TIMEREQ(C,R,T);                              <<R9241>>00817240
VALUE C,R,T;                                                   <<R9241>>00817250
INTEGER C,R;                                                   <<R9241>>00817260
DOUBLE T;                                                      <<R9241>>00817270
OPTION EXTERNAL;                                               <<R9241>>00817280
                                                               <<R9241>>00817290
INTEGER PROCEDURE PORTSTATUS(PORTNUMBER);                      <<R9241>>00817300
VALUE PORTNUMBER;                                              <<R9241>>00817400
INTEGER PORTNUMBER;                                            <<R9241>>00817500
OPTION EXTERNAL;                                               <<R9241>>00817600
                                                               <<R9241>>00817700
PROCEDURE RECEIVEMSG(PORTNUM,MSGLENGTH,FLAGS);                 <<R9241>>00817800
VALUE PORTNUM,MSGLENGTH,FLAGS;                                 <<R9241>>00817900
INTEGER PORTNUM,MSGLENGTH;                                     <<R9241>>00818000
LOGICAL FLAGS;                                                 <<R9241>>00818100
OPTION EXTERNAL;                                               <<R9241>>00818200
                                                               <<R9241>>00818300
PROCEDURE DEBUG;                                               <<R9241>>00818310
OPTION EXTERNAL;                                               <<R9241>>00818320
                                                               <<R9241>>00818330
PROCEDURE PORTSEG'COMPLETOR(REQ'ID);                           <<R9241>>00818400
VALUE REQ'ID;                                                  <<R9241>>00818500
INTEGER REQ'ID;                                                <<R9241>>00818600
OPTION EXTERNAL;                                               <<R9241>>00818700
PROCEDURE FCPREPAFT(REPLYPORT,FILENUM);                        <<R9241>>00818710
VALUE REPLYPORT,FILENUM;                                       <<R9241>>00818720
INTEGER REPLYPORT,FILENUM;                                     <<R9241>>00818730
OPTION EXTERNAL;                                               <<R9241>>00818740
                                                               <<R9241>>00818750
                                                               <<R9241>>00818800
DOUBLE PROCEDURE BUILDSEGID(SEGTYPE,SEGNO,PIN);                <<R9241>>00821100
VALUE SEGTYPE,SEGNO,PIN;                                       <<R9241>>00821200
INTEGER SEGTYPE,SEGNO,PIN;                                     <<R9241>>00821300
OPTION FORWARD;                                                <<R9241>>00821400
                                                               <<R9241>>00821500
INTEGER PROCEDURE CONVSEGIDTOSTINX(SEGID);                     <<R9241>>00821600
VALUE SEGID;                                                   <<R9241>>00821700
DOUBLE SEGID;                                                  <<R9241>>00821800
OPTION FORWARD;                                                <<R9241>>00821900
                                                               <<R9241>>00822000
INTEGER PROCEDURE CSTCONV(PLABEL,PCBPT);                       <<R9241>>00822100
VALUE PLABEL,PCBPT;                                            <<R9241>>00822200
INTEGER PLABEL,PCBPT;                                          <<R9241>>00822300
OPTION FORWARD;                                                <<R9241>>00822400
                                                               <<R9241>>00822500
PROCEDURE RESETDB(WHERE);                                      <<R9241>>00822600
VALUE WHERE;                                                   <<R9241>>00822700
INTEGER WHERE;                                                 <<R9241>>00822800
OPTION FORWARD;                                                <<R9241>>00822900
                                                               <<R9241>>00823000
LOGICAL PROCEDURE EXCHANGEDB(WHERE);                           <<R9241>>00823100
VALUE WHERE;                                                   <<R9241>>00823200
INTEGER WHERE;                                                 <<R9241>>00823300
OPTION FORWARD;                                                <<R9241>>00823400
                                                               <<R9241>>00823500
LOGICAL PROCEDURE SETSYSDB;                                    <<R9241>>00823600
OPTION FORWARD;                                                <<R9241>>00823700
                                                               <<R9241>>00823701
PROCEDURE RECOVEROC(OBJ,SEGDESCSTINX,OCREGIONBASE);            <<R9241>>00823710
VALUE OBJ,SEGDESCSTINX,OCREGIONBASE;                           <<R9241>>00823720
DOUBLE OCREGIONBASE,OBJ;                                       <<R9241>>00823730
INTEGER SEGDESCSTINX;                                          <<R9241>>00823740
OPTION EXTERNAL;                                               <<R9241>>00823750
                                                               <<R9241>>00823760
                                                               <<R9241>>00823800
PROCEDURE MMSTAT'(EVENT,P1,P2,P3,P4,P5,P6);                    <<R9241>>00823900
VALUE EVENT,P1,P2,P3,P4,P5,P6;                                 <<R9241>>00824000
INTEGER EVENT,P1,P2,P3,P4,P5,P6;                               <<R9241>>00824100
OPTION EXTERNAL;                                               <<R9241>>00824200
                                                               <<R9241>>00824300
PROCEDURE UNIMPEDE(PCBPT);                                     <<R9241>>00824400
VALUE PCBPT;                                                   <<R9241>>00824500
INTEGER PCBPT;                                                 <<R9241>>00824600
OPTION EXTERNAL;                                               <<R9241>>00824700
                                                               <<R9241>>00824800
PROCEDURE QUEUEONOBJECT(OBJ);                                  <<R9241>>00824900
VALUE OBJ;                                                     <<R9241>>00824910
DOUBLE OBJ;                                                    <<R9241>>00824920
OPTION EXTERNAL;                                               <<R9241>>00824930
                                                               <<R9241>>00824940
PROCEDURE QUEUEPROC(PROCSYSDBINX,QUEUENAME,LOCATION);          <<R9241>>00824950
VALUE PROCSYSDBINX,QUEUENAME,LOCATION;                         <<R9241>>00824960
INTEGER PROCSYSDBINX,QUEUENAME,LOCATION;                       <<R9241>>00824970
OPTION EXTERNAL;                                               <<R9241>>00824980
                                                               <<R9241>>00824990
   <<@@@ Correct the lower bound of the comparison test   @@@>><<D9463>>02046000
   <<@@@ from 0 to 1 because DST 0 is also an invalid DST.@@@>><<D9463>>02047000
   IF ( 1 <= DSTN <= DST(0) ) THEN                             <<D9463>>02050000
            <<@@@  Change the VM size from pages to words @@@>><<D9463>>02066000
            MAX'DST'SIZE :=                                    <<D9463>>02070000
                DST(DSTN&LSL(2)+1).VMALLOC * VMPAGESIZE        <<D9463>>02071000
$PAGE "STANDARD SYSTEM TABLE ENTRY MANAGEMENT"                 <<R9241>>02445000
                                                               <<R9241>>02450000
LOGICAL PROCEDURE GETSYSTABENTRY(TABLEDST,PRIMARY,WAIT);       <<R9241>>02455000
VALUE TABLEDST,PRIMARY,WAIT;                                   <<R9241>>02460000
LOGICAL TABLEDST,PRIMARY,WAIT;                                 <<R9241>>02465000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>02470000
BEGIN                                                          <<R9241>>02475000
                                                               <<R9241>>02480000
LOGICAL                                                        <<R9241>>02485000
   RETURNVALUE = GETSYSTABENTRY,                               <<R9241>>02490000
   PREV,                                                       <<R9241>>02495000
   NEXT,                                                       <<R9241>>02500000
   ENTRIESUSED,                                                <<R9241>>02505000
   ABSOLUTE'DB,                                                <<R9241>>02510000
   UCODE'KNOWN'TABLE,                                          <<R9241>>02515000
   PCBPT,                                                      <<R9241>>02520000
   NUM'FREE'ENTRIES,                                           <<R9241>>02525000
   SECONDARY'IS'FULL,                                          <<R9241>>02530000
   SEGMENT'WAS'ABSENT,                                         <<R9241>>02535000
   ORIGINAL'DST,                                               <<R9241>>02540000
   ENTRYSIZE;                                                  <<R9241>>02545000
DOUBLE                                                         <<R9241>>02550000
   SAVEDB;                                                     <<R9241>>02555000
                                                               <<R9241>>02560000
                                                               <<R9241>>02565000
<< SEE IF SEGMENT IS PRESENT >>                                <<R9241>>02570000
                                                               <<R9241>>02575000
                                                               <<R9241>>02580000
IF NOT LOGICAL(DST(TABLEDST&LSL(2)+1)).SEGRESIDENTFLAG         <<R9241>>02585000
    THEN SUDDENDEATH(605);                                     <<R9241>>02590000
DISABLE;                                                       <<R9241>>02595000
PCBPT := CURPRC;                                               <<R9241>>02600000
SEGMENT'WAS'ABSENT := LOGICAL(DST(TABLEDST&LSL(2))).ABSENTFLAG;<<R9241>>02605000
ABSOLUTE'DB := DBXDSINFO.ABSDBFLAG;                            <<R9241>>02610000
<< PUT DB AT THAT SEGMENT >>                                   <<R9241>>02615000
IF SEGMENT'WAS'ABSENT THEN                                     <<R9241>>02620000
   BEGIN                                                       <<R9241>>02625000
   IF CURPRC = 0 THEN                                          <<R9241>>02630000
      SUDDENDEATH(900);                                        <<R9241>>02635000
   IF ABSOLUTE'DB THEN                                         <<R9241>>02640000
      BEGIN                                                    <<R9241>>02645000
      PUSH(DB);                                                <<R9241>>02650000
      SAVEDB := TOS;                                           <<R9241>>02655000
      RESETDB(-1);                                             <<R9241>>02660000
      END;                                                     <<R9241>>02665000
   ORIGINAL'DST := EXCHANGEDB(TABLEDST);                       <<R9241>>02670000
   END                                                         <<R9241>>02675000
ELSE                                                           <<R9241>>02680000
   BEGIN                                                       <<R9241>>02685000
   TOS := DST(TABLEDST&LSL(2) + 2); << BANK >>                 <<R9241>>02690000
   TOS := DST(X + 1); << ADDRESS >>                            <<R9241>>02695000
   ASMB(XCHD);                                                 <<R9241>>02700000
   SAVEDB := TOS;                                              <<R9241>>02705000
   END;                                                        <<R9241>>02710000
AGAIN :                                                        <<R9241>>02715000
                                                               <<R9241>>02720000
   X := 0; << FOR ADDRESSING DB DIRECT INDEXED >>              <<R9241>>02725000
   ENTRYSIZE := SYSTABENTRYSIZE;                               <<R9241>>02730000
   UCODE'KNOWN'TABLE:=TABLEDST=DSTDST LOR TABLEDST=CSTDST;     <<R9241>>02735000
   SECONDARY'IS'FULL := IF NOT UCODE'KNOWN'TABLE AND           <<R9241>>02740000
                          SYSTABFREECNT <= SYSTABPRIMARYNUM    <<R9241>>02745000
                        THEN TRUE ELSE FALSE;                  <<R9241>>02750000
   NUM'FREE'ENTRIES := SYSTABFREECNT - 1;                      <<R9241>>02755000
   IF < AND (PRIMARY LOR UCODE'KNOWN'TABLE) OR                 <<R9241>>02760000
      SECONDARY'IS'FULL AND NOT PRIMARY AND NOT WAIT THEN      <<R9241>>02765000
      BEGIN                                                    <<R9241>>02770000
      GETSYSTABENTRY := 0                                      <<R9241>>02775000
      END                                                      <<R9241>>02780000
   ELSE                                                        <<R9241>>02785000
      BEGIN                                                    <<R9241>>02790000
      IF NOT UCODE'KNOWN'TABLE THEN                            <<R9241>>02795000
         BEGIN                                                 <<R9241>>02800000
         IF NOT PRIMARY THEN                                   <<R9241>>02805000
            IF SECONDARY'IS'FULL THEN                          <<R9241>>02810000
               BEGIN                                           <<R9241>>02815000
               IF SYSTABIMPHEADINX = 0 THEN << FIRST TIME >>   <<R9241>>02820000
                  BEGIN                                        <<R9241>>02825000
                  PIMPPIN := 0;                                <<R9241>>02830000
                  NIMPPIN := 0;                                <<R9241>>02835000
                  X := 0;                                      <<R9241>>02840000
                  SYSTABIMPHEADINX := PCBPT;                   <<R9241>>02845000
                  END                                          <<R9241>>02850000
               ELSE                                            <<R9241>>02855000
                  BEGIN                                        <<R9241>>02860000
                  NIMPPIN := 0;                                <<R9241>>02865000
                  PIMPPIN := SYSTABIMPTAIL;                    <<R9241>>02870000
                  TOS := PCBPT;                                <<R9241>>02875000
                  PCBPT := SYSTABIMPTAIL;                      <<R9241>>02880000
                  NIMPPIN := S0;                               <<R9241>>02885000
                  PCBPT := TOS;                                <<R9241>>02890000
                  END;                                         <<R9241>>02895000
               X := 0;                                         <<R9241>>02900000
               SYSTABIMPTAILINX := PCBPT;                      <<R9241>>02905000
               SYSTABIMPCURRENTNUM := SYSTABIMPCURRENTNUM+1;   <<R9241>>02910000
               SYSTABIMPCUM := SYSTABIMPCUM + 1;               <<R9241>>02915000
               IF SYSTABIMPCURRENTNUM > SYSTABIMPMAX THEN      <<R9241>>02920000
                  SYSTABIMPMAX := SYSTABIMPCURRENTNUM;         <<R9241>>02925000
               IMPEDE(0);                                      <<R9241>>02930000
               IF NOT SEGMENT'WAS'ABSENT THEN                  <<R9241>>02935000
                  BEGIN << PUT DB BACK, DSP PUT US AT STACK >> <<R9241>>02940000
                  TOS := DST(TABLEDST&LSL(2) + 2);             <<R9241>>02945000
                  TOS := DST(X + 1);                           <<R9241>>02950000
                  ASMB(XCHD);                                  <<R9241>>02955000
                  DDEL;                                        <<R9241>>02960000
                  X := 0;                                      <<R9241>>02965000
                  END;                                         <<R9241>>02970000
               GO AGAIN;                                       <<R9241>>02975000
               END;<<CASE OF NOT HAVING SECONDARY ENTRIES>>    <<R9241>>02980000
         END; << CASE OF NON SPECIAL PRIMARY/SECONDARY REQS >> <<R9241>>02985000
      SYSTABFREECNT := SYSTABFREECNT - 1;                      <<R9241>>02990000
      GETSYSTABENTRY := X := SYSTABFIRSTFREEINX;               <<R9241>>02995000
      IF X = 0 THEN SUDDENDEATH(605);                          <<R9241>>03000000
      NEXT := SYSTABENTRYNEXTFREEINX;                          <<R9241>>03005000
      IF NEXT = 0 AND NUM'FREE'ENTRIES > 0 THEN                <<R9241>>03010000
         SUDDENDEATH(605);                                     <<R9241>>03015000
      SYSTABENTRY00(X) := 0;                                   <<R9241>>03020000
      X := 0;                                                  <<R9241>>03025000
      SYSTABFIRSTFREEINX := NEXT;                              <<R9241>>03030000
      IF NOT UCODE'KNOWN'TABLE THEN                            <<R9241>>03035000
         BEGIN                                                 <<R9241>>03040000
         IF NEXT = 0 THEN                                      <<R9241>>03045000
            SYSTABLASTFREEINX := 0;                            <<R9241>>03050000
         ENTRIESUSED := SYSTABENTRYCOUNT - SYSTABFREECNT;      <<R9241>>03055000
         IF ENTRIESUSED > SYSTABMOSTUSED THEN                  <<R9241>>03060000
            SYSTABMOSTUSED := ENTRIESUSED;                     <<R9241>>03065000
         END;                                                  <<R9241>>03070000
      << ZERO OUT THE ENTRY >>                                 <<R9241>>03075000
      TOS := RETURNVALUE + 1;                                  <<R9241>>03080000
      TOS := RETURNVALUE;                                      <<R9241>>03085000
      TOS := ENTRYSIZE - 1;                                    <<R9241>>03090000
      ASMB(MOVE);                                              <<R9241>>03095000
                                                               <<R9241>>03100000
      END; << CASE OF NOT HAVING ENTRIES >>                    <<R9241>>03105000
                                                               <<R9241>>03110000
IF SEGMENT'WAS'ABSENT THEN                                     <<R9241>>03115000
   BEGIN                                                       <<R9241>>03120000
   RESETDB(ORIGINAL'DST);                                      <<R9241>>03125000
   IF ABSOLUTE'DB THEN                                         <<R9241>>03130000
      BEGIN                                                    <<R9241>>03135000
      SETSYSDB;                                                <<R9241>>03140000
      TOS := SAVEDB;                                           <<R9241>>03145000
      ASMB(XCHD);                                              <<R9241>>03150000
      DDEL;                                                    <<R9241>>03155000
      END;                                                     <<R9241>>03160000
   END                                                         <<R9241>>03165000
ELSE                                                           <<R9241>>03170000
   BEGIN                                                       <<R9241>>03175000
   TOS := SAVEDB;                                              <<R9241>>03180000
   ASMB(XCHD);                                                 <<R9241>>03185000
   END;                                                        <<R9241>>03190000
                                                               <<R9241>>03195000
END; << PROCEDURE GETSYSTABENTRY >>                            <<R9241>>03200000
$PAGE                                                          <<R9241>>03205000
INTEGER PROCEDURE GET'PHY'CST;                                 <<R9241>>03210000
   OPTION UNCALLABLE;                                          <<R9241>>03215000
                                                               <<R9241>>03220000
BEGIN                                                          <<R9241>>03225000
                                                               <<R9241>>03230000
   INTEGER ENTRYINDEX;                                         <<R9241>>03235000
                                                               <<R9241>>03240000
   DISABLE;                                                    <<R9241>>03245000
                                                               <<R9241>>03250000
   IF FREE'PHY'CST'HEAD = 0 THEN                               <<R9241>>03255000
      BEGIN                                                    <<R9241>>03260000
         GET'PHY'CST := 0;  << NO CST AVAILABLE >>             <<R9241>>03265000
         RETURN;                                               <<R9241>>03270000
      END;                                                     <<R9241>>03275000
                                                               <<R9241>>03280000
   ENTRYINDEX := FREE'PHY'CST'HEAD;                            <<R9241>>03285000
   FREE'PHY'CST'HEAD := SL(ENTRYINDEX+1);                      <<R9241>>03290000
   SL(ENTRYINDEX) := 0;    << ZERO OUT ENTRY >>                <<R9241>>03295000
   SL(X:=X+1) := 0;                                            <<R9241>>03300000
   SL(X:=X+1) := 0;                                            <<R9241>>03305000
   SL(X:=X+1) := 0;                                            <<R9241>>03310000
   GET'PHY'CST := ENTRYINDEX/CSTSIZE;                          <<R9241>>03315000
END;                                                           <<R9241>>03320000
PROCEDURE REL'PHY'CST (PHYCST);                                <<R9241>>03325000
   VALUE PHYCST;                                               <<R9241>>03330000
   INTEGER PHYCST;                                             <<R9241>>03335000
   OPTION UNCALLABLE;                                          <<R9241>>03340000
                                                               <<R9241>>03345000
BEGIN                                                          <<R9241>>03350000
                                                               <<R9241>>03355000
   INTEGER ENTRYINDEX;                                         <<R9241>>03360000
                                                               <<R9241>>03365000
   DISABLE;                                                    <<R9241>>03370000
                                                               <<R9241>>03375000
   ENTRYINDEX := PHYCST*CSTSIZE;                               <<R9241>>03380000
   IF PHYCST > TOTAL'PHY'CST'NUM OR                            <<R9241>>03385000
      SL(ENTRYINDEX) = %100000 THEN                            <<R9241>>03390000
         SUDDENDEATH (603);                                    <<R9241>>03395000
   SL(ENTRYINDEX) := %100000;                                  <<R9241>>03400000
   SL(ENTRYINDEX+1) := FREE'PHY'CST'HEAD;                      <<R9241>>03405000
   SL(ENTRYINDEX+2) := 0;                                      <<R9241>>03410000
   SL(ENTRYINDEX+3) := 0;                                      <<R9241>>03415000
   FREE'PHY'CST'HEAD := ENTRYINDEX;                            <<R9241>>03420000
END;                                                           <<R9241>>03425000
$PAGE                                                          <<R9241>>03430000
PROCEDURE RELSYSTABENTRY(TABLEDST,ENTRYINDEX);                 <<R9241>>03435000
VALUE TABLEDST,ENTRYINDEX;                                     <<R9241>>03440000
LOGICAL TABLEDST,ENTRYINDEX;                                   <<R9241>>03445000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>03450000
                                                               <<R9241>>03455000
BEGIN                                                          <<R9241>>03460000
                                                               <<R9241>>03465000
LOGICAL                                                        <<R9241>>03470000
   PCBPT,                                                      <<R9241>>03475000
   OLDTAIL,                                                    <<R9241>>03480000
   OLDIMPHEAD,                                                 <<R9241>>03485000
   ABSOLUTE'DB,                                                <<R9241>>03490000
   SEGMENT'WAS'ABSENT := FALSE,                                <<R9241>>03495000
   OLDHEAD,                                                    <<R9241>>03500000
   ORIGINAL'DST,                                               <<R9241>>03505000
   ENTRYSIZE;                                                  <<R9241>>03510000
DOUBLE                                                         <<R9241>>03515000
   SAVEDB;                                                     <<R9241>>03520000
<< SEE IF SEGMENT IS PRESENT >>                                <<R9241>>03525000
                                                               <<R9241>>03530000
IF ENTRYINDEX = 0 THEN HELP;                                   <<R9241>>03535000
IF NOT LOGICAL(DST(TABLEDST&LSL(2)+1)).SEGRESIDENTFLAG         <<R9241>>03540000
    THEN SUDDENDEATH(605);                                     <<R9241>>03545000
DISABLE;                                                       <<R9241>>03550000
PCBPT := CURPRC;                                               <<R9241>>03555000
SEGMENT'WAS'ABSENT := LOGICAL(DST(TABLEDST&LSL(2))).ABSENTFLAG;<<R9241>>03560000
ABSOLUTE'DB := DBXDSINFO.ABSDBFLAG;                            <<R9241>>03565000
<< PUT DB AT THAT SEGMENT >>                                   <<R9241>>03570000
IF SEGMENT'WAS'ABSENT THEN                                     <<R9241>>03575000
   BEGIN                                                       <<R9241>>03580000
   IF CURPRC = 0 THEN                                          <<R9241>>03585000
      SUDDENDEATH(900);                                        <<R9241>>03590000
   IF ABSOLUTE'DB THEN                                         <<R9241>>03595000
      BEGIN                                                    <<R9241>>03600000
      PUSH(DB);                                                <<R9241>>03605000
      SAVEDB := TOS;                                           <<R9241>>03610000
      RESETDB(-1);                                             <<R9241>>03615000
      END;                                                     <<R9241>>03620000
   ORIGINAL'DST := EXCHANGEDB(TABLEDST);                       <<R9241>>03625000
   END                                                         <<R9241>>03630000
ELSE                                                           <<R9241>>03635000
   BEGIN                                                       <<R9241>>03640000
   TOS := DST(TABLEDST&LSL(2) + 2); << BANK >>                 <<R9241>>03645000
   TOS := DST(X + 1); << ADDRESS >>                            <<R9241>>03650000
   ASMB(XCHD);                                                 <<R9241>>03655000
   SAVEDB := TOS;                                              <<R9241>>03660000
   END;                                                        <<R9241>>03665000
                                                               <<R9241>>03670000
X := 0;                                                        <<R9241>>03675000
ENTRYSIZE := SYSTABENTRYSIZE;                                  <<R9241>>03680000
IF ENTRYINDEX <= 0 OR                                          <<R9241>>03685000
   (ENTRYINDEX > (ENTRYSIZE*SYSTABCONFCOUNT(X))) THEN          <<R9241>>03690000
   SUDDENDEATH(603);                                           <<R9241>>03695000
SYSTABFREECNT := SYSTABFREECNT + 1;                            <<R9241>>03700000
IF TABLEDST = DSTDST OR TABLEDST = CSTDST THEN                 <<R9241>>03705000
   BEGIN                                                       <<R9241>>03710000
   OLDHEAD := SYSTABFIRSTFREEINX;                              <<R9241>>03715000
   IF OLDHEAD = 0 AND SYSTABFREECOUNT > 1 THEN                 <<R9241>>03720000
      SUDDENDEATH(605);                                        <<R9241>>03725000
   SYSTABFIRSTFREEINX := ENTRYINDEX;                           <<R9241>>03730000
   X := ENTRYINDEX;                                            <<R9241>>03735000
   SYSTABENTRYNEXTFREEINX := OLDHEAD;                          <<R9241>>03740000
   SYSTABFREEINDICATOR := %100000;                             <<R9241>>03745000
   END                                                         <<R9241>>03750000
ELSE                                                           <<R9241>>03755000
   BEGIN                                                       <<R9241>>03760000
   X := 0;                                                     <<R9241>>03765000
   OLDTAIL := SYSTABLASTFREEINX;                               <<R9241>>03770000
   SYSTABLASTFREEINX := ENTRYINDEX;                            <<R9241>>03775000
   IF OLDTAIL = 0 THEN                                         <<R9241>>03780000
      BEGIN << TABLE WAS EMPTY >>                              <<R9241>>03785000
      SYSTABFIRSTFREEINX := ENTRYINDEX;                        <<R9241>>03790000
      X := ENTRYINDEX;                                         <<R9241>>03795000
      SYSTABENTRYNEXTFREEINX := 0;                             <<R9241>>03800000
      END                                                      <<R9241>>03805000
   ELSE                                                        <<R9241>>03810000
      BEGIN                                                    <<R9241>>03815000
      X := OLDTAIL;                                            <<R9241>>03820000
      SYSTABENTRYNEXTFREEINX := ENTRYINDEX;                    <<R9241>>03825000
      X := ENTRYINDEX;                                         <<R9241>>03830000
      SYSTABENTRYNEXTFREEINX := 0;                             <<R9241>>03835000
      END;                                                     <<R9241>>03840000
   X := 0;                                                     <<R9241>>03845000
   IF SYSTABFREECNT > SYSTABPRIMARYNUM THEN                    <<R9241>>03850000
      BEGIN << SEE IF ANY IMPEDED >>                           <<R9241>>03855000
      IF SYSTABIMPHEAD  <> 0 THEN                              <<R9241>>03860000
         BEGIN << UNIMPEDE SUCKER >>                           <<R9241>>03865000
         IF SYSTABIMPHEAD = SYSTABIMPTAIL THEN                 <<R9241>>03870000
            BEGIN << THE ONLY GUY >>                           <<R9241>>03875000
            OLDIMPHEAD := SYSTABIMPHEAD;                       <<R9241>>03880000
            SYSTABIMPHEAD := 0;                                <<R9241>>03885000
            SYSTABIMPTAIL := 0;                                <<R9241>>03890000
            END                                                <<R9241>>03895000
         ELSE                                                  <<R9241>>03900000
            BEGIN << GOT A LONG Q >>                           <<R9241>>03905000
            OLDIMPHEAD := SYSTABIMPHEAD;                       <<R9241>>03910000
            PCBPT := PCB(OLDIMPHEAD + NIMPPINWORDNUM);         <<R9241>>03915000
            PCB(OLDIMPHEAD + NIMPPINWORDNUM) := 0;             <<R9241>>03920000
            PIMPPIN := 0;                                      <<R9241>>03925000
            X := 0;                                            <<R9241>>03930000
            SYSTABIMPHEAD := PCBPT;                            <<R9241>>03935000
            END;                                               <<R9241>>03940000
         SYSTABIMPCURRENTNUM := SYSTABIMPCURRENTNUM - 1;       <<R9241>>03945000
         UNIMPEDE(OLDIMPHEAD);                                 <<R9241>>03950000
         END;                                                  <<R9241>>03955000
      END;                                                     <<R9241>>03960000
   END;                                                        <<R9241>>03965000
IF SEGMENT'WAS'ABSENT THEN                                     <<R9241>>03970000
   BEGIN                                                       <<R9241>>03975000
   RESETDB(ORIGINAL'DST);                                      <<R9241>>03980000
   IF ABSOLUTE'DB THEN                                         <<R9241>>03985000
      BEGIN                                                    <<R9241>>03990000
      SETSYSDB;                                                <<R9241>>03995000
      TOS := SAVEDB;                                           <<R9241>>04000000
      ASMB(XCHD);                                              <<R9241>>04005000
      DDEL;                                                    <<R9241>>04010000
      END;                                                     <<R9241>>04015000
   END                                                         <<R9241>>04020000
ELSE                                                           <<R9241>>04025000
   BEGIN                                                       <<R9241>>04030000
   TOS := SAVEDB;                                              <<R9241>>04035000
   ASMB(XCHD);                                                 <<R9241>>04040000
   END;                                                        <<R9241>>04045000
END; << PROCEDURE RELSYSTABENTRY >>                            <<R9241>>04050000
$PAGE "MESSAGE FACILITY INTRINSICS : SEND MESSAGE"             <<R9241>>04055000
$PAGE "MEASUREMENT INTERFACE : UPDATESTATISTICS"               <<R9241>>04060000
INTEGER PROCEDURE UPDATESTATISTICS(CLASS,SUBCLASS,             <<R9241>>04065000
                     SUBCLASSENTRY,STARTINGITEM,NEWVALUEFLAG,  <<R9241>>04070000
                                   VALUECHANGE,DOUBLEITEMFLAG);<<R9241>>04075000
  VALUE   CLASS,SUBCLASS,SUBCLASSENTRY,STARTINGITEM,           <<R9241>>04080000
          NEWVALUEFLAG,VALUECHANGE,DOUBLEITEMFLAG;             <<R9241>>04085000
  INTEGER CLASS,SUBCLASS,SUBCLASSENTRY,STARTINGITEM;           <<R9241>>04090000
  DOUBLE  VALUECHANGE;                                         <<R9241>>04095000
  LOGICAL NEWVALUEFLAG,DOUBLEITEMFLAG;                         <<R9241>>04100000
  OPTION  PRIVILEGED,UNCALLABLE;                               <<R9241>>04105000
                                                               <<R9241>>04110000
COMMENT                                                        <<R9241>>04115000
*************************************************************  <<R9241>>04120000
THIS PROCEDURE IS USED TO UPDATE AN ITEM IN A GIVEN CLASS,     <<R9241>>04125000
SUBCLASS, ENTRY DEFINED BY THE MPE IV MEASUREMENT INTERFACE.   <<R9241>>04130000
                                                               <<R9241>>04135000
INPUT PARAMETERS:                                              <<R9241>>04140000
                                                               <<R9241>>04145000
      CLASS,          THE CLASSNUMBER OF STATS TO BE UPDATED   <<R9241>>04150000
      SUBCLASS,       SUBCLASS NUMBER OF CLASS                 <<R9241>>04155000
      SUBCLASSENTY,   ENTRY NUMBER OF SUBCLASS                 <<R9241>>04160000
      STARTINGITEM,           STARTINGITEM # OF ENTRY          <<R9241>>04165000
      NEWVALUEFLAG,   IF TRUE=> VALUECHANGE PARM REPLACES START<<R9241>>04170000
                      ELSE ADD VALUECHANGE TO OLD STARTINGITEM <<R9241>>04175000
      VALUECHANGE     EITHER ADDED TO OR REPLACES OLD STARTINGI<<R9241>>04180000
      DOUBLEITEMFLAG  IF TRUE=> VALUECHANGE IS A DOUBLE WORD UP<<R9241>>04185000
                                                               <<R9241>>04190000
RETURN VALUES:                                                 <<R9241>>04195000
                                                               <<R9241>>04200000
      CC = CCL ==> BAD PARAMETER                               <<R9241>>04205000
      CC = CCE ==> OK                                          <<R9241>>04210000
      CC = CCG ==> NOT USED                                    <<R9241>>04215000
                                                               <<R9241>>04220000
      UPDATESTATISTICS = 0 ==> OK                              <<R9241>>04225000
                       = 1 ==> STATS NOT ENABLED               <<R9241>>04230000
                       = 2 ==> BAD STARTINGITEM PARM           <<R9241>>04235000
                       = 3 ==> BAD SUBCLASSENTRY PARM          <<R9241>>04240000
                       = 4 ==> BAD SUBCLASS PARM               <<R9241>>04245000
                       = 5 ==> BAD CLASS PARM                  <<R9241>>04250000
                                                               <<R9241>>04255000
ENTRY POINTS:                                                  <<R9241>>04260000
                                                               <<R9241>>04265000
      FUPDATESTATISTICS: WILL BYPASS ALL PARAMETER CHECKING,   <<R9241>>04270000
                         BUT WILL NOT ALLOW UPDATING IF CLASS  <<R9241>>04275000
                         NOT ENABLED.                          <<R9241>>04280000
                                                               <<R9241>>04285000
OPERATION:                                                     <<R9241>>04290000
                                                               <<R9241>>04295000
      UPDATESTATISTICS WILL FIRST CHECK TO SEE THAT THE CLASS  <<R9241>>04300000
      OF STATISTICS REQUESTED TO BE UPDATED HAS BEEN ENABLED.  <<R9241>>04305000
      IF IT WAS ENABLED IT WILL USE ABS ADDRESSING TO RETRIEVE <<R9241>>04310000
      SOME OFFSETS AND VALUES FROM THE LOCKED AND FROZEN STAT- <<R9241>>04315000
      ISTICS GATHERING DATASEGMENT. IF THE ALTERNATE ENTRY POIN<<R9241>>04320000
      FUPDATESTATISTICS WAS NOT USED, THEN PARAMETER CHECKING I<<R9241>>04325000
      PREFORMED ON THE CLASS, SUBCLASS, SUBCLASSENTRY AND START<<R9241>>04330000
      INGITEM PARAMETERS. IF AN ERROR WAS ENCOUNTERED THEN CC  <<R9241>>04335000
      IS SET TO CCL AND WE RETURN, OTHERWISE EITHER A SINGLE   <<R9241>>04340000
      OR DOUBLE ITEM IS UPDATED (BASED ON DOUBLEITEMFLAG) AND  <<R9241>>04345000
      THE OLDVALUE IS EITHER INCREMENTED OR REPLACED (BASED ON <<R9241>>04350000
      NEWVALUEFLAG).                                           <<R9241>>04355000
                                                               <<R9241>>04360000
*************************************************************  <<R9241>>04365000
;                                                              <<R9241>>04370000
BEGIN                                                          <<R9241>>04375000
                                                               <<R9241>>04380000
EQUATE  NOTENBLD       = 1,  <<STATISTICS GATH NOT ENBLD>>     <<R9241>>04385000
        ITEM'ERROR     = 2,  <<ITEM OUT OF RANGE     >>        <<R9241>>04390000
        SUBENTRY'ERROR = 3,  <<SUBCLASS OUT OF RANGE >>        <<R9241>>04395000
        SUBCLASS'ERROR = 4,  <<SUBCLASS OUT OF RANGE    >>     <<R9241>>04400000
        CLASS'ERROR    = 5;  <<CLASS OUT OF RANGE   >>         <<R9241>>04405000
                                                               <<R9241>>04410000
INTEGER ERROR:=NOTENBLD,                                       <<R9241>>04415000
        CLASSBASE,       <<OFFSET TO REQUESTED CLASS>>         <<R9241>>04420000
        SUBBASE,         <<SEG REL OFFSET TO REQ SUBCLASS>>    <<R9241>>04425000
        ACTUAL'ENTRIES,  <<NUM ENTRIES LESS ENTRY 0>>          <<R9241>>04430000
        VALUECHANGE0=VALUECHANGE,  <<MSW OF VALUECHANGE>>      <<R9241>>04435000
        VALUECHANGE1=VALUECHANGE+1,<<LSW OF VALUECHANGE>>      <<R9241>>04440000
        SAVECC,          <<TEMP COND CODE>>                    <<R9241>>04445000
        X=X,             <<X REG>>                             <<R9241>>04450000
        STATUS=Q-1;      <<STATUS REGISTER>>                   <<R9241>>04455000
                                                               <<R9241>>04460000
INTEGER ARRAY C0'SUBSIZES(*) = PB:= CLASS0'SUB0SIZE,           <<R9241>>04465000
                                    CLASS0'SUB1SIZE,           <<R9241>>04470000
                                    CLASS0'SUB2SIZE,           <<R9241>>04475000
                                    CLASS0'SUB3SIZE;           <<R9241>>04480000
                                                               <<R9241>>04485000
INTEGER ARRAY C1'SUBSIZES(*) = PB:= CLASS1'SUB0SIZE,           <<R9241>>04490000
                                    CLASS1'SUB1SIZE,           <<R9241>>04495000
                                    CLASS1'SUB2SIZE,           <<R9241>>04500000
                                    CLASS1'SUB3SIZE,           <<R9241>>04505000
                                    CLASS1'SUB4SIZE,           <<R9241>>04510000
                                    CLASS1'SUB5SIZE;           <<R9241>>04515000
                                                               <<R9241>>04520000
LOGICAL POINTER MEASINFO'TABPTR = %261;                        <<R9241>>04525000
                                                               <<R9241>>04530000
LOGICAL FUPDATE:=FALSE;                                        <<R9241>>04535000
                                                               <<R9241>>04540000
ENTRY FUPDATESTATISTICS;        <<WILL BYPASS PARM CHECKING>>  <<R9241>>04545000
                                                               <<R9241>>04550000
DEFINE CLASSBASE'IDX   = (CLASS+1)#,  <<OFFSET TO CLASS>>      <<R9241>>04555000
       SUBBASE'IDX     = (SUBCLASS+1)#, <<OFFSET TO SUBCLASS>> <<R9241>>04560000
       ACT'STARTINGITEM= (STARTINGITEM+3)#;<<GET PAST ENTRY 0>><<R9241>>04565000
                                                               <<R9241>>04570000
<<***************SUBROUTINES*********************>>            <<R9241>>04575000
                                                               <<R9241>>04580000
LOGICAL SUBROUTINE GOODSUBCLASS;                               <<R9241>>04585000
BEGIN  <<CHECK FOR VALID SUBCLASS>>                            <<R9241>>04590000
GOODSUBCLASS:=TRUE;                                            <<R9241>>04595000
CASE CLASS OF                                                  <<R9241>>04600000
   BEGIN                                                       <<R9241>>04605000
   <<CLASS0>>                                                  <<R9241>>04610000
   IF SUBCLASS < 0 OR SUBCLASS >= CLASS0'SUBCLASSCNT THEN      <<R9241>>04615000
      GOODSUBCLASS:=FALSE;                                     <<R9241>>04620000
   <<CLASS1>>                                                  <<R9241>>04625000
   IF SUBCLASS < 0 OR SUBCLASS >= CLASS1'SUBCLASSCNT THEN      <<R9241>>04630000
      GOODSUBCLASS:=FALSE;                                     <<R9241>>04635000
   END; <<CASE>>                                               <<R9241>>04640000
END; <<GOODSUBCLASS>>                                          <<R9241>>04645000
                                                               <<R9241>>04650000
                                                               <<R9241>>04655000
LOGICAL SUBROUTINE GOODENTRY;                                  <<R9241>>04660000
BEGIN <<CHECK FOR VALID SUBCLASSENTRY>>                        <<R9241>>04665000
GOODENTRY:=TRUE;                                               <<R9241>>04670000
IF SUBCLASSENTRY < 1 OR    <<DO NOT ALLOW UPDATING>>           <<R9241>>04675000
SUBCLASSENTRY > ACTUAL'ENTRIES THEN  <<OF ENTRY 0>>            <<R9241>>04680000
   GOODENTRY:=FALSE;                                           <<R9241>>04685000
END; <<GOODENTRY>>                                             <<R9241>>04690000
                                                               <<R9241>>04695000
                                                               <<R9241>>04700000
LOGICAL SUBROUTINE GOODSTARTITEM;                              <<R9241>>04705000
BEGIN <<CHECK FOR GOOD STARTINGITEM>>                          <<R9241>>04710000
GOODSTARTITEM:=TRUE;                                           <<R9241>>04715000
CASE CLASS OF                                                  <<R9241>>04720000
   BEGIN                                                       <<R9241>>04725000
   <<CLASS0>>                                                  <<R9241>>04730000
   IF STARTINGITEM < 0 OR                                      <<R9241>>04735000
   STARTINGITEM >= C0'SUBSIZES(SUBCLASS) OR                    <<R9241>>04740000
   DOUBLEITEMFLAG AND STARTINGITEM+1 >= C0'SUBSIZES(SUBCLASS)  <<R9241>>04745000
      THEN GOODSTARTITEM:=FALSE;                               <<R9241>>04750000
   <<CLASS1>>                                                  <<R9241>>04755000
   IF STARTINGITEM < 0 OR                                      <<R9241>>04760000
   STARTINGITEM >= C1'SUBSIZES(SUBCLASS) OR                    <<R9241>>04765000
   DOUBLEITEMFLAG AND STARTINGITEM+1 >= C1'SUBSIZES(SUBCLASS)  <<R9241>>04770000
      THEN GOODSTARTITEM:=FALSE;                               <<R9241>>04775000
   END; <<CASE>>                                               <<R9241>>04780000
END; <<GOODSTARTITEM>>                                         <<R9241>>04785000
                                                               <<R9241>>04790000
                                                               <<R9241>>04795000
LOGICAL SUBROUTINE GOODCLASS;                                  <<R9241>>04800000
BEGIN << CHECK FOR VALID CLASS>>                               <<R9241>>04805000
GOODCLASS:=TRUE;                                               <<R9241>>04810000
IF CLASS < 0 OR CLASS >= CLASSCOUNT THEN                       <<R9241>>04815000
   GOODCLASS:=FALSE;                                           <<R9241>>04820000
END; <<GOODCLASS>>                                             <<R9241>>04825000
                                                               <<R9241>>04830000
<<******************END OF SUBROUTINES******************>>     <<R9241>>04835000
                                                               <<R9241>>04840000
GOTO START;                                                    <<R9241>>04845000
                                                               <<R9241>>04850000
FUPDATESTATISTICS:                                             <<R9241>>04855000
                                                               <<R9241>>04860000
FUPDATE:=TRUE;                                                 <<R9241>>04865000
                                                               <<R9241>>04870000
START:                                                         <<R9241>>04875000
                                                               <<R9241>>04880000
PDISABLE;   <<MAKE SURE NO ONE CHANGES GATHERING STATUS>>      <<R9241>>04885000
                                                               <<R9241>>04890000
TOS:=GCLASSENABLEDMASK;   <<CHECK TO SEE IF REQUESTED CLASS>>  <<R9241>>04895000
X:=CLASS;                 <<IS CURRENTLY ENABLED>>             <<R9241>>04900000
ASMB(TBC 0,X);                                                 <<R9241>>04905000
IF <> THEN                                                     <<R9241>>04910000
   BEGIN                   <<CLASS WAS ENABLED>>               <<R9241>>04915000
                                                               <<R9241>>04920000
   ERROR:=0;                                                   <<R9241>>04925000
                                                               <<R9241>>04930000
   TOS:=MEASSTATXDSBANK;                                       <<R9241>>04935000
   TOS:=MEASSTATXDSBASE+LDEVTABSIZE;  <<GET BEYOND LDEVTAB>>   <<R9241>>04940000
   TOS:=TOS+CLASSBASE'IDX;       <<ABS ADDR OF CLASSBASE PTR>> <<R9241>>04945000
   ASMB(LSEA);                    <<PULL OUT OFFSET TO CLASS>> <<R9241>>04950000
   CLASSBASE:=TOS;                                             <<R9241>>04955000
                                                               <<R9241>>04960000
   <<NOW GET SEGRELOFF FOR SUBCLASS>>                          <<R9241>>04965000
                                                               <<R9241>>04970000
   TOS:=CLASSBASE-CLASSBASE'IDX+SUBBASE'IDX;<<ADD SEGRL OFFSE>><<R9241>>04975000
   ASMB(LADD;LSEA);       <<ADD TO ABS ADDR OF CLASSBASE PTR>> <<R9241>>04980000
   SUBBASE:=TOS+CLASSBASE;<<SEGREL OFFSET TO BASE OF SUBCLASS>><<R9241>>04985000
                                                               <<R9241>>04990000
   <<FINALLY PULL OUT NUMBER OF ENTRIES IN SUBCLASS>>          <<R9241>>04995000
                                                               <<R9241>>05000000
   TOS:=SUBBASE-CLASSBASE-SUBBASE'IDX;                         <<R9241>>05005000
   ASMB(LADD);                                                 <<R9241>>05010000
   ASMB(LSEA);                                                 <<R9241>>05015000
   ACTUAL'ENTRIES:=TOS-1;   <<SUB 1 FOR ENTRY 0>>              <<R9241>>05020000
   DDEL;                                                       <<R9241>>05025000
                                                               <<R9241>>05030000
   IF NOT FUPDATE THEN                                         <<R9241>>05035000
      BEGIN               <<PARAMETER CHECKING>>               <<R9241>>05040000
                                                               <<R9241>>05045000
      IF NOT GOODCLASS THEN                                    <<R9241>>05050000
         ERROR := CLASS'ERROR                                  <<R9241>>05055000
      ELSE                                                     <<R9241>>05060000
         IF NOT GOODSUBCLASS THEN                              <<R9241>>05065000
            ERROR:=SUBCLASS'ERROR                              <<R9241>>05070000
         ELSE                                                  <<R9241>>05075000
            IF NOT GOODENTRY THEN                              <<R9241>>05080000
               ERROR:=SUBENTRY'ERROR                           <<R9241>>05085000
            ELSE                                               <<R9241>>05090000
               IF NOT GOODSTARTITEM THEN                       <<R9241>>05095000
                  ERROR := ITEM'ERROR                          <<R9241>>05100000
      END;                                                     <<R9241>>05105000
                                                               <<R9241>>05110000
   END; <<CLASS ENABLED>>                                      <<R9241>>05115000
                                                               <<R9241>>05120000
IF ERROR = 0 THEN                                              <<R9241>>05125000
                                                               <<R9241>>05130000
   BEGIN <<UPDATE ITEM>>                                       <<R9241>>05135000
   TOS := MEASSTATXDSBANK;                                     <<R9241>>05140000
   TOS := MEASSTATXDSBASE+LDEVTABSIZE+SUBBASE+ACT'STARTINGITEM;<<R9241>>05145000
   IF NOT DOUBLEITEMFLAG THEN                                  <<R9241>>05150000
                                                               <<R9241>>05155000
      BEGIN <<PROCESS SINGLE ITEM UPDATE>>                     <<R9241>>05160000
      IF NOT NEWVALUEFLAG THEN                                 <<R9241>>05165000
         BEGIN <<RETRIVE OLD VALUE, ADD W/VLAUECHANGE,STORE>>  <<R9241>>05170000
         ASMB(LSEA);                                           <<R9241>>05175000
         TOS:=TOS+VALUECHANGE1;                                <<R9241>>05180000
         ASMB(SSEA);                                           <<R9241>>05185000
         END                                                   <<R9241>>05190000
      ELSE                                                     <<R9241>>05195000
         BEGIN <<REPLACE OLDVALUE W/VALUECHANGE>>              <<R9241>>05200000
         TOS:=VALUECHANGE1;                                    <<R9241>>05205000
         ASMB(SSEA);                                           <<R9241>>05210000
         END;                                                  <<R9241>>05215000
      END   <<SINGLE ITEM UPDATE>>                             <<R9241>>05220000
                                                               <<R9241>>05225000
   ELSE                                                        <<R9241>>05230000
                                                               <<R9241>>05235000
      BEGIN <<PROCESS DOUBLE ITEM UPDATE>>                     <<R9241>>05240000
      IF NOT NEWVALUEFLAG THEN                                 <<R9241>>05245000
         BEGIN <<RETRIEVE OLD VALUE, ADD W/VALUECHANGE,STORE>> <<R9241>>05250000
         ASMB(LDEA);                                           <<R9241>>05255000
         TOS:=TOS+VALUECHANGE;                                 <<R9241>>05260000
         ASMB(SDEA);                                           <<R9241>>05265000
         END                                                   <<R9241>>05270000
      ELSE                                                     <<R9241>>05275000
         BEGIN <<REPLACE OLD VALUE W/VALUECHANGE>>             <<R9241>>05280000
         TOS:=VALUECHANGE;                                     <<R9241>>05285000
         ASMB(SDEA);                                           <<R9241>>05290000
         END;                                                  <<R9241>>05295000
      END;                                                     <<R9241>>05300000
                                                               <<R9241>>05305000
   DDEL; <<BANK,ADDRESS>>                                      <<R9241>>05310000
   SAVECC:=CCE;                                                <<R9241>>05315000
   END                                                         <<R9241>>05320000
                                                               <<R9241>>05325000
ELSE                                                           <<R9241>>05330000
                                                               <<R9241>>05335000
   SAVECC:=CCL;                                                <<R9241>>05340000
                                                               <<R9241>>05345000
PENABLE;                                                       <<R9241>>05350000
UPDATESTATISTICS:=ERROR;                                       <<R9241>>05355000
CC:=SAVECC;                                                    <<R9241>>05360000
END;  <<UPDATESTATISTICS>>                                     <<R9241>>05365000
PROCEDURE MEAS'OBJFAULT(OBJ);                                  <<R9241>>05370000
VALUE OBJ;                                                     <<R9241>>05375000
DOUBLE OBJ;                                                    <<R9241>>05380000
OPTION PRIVILEGED , UNCALLABLE;                                <<R9241>>05385000
BEGIN                                                          <<R9241>>05390000
LOGICAL ARRAY OBJID(*) = OBJ;                                  <<R9241>>05395000
INTEGER STOP'INDEX;                                            <<R9241>>05400000
                                                                        05400010
<<********************************************************>>            05400020
<<                                                        >>            05400030
<< TURN OFF TRAPS TO AVOID INTEGER ARITHMETIC ERRORS WHEN >>            05400040
<< CALCULATING ADDRESSES. CHECKS ARE MADE ELSEWHERE TO    >>            05400050
<< ENSURE THAT NO BANK WRAP AROUNDS CAN OCCUR.            >>            05400060
<<                                                        >>            05400070
<<********************************************************>>            05400080
                                                                        05400090
TRAPOFF;                                                       <<M9303>>05400100
                                                                        05400110
IF GCLASSENABLEDMASK.CLASS0 THEN BEGIN                         <<R9241>>05405000
  CASE OBJID(OBJIDTYPEFIELD) OF BEGIN                          <<R9241>>05410000
    <<0>>  STOP'INDEX := C'STOPDATAFAULT;                      <<R9241>>05415000
    <<1>>  STOP'INDEX := C'STOPSLFAULT;                        <<R9241>>05420000
    <<2>>  STOP'INDEX := C'STOPPBXFAULT;                       <<R9241>>05425000
    <<3>>  STOP'INDEX := C'STOPCACHEFAULT;                     <<R9241>>05430000
  END; <<CASE>>                                                <<R9241>>05435000
  TOS := MEASSTATXDSBANK;                                      <<R9241>>05440000
  TOS := MEASSTATXDSBASE;                                      <<R9241>>05445000
  TOS := TOS + C0SUB0'SEGRELOFF + STOP'INDEX;                  <<R9241>>05450000
  ASMB(LSEA);                                                  <<R9241>>05455000
  TOS := TOS + 1;                                              <<R9241>>05460000
  ASMB(SSEA;DDEL);                                             <<R9241>>05465000
END; <<CLASS 0 ENABLED>>                                       <<R9241>>05470000
IF GCLASSENABLEDMASK.CLASS15 THEN BEGIN <<CLASS 15 ENABLED>>   <<R9241>>05475000
  CASE OBJID(OBJIDTYPEFIELD) OF BEGIN                          <<R9241>>05480000
    <<0>>  STOP'INDEX := CP'STOPDSTFAULT;                      <<R9241>>05485000
    <<1>>  STOP'INDEX := CP'STOPSLFAULT;                       <<R9241>>05490000
    <<2>>  STOP'INDEX := CP'STOPPBXFAULT;                      <<R9241>>05495000
    <<3>>  STOP'INDEX := CP'STOPDSTFAULT; <<CP'STOPCACHEFAULT>><<R9241>>05500000
  END;  <<CASE>>                                               <<R9241>>05505000
  TOS := MEASPROCXDSBANK;                                      <<R9241>>05510000
  TOS := MEASPROCXDSBASE;                                      <<R9241>>05515000
  TOS := TOS + CURPRC/PCBSIZE * CLASS15'SUB0SIZE + STOP'INDEX; <<R9241>>05520000
  ASMB(LSEA);                                                  <<R9241>>05525000
  TOS := TOS + 1;                                              <<R9241>>05530000
  ASMB(SSEA;DDEL);                                             <<R9241>>05535000
END;                                                           <<R9241>>05540000
END; <<PROCEDURE MEAS'OBJFAULT>>                               <<R9241>>05545000
$PAGE "UNCALLABLE UTILITIES : SYSPROC"                         <<R9241>>05550000
PROCEDURE READYPROCESS(PCBPT);                                 <<R9241>>05555000
VALUE PCBPT;                                                   <<R9241>>05560000
INTEGER PCBPT;                                                 <<R9241>>05565000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>05570000
BEGIN                                                          <<R9241>>05575000
LOGICAL                                                        <<R9241>>05580000
   PAWSEDFLAG;                                                 <<R9241>>05585000
                                                               <<R9241>>05590000
IF NOT LOG(SPCBDISPQ) AND SPCBWAITFIELD = 0 THEN               <<R9241>>05595000
   BEGIN <<MUST GET PROCESS INTO CONTENTION FOR THE CPU>>      <<R9241>>05600000
   PDISABLE;  <<PSEUDO DISABLE FOR FAST DB SWITCH>>            <<R9241>>05605000
   TOS:=%1000D;                                                <<R9241>>05610000
   EXCHDB;                                                     <<R9241>>05615000
   QUEUEPROC(PCBPT,DISPATCHINGQ,FRONTOFCLASS);                 <<R9241>>05620000
   PAWSEDFLAG:=DISPTOAWAKEMSG.PAUSEDFLAG;                      <<R9241>>05625000
   EXCHDB;                                                     <<R9241>>05630000
   PENABLE;                                                    <<R9241>>05635000
   IF PAWSEDFLAG THEN ASMB(DISP);                              <<R9241>>05640000
   END;                                                        <<R9241>>05645000
END;  <<READYPROCESS>>                                         <<R9241>>05650000
LOGICAL PROCEDURE SYSPROC(LOGICALPROCNUMBER);                  <<R9241>>05655000
VALUE LOGICALPROCNUMBER;                                       <<R9241>>05660000
INTEGER LOGICALPROCNUMBER;                                     <<R9241>>05665000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>05670000
                                                               <<R9241>>05675000
COMMENT                                                        <<R9241>>05680000
                                                               <<R9241>>05685000
SYSPROC CONVERTS THE CALLER SUPPLIED LOGICAL PROCESS           <<R9241>>05690000
NUMBER INTO THE PCB RELATIVE POINTER TO THAT PROCESS'          <<R9241>>05695000
PCB ENTRY.                                                     <<R9241>>05700000
                                                               <<R9241>>05705000
;                                                              <<R9241>>05710000
                                                               <<R9241>>05715000
BEGIN                                                          <<R9241>>05720000
                                                               <<R9241>>05725000
EQUATE LOGPROCTABBASE=%1141,                                   <<R9241>>05730000
       LOGPROCTABSIZE=12;                                      <<R9241>>05735000
                                                               <<R9241>>05740000
SYSPROC:=IF LOGICALPROCNUMBER > LOGPROCTABSIZE THEN 0          <<R9241>>05745000
ELSE ABSOLUTE(LOGPROCTABBASE+LOGICALPROCNUMBER);               <<R9241>>05750000
END  <<PROCEDURE SYSPROC>>;                                    <<R9241>>05755000
$PAGE "UNCALLABLE UTILITIES : BUILD/CONVERT SEG ID"            <<R9241>>05760000
DOUBLE  PROCEDURE BUILDOBJID(OBJTYPE,OBJNUMBER,PIN);           <<R9241>>05765000
VALUE OBJTYPE,OBJNUMBER,PIN;                                   <<R9241>>05770000
INTEGER OBJTYPE,OBJNUMBER,PIN;                                 <<R9241>>05775000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>05780000
                                                               <<R9241>>05785000
COMMENT                                                        <<R9241>>05790000
                                                               <<R9241>>05795000
BUILDOBJID CONVERTS THE OBJECT NUMBER PARAMETER INTO THE STAND <<R9241>>05800000
INVARIANT FORM OF OBJIDENTIFIER USED THROUGHOUT THE SYSTEM.    <<R9241>>05805000
THIS ROUTINE MAY BE CALLED IN SPLIT STACK MODE.                <<R9241>>05810000
                                                               <<R9241>>05815000
OBJTYPE =dataobject ==> OBJECT IS A DATA OBJECT,               <<R9241>>05820000
               OBJNUMBER=DST ENTRY NUMBER OF OBJECT'S DESCRIPTO<<R9241>>05825000
        =slobject ==> OBJECT IS A SYSTEM SL OBJECT,            <<R9241>>05830000
               OBJNUMBER=SL ENTRY NUMBER OF OBJECT'S DESCRIPTOR<<R9241>>05835000
        =pbxobject ==> OBJECT IS A PART OF A PROGRAM,          <<R9241>>05840000
               OBJNUMBER=PROGRAM OBJECT NUMBER (>%300),        <<R9241>>05845000
               PIN=PIN OF PROCESS EXECUTING THE PROGRAM        <<R9241>>05850000
        =mappeddomainobject ==> OBJECT IS A CACHED DISC DOMAIN,<<R9241>>05855000
               OBJNUMBER = CDT ENTRY OF MAPPED DISC DOMAIN     <<R9241>>05860000
                                                               <<R9241>>05865000
;                                                              <<R9241>>05870000
                                                               <<R9241>>05875000
BEGIN                                                          <<R9241>>05880000
                                                               <<R9241>>05885000
DOUBLE  OBJID;                                                 <<R9241>>05890000
DOUBLE  segid=objid;                                           <<R9241>>05895000
INTEGER SEGNUMBER=OBJNUMBER;                                   <<R9241>>05900000
DOUBLE  BUILT := 0D;                                           <<R9241>>05905000
LOGICAL ARRAY BUILDSPACE(*)=BUILT;                             <<R9241>>05910000
DEFINE SEGIDPBXFIELD=OBJIDPBXFIELD#;                           <<R9241>>05915000
                                                               <<R9241>>05920000
ENTRY BUILDSEGID; <<for backwards compatibility>>              <<R9241>>05925000
                                                               <<R9241>>05930000
BUILDSEGID :                                                   <<R9241>>05935000
                                                               <<R9241>>05940000
IF OBJTYPE=DataObject THEN BEGIN << Data Object >>             <<R9241>>05945000
   BUILDSPACE(ObjIDTypeField):=DataObject;                     <<R9241>>05950000
   BUILDSPACE(ObjIDnumField):=OBJNUMBER;                       <<R9241>>05955000
END ELSE IF OBJTYPE = MappedDomainObject THEN                  <<R9241>>05960000
   BEGIN  <<mapped disc domain>>                               <<R9241>>05965000
   BUILDSPACE(ObjIDTypeField):= MappedDomainObject;            <<R9241>>05970000
   BUILDSPACE(ObjIDnumField):=OBJNUMBER;                       <<R9241>>05975000
   END                                                         <<R9241>>05980000
ELSE                                                           <<R9241>>05985000
   BEGIN  <<CODE OBJ >>                                        <<R9241>>05990000
   IF OBJTYPE=SlObject THEN                                    <<R9241>>05995000
      BEGIN <<SL OBJ>>                                         <<R9241>>06000000
      BUILDSPACE(ObjIDTypeField):=SlObject;                    <<R9241>>06005000
      BUILDSPACE(ObjIDnumField):=OBJNUMBER;                    <<R9241>>06010000
      END                                                      <<R9241>>06015000
   ELSE                                                        <<R9241>>06020000
      BEGIN <<PROGRAM OBJECT>>                                 <<R9241>>06025000
      IF OBJTYPE <> pbxobject THEN SuddenDeath(619);           <<R9241>>06030000
      IF MAPPINGFIRMWARE THEN                                  <<R9241>>06035000
         TOS:=SEGNUMBER                                        <<R9241>>06040000
      ELSE                                                     <<R9241>>06045000
      TOS:=OBJNUMBER-%300;                                     <<R9241>>06050000
      BUILDSPACE(ObjIDnumField):=TOS;                          <<R9241>>06055000
      BUILDSPACE(ObjIDTypeField):=PbxObject;                   <<R9241>>06060000
      BUILDSPACE(ObjIDpbxField):=                              <<R9241>>06065000
            PCB(PIN * PCBSIZE + PBXWORDNUM);                   <<R9241>>06070000
      END;                                                     <<R9241>>06075000
   END;                                                        <<R9241>>06080000
   BUILDOBJID:=BUILT;                                          <<R9241>>06085000
END <<BUILDOBJID>>;                                            <<R9241>>06090000
LOGICAL PROCEDURE LABEL'IS'SL'SEG (PLABEL,PCBPT);              <<R9241>>06095000
VALUE PLABEL,PCBPT;                                            <<R9241>>06100000
INTEGER PLABEL,PCBPT;                                          <<R9241>>06105000
OPTION UNCALLABLE;                                             <<R9241>>06110000
                                                               <<R9241>>06115000
<<RETURN TRUE IF PLABEL IS A SL SEGMENT   >>                   <<R9241>>06120000
<<       FALSE IF IT IS A PROGRAM SEGMENT >>                   <<R9241>>06125000
                                                               <<R9241>>06130000
BEGIN                                                          <<R9241>>06135000
                                                               <<R9241>>06140000
   DEFINE PHYMAPPING    = LOGICAL(PLABEL.(0:1))#,              <<R9241>>06145000
          SEGNUMBER     = PLABEL.(8:8)#,                       <<R9241>>06150000
          PROGSEGNUM    = DST(CSTXBLK(SPCBPBX))#;              <<R9241>>06155000
   PDISABLE;                                                   <<R9241>>06160000
   IF PCBPT = 0 THEN PCBPT := (CURPRC);                        <<R9241>>06165000
   IF MAPPINGFIRMWARE THEN                                     <<R9241>>06170000
      IF PHYMAPPING THEN                                       <<R9241>>06175000
         LABEL'IS'SL'SEG := TRUE                               <<R9241>>06180000
      ELSE                                                     <<R9241>>06185000
         IF SEGNUMBER > PROGSEGNUM THEN                        <<R9241>>06190000
            LABEL'IS'SL'SEG :=TRUE                             <<R9241>>06195000
         ELSE                                                  <<R9241>>06200000
            LABEL'IS'SL'SEG :=FALSE                            <<R9241>>06205000
   ELSE                                                        <<R9241>>06210000
      IF SEGNUMBER < %300 THEN                                 <<R9241>>06215000
         LABEL'IS'SL'SEG := TRUE                               <<R9241>>06220000
      ELSE                                                     <<R9241>>06225000
         LABEL'IS'SL'SEG := FALSE;                             <<R9241>>06230000
   PENABLE;                                                    <<R9241>>06235000
END;                                                           <<R9241>>06240000
                                                               <<R9241>>06245000
LOGICAL PROCEDURE MARKER'IS'SL'SEG(STATUS',DELTAP,PCBPT);      <<R9241>>06250000
VALUE STATUS',DELTAP,PCBPT;                                    <<R9241>>06255000
INTEGER STATUS',DELTAP,PCBPT;                                  <<R9241>>06260000
OPTION UNCALLABLE;                                             <<R9241>>06265000
<<RETURN TRUE IF MARKER IS A SL SEGMENT   >>                   <<R9241>>06270000
<<       FALSE IF IT IS A PROGRAM SEGMENT >>                   <<R9241>>06275000
                                                               <<R9241>>06280000
BEGIN                                                          <<R9241>>06285000
                                                               <<R9241>>06290000
DEFINE PHYMAPPING    = LOGICAL(DELTAP.(1:1))#,                 <<R9241>>06295000
       SEGNUMBER     = STATUS'.(8:8)#,                         <<R9241>>06300000
          PROGSEGNUM    = DST(CSTXBLK(SPCBPBX))#;              <<R9241>>06305000
   PDISABLE;                                                   <<R9241>>06310000
   IF PCBPT = 0 THEN PCBPT := (CURPRC);                        <<R9241>>06315000
   IF MAPPINGFIRMWARE THEN                                     <<R9241>>06320000
      IF PHYMAPPING THEN                                       <<R9241>>06325000
         MARKER'IS'SL'SEG := TRUE                              <<R9241>>06330000
      ELSE                                                     <<R9241>>06335000
         IF SEGNUMBER > PROGSEGNUM THEN                        <<R9241>>06340000
            MARKER'IS'SL'SEG :=TRUE                            <<R9241>>06345000
         ELSE                                                  <<R9241>>06350000
            MARKER'IS'SL'SEG :=FALSE                           <<R9241>>06355000
   ELSE                                                        <<R9241>>06360000
      IF SEGNUMBER < %300 THEN                                 <<R9241>>06365000
         MARKER'IS'SL'SEG := TRUE                              <<R9241>>06370000
      ELSE                                                     <<R9241>>06375000
         MARKER'IS'SL'SEG := FALSE;                            <<R9241>>06380000
   PENABLE;                                                    <<R9241>>06385000
END;                                                           <<R9241>>06390000
                                                               <<R9241>>06395000
INTEGER PROCEDURE CONVSEGIDTOSTINX(OBJTEMPORARY);              <<R9241>>06400000
VALUE OBJTEMPORARY ;                                           <<R9241>>06405000
DOUBLE  OBJTEMPORARY ;                                         <<R9241>>06410000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>06415000
                                                               <<R9241>>06420000
COMMENT                                                        <<R9241>>06425000
                                                               <<R9241>>06430000
CONVERTS A OBJIDENTIFIER TO THE CURRENT SEGMENT TABLE INDEX OF <<R9241>>06435000
THE CORRESPONDING SEGMENT'S DESCRIPTOR. THIS ROUTINE MAY       <<R9241>>06440000
BE CALLED IN SPLIT STACK MODE.                                 <<R9241>>06445000
                                                               <<R9241>>06450000
THIS ROUTINE WORKS ONLY FOR OBJECTS WHICH ARE SEGMENTS.        <<R9241>>06455000
DOESN'T WORK FOR MAPPED DISC DOMAIN OBJECTS.                   <<R9241>>06460000
                                                               <<R9241>>06465000
IF THE DESIGNATED SEGMENT DESCRIPTOR IS VALID, THE CONDITION   <<R9241>>06470000
CODE IS SET TO CCE AND THE SEGMENT TABLE RELATIVE INDEX OF THE <<R9241>>06475000
SEGMENT DESCRIPTOR IS RETURNED.                                <<R9241>>06480000
                                                               <<R9241>>06485000
IF THE DESIGNATED DESCRIPTOR IS UNASSIGNED, THE CONDITION CODE <<R9241>>06490000
SET TO CCL AND A ZERO IS RETURNED.                             <<R9241>>06495000
                                                               <<R9241>>06500000
                                                               <<R9241>>06505000
;                                                              <<R9241>>06510000
                                                               <<R9241>>06515000
BEGIN                                                          <<R9241>>06520000
LOGICAL ARRAY OBJIDENTIFIER(*)=OBJTEMPORARY;                   <<R9241>>06525000
INTEGER DESCSTINX=CONVSEGIDTOSTINX,                            <<R9241>>06530000
        CONDCODE:=CCE;                                         <<R9241>>06535000
                                                               <<R9241>>06540000
IF OBJIDENTIFIER(ObjIDTypeField)= OBJIDCDTYPE                  <<R9241>>06545000
THEN SUDDENDEATH(SFKernCacheINTBAD);                           <<R9241>>06550000
                                                               <<R9241>>06555000
IF OBJIDENTIFIER(ObjIDTypeField)=ObjIDdataType                 <<R9241>>06560000
THEN CONVSEGIDTOSTINX:=OBJIDENTIFIER(ObjIDnumField)&LSL(2) ELSE<<R9241>>06565000
   BEGIN  <<CODE OBJ>>                                         <<R9241>>06570000
   IF OBJIDENTIFIER(ObjIDTypeField)=ObjIDpgmType THEN          <<R9241>>06575000
      BEGIN <<IN A PROGRAM BLOCK>>                             <<R9241>>06580000
      X:=OBJIDENTIFIER(ObjIDpbxField);                         <<R9241>>06585000
      IF CSTXBLK(X)=-1 THEN                                    <<R9241>>06590000
         BEGIN                                                 <<R9241>>06595000
         CONDCODE:=CCL;                                        <<R9241>>06600000
         CONVSEGIDTOSTINX:=0;                                  <<R9241>>06605000
         END                                                   <<R9241>>06610000
      ELSE                                                     <<R9241>>06615000
      CONVSEGIDTOSTINX := CSTXBLK(X) +                         <<R9241>>06620000
         INTEGER(OBJIDENTIFIER(ObjIDnumField) & LSL(2));       <<R9241>>06625000
      END                                                      <<R9241>>06630000
   ELSE                                                        <<R9241>>06635000
      BEGIN <<SL OBJ>>                                         <<R9241>>06640000
      CONVSEGIDTOSTINX := OBJIDENTIFIER(OBJIDNUMFIELD) & LSL(2)<<R9241>>06645000
                            + ABSOLUTE(SYSDFC);                <<R9241>>06650000
      END;                                                     <<R9241>>06655000
   END;                                                        <<R9241>>06660000
IF DST(DESCSTINX)=%100000 THEN                                 <<R9241>>06665000
   BEGIN  <<UNALLOCATED ENTRY>>                                <<R9241>>06670000
   CONDCODE:=CCL;                                              <<R9241>>06675000
   DESCSTINX:=0;                                               <<R9241>>06680000
   END;                                                        <<R9241>>06685000
CC:=CONDCODE;                                                  <<R9241>>06690000
END  <<CONVSEGIDTOSTINX>>;                                     <<R9241>>06695000
                                                               <<R9241>>06700000
$page "Uncallable Utilities : Is Object Present ? "            <<R9241>>06705000
                                                               <<R9241>>06710000
LOGICAL PROCEDURE IsObjectAbsent ( obj );                      <<R9241>>06715000
VALUE obj;                                                     <<R9241>>06720000
DOUBLE  obj;                                                   <<R9241>>06725000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>06730000
                                                               <<R9241>>06735000
COMMENT                                                        <<R9241>>06740000
                                                               <<R9241>>06745000
returns true if object is marked absent  else returns false.   <<R9241>>06750000
                                                               <<R9241>>06755000
;                                                              <<R9241>>06760000
                                                               <<R9241>>06765000
BEGIN                                                          <<R9241>>06770000
LOGICAL ARRAY objid(*) = obj;                                  <<R9241>>06775000
INTEGER STINX;                                                 <<R9241>>06780000
                                                               <<R9241>>06785000
IF objid(ObjIDtypeField) = ObjIDcdType THEN                    <<R9241>>06790000
   BEGIN                                                       <<R9241>>06795000
   CDT'ABS'ON'TOS;                                             <<R9241>>06800000
   TOS := TOS + objid(ObjIDNumField) * CDT'ENTRY'SIZE;         <<R9241>>06805000
   TOS := TOS + CDT'MD'FLAGS;                                  <<R9241>>06810000
   ASMB(LSEA;DELB,DELB);                                       <<R9241>>06815000
   IsObjectAbsent := TOS.CDT'ABSENT;                           <<R9241>>06820000
   END                                                         <<R9241>>06825000
ELSE                                                           <<R9241>>06830000
   BEGIN                                                       <<R9241>>06835000
   STINX := CONVSEGIDTOSTINX(OBJ);                             <<R9241>>06840000
   IF < THEN SUDDENDEATH(617);                                 <<R9241>>06845000
   IsObjectAbsent := DST(STINX).ABSENTFLAG;                    <<R9241>>06850000
   END;                                                        <<R9241>>06855000
                                                               <<R9241>>06860000
END;  <<IsObjectAbsent>>                                       <<R9241>>06865000
$page "Uncallable Utilities : Process Pri"                     <<R9241>>06870000
                                                               <<R9241>>06875000
INTEGER PROCEDURE ProcessPri(pin);                             <<R9241>>06880000
VALUE pin;                                                     <<R9241>>06885000
INTEGER pin;                                                   <<R9241>>06890000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>06895000
                                                               <<R9241>>06900000
BEGIN                                                          <<R9241>>06905000
IF pin=0 THEN SuddenDeath(SFKernBadParm);                      <<R9241>>06910000
ProcessPri := pcb(pin*pcbsize+queueinginfowordnum).prifield;   <<R9241>>06915000
END;  <<ProcessPri>>                                           <<R9241>>06920000
                                                               <<R9241>>06925000
$page "Uncallable Utilities : Is Object a ROC  ? "             <<R9241>>06930000
                                                               <<R9241>>06935000
LOGICAL PROCEDURE IsObjectROC ( obj );                         <<R9241>>06940000
VALUE obj;                                                     <<R9241>>06945000
DOUBLE  obj;                                                   <<R9241>>06950000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>06955000
                                                               <<R9241>>06960000
COMMENT                                                        <<R9241>>06965000
                                                               <<R9241>>06970000
returns true if object is marked an roc else returns false.    <<R9241>>06975000
                                                               <<R9241>>06980000
;                                                              <<R9241>>06985000
                                                               <<R9241>>06990000
BEGIN                                                          <<R9241>>06995000
LOGICAL ARRAY objid(*)=obj;                                    <<R9241>>07000000
INTEGER STINX;                                                 <<R9241>>07005000
                                                               <<R9241>>07010000
IF objid(ObjIDTypeField) = ObjIDcdType THEN                    <<R9241>>07015000
   BEGIN                                                       <<R9241>>07020000
   CDT'ABS'ON'TOS;                                             <<R9241>>07025000
   TOS := TOS + objid(ObjIDNumField) * CDT'ENTRY'SIZE;         <<R9241>>07030000
   TOS := TOS + CDT'MD'FLAGS;                                  <<R9241>>07035000
   ASMB(LSEA;DELB,DELB);                                       <<R9241>>07040000
   IsObjectROC := TOS.CDT'ROC;                                 <<R9241>>07045000
   END                                                         <<R9241>>07050000
ELSE                                                           <<R9241>>07055000
   BEGIN                                                       <<R9241>>07060000
   STINX := CONVSEGIDTOSTINX(OBJ);                             <<R9241>>07065000
   IF < THEN SUDDENDEATH(617);                                 <<R9241>>07070000
   IsObjectROC := DST(STINX).ROCFLAG;                          <<R9241>>07075000
   END;                                                        <<R9241>>07080000
                                                               <<R9241>>07085000
END;  <<IsObjectROC>>                                          <<R9241>>07090000
                                                               <<R9241>>07095000
$page "Uncallable Utilities : Is Object In Motion In ? "       <<R9241>>07100000
                                                               <<R9241>>07105000
LOGICAL PROCEDURE IsObjectIMI ( obj );                         <<R9241>>07110000
VALUE obj;                                                     <<R9241>>07115000
DOUBLE obj;                                                    <<R9241>>07120000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>07125000
                                                               <<R9241>>07130000
COMMENT                                                        <<R9241>>07135000
                                                               <<R9241>>07140000
returns true if object is marked imi     else returns false.   <<R9241>>07145000
                                                               <<R9241>>07150000
;                                                              <<R9241>>07155000
                                                               <<R9241>>07160000
BEGIN                                                          <<R9241>>07165000
LOGICAL ARRAY objid(*)=obj;                                    <<R9241>>07170000
INTEGER STINX;                                                 <<R9241>>07175000
                                                               <<R9241>>07180000
IF objid(ObjIDTypeField) = ObjIDcdType THEN                    <<R9241>>07185000
   BEGIN                                                       <<R9241>>07190000
   CDT'ABS'ON'TOS;                                             <<R9241>>07195000
   TOS := TOS + objid(ObjIDNumField) * CDT'ENTRY'SIZE;         <<R9241>>07200000
   TOS := TOS + CDT'MD'FLAGS;                                  <<R9241>>07205000
   ASMB(LSEA;DELB,DELB);                                       <<R9241>>07210000
   IsObjectIMI := TOS.CDT'IMI;                                 <<R9241>>07215000
   END                                                         <<R9241>>07220000
ELSE                                                           <<R9241>>07225000
   BEGIN                                                       <<R9241>>07230000
   STINX := CONVSEGIDTOSTINX(OBJ);                             <<R9241>>07235000
   IF < THEN SUDDENDEATH(617);                                 <<R9241>>07240000
   IsObjectIMI := DST(STINX).IMIFLAG;                          <<R9241>>07245000
   END;                                                        <<R9241>>07250000
                                                               <<R9241>>07255000
END;      <<IsObjectIMI>>                                      <<R9241>>07260000
$PAGE  "UNCALLABLE UTILITIES : SET PSIF"                       <<R9241>>07265000
PROCEDURE SET'PSIF(PCBPT,FLAG);                                <<R9241>>07270000
VALUE PCBPT,FLAG;                                              <<R9241>>07275000
INTEGER PCBPT;                                                 <<R9241>>07280000
LOGICAL FLAG;                                                  <<R9241>>07285000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>07290000
                                                               <<R9241>>07295000
COMMENT                                                        <<R9241>>07300000
                                                               <<R9241>>07305000
SET'PSIF SETS A FLAG IN THE PSEUDO-INTERRUPT FIELD OF          <<R9241>>07310000
PCBPT'S PCB ENTRY,PROVIDED NO MORE URGENT PI IS IN EFFECT.     <<R9241>>07315000
IF THE PROCESS IS IMPEDED, HOLDING A SIR, CRITICAL, OR         <<R9241>>07320000
EXECUTING SYSTEM CODE, THE PIOVRFLAG IS SET.  OTHERWISE,       <<R9241>>07325000
THE PROCESS IS QUEUED INTO THE DISPQ, SO IT WILL BE SWAPPED    <<R9241>>07330000
IN AND A MARKER TO PSEUDOINT PUT ON ITS STACK BEFORE LAUNCH.   <<R9241>>07335000
                                                               <<R9241>>07340000
;                                                              <<R9241>>07345000
                                                               <<R9241>>07350000
BEGIN                                                          <<R9241>>07355000
ENTRY CLEAR'PSIF;                                              <<R9241>>07360000
LOGICAL SETTING:=FALSE,                                        <<R9241>>07365000
        DELAY:=FALSE;                                          <<R9241>>07370000
                                                               <<R9241>>07375000
DISABLE;                                                       <<R9241>>07380000
SETTING:=TRUE;                                                 <<R9241>>07385000
X:=PCBPT+PROCSTATEWORDNUM;                                     <<R9241>>07390000
TOS:=PCB(X):=LOGICAL(PCB(X)) LOR FLAG.PIFLAGSFIELD;            <<R9241>>07395000
TOS:=TOS.PIFLAGSFIELD&LSL(9);                                  <<R9241>>07400000
ASMB(SCAN 0;DEL,LDXA);                                         <<R9241>>07405000
X:=PCBPT+PIINFOWORDNUM;                                        <<R9241>>07410000
IF S0 >= PCB(X).PSIMFIELD THEN PCB(PCBPT+PROCSTATEWORDNUM)     <<R9241>>07415000
.PIFLAGSFIELD:=0 <<MORE URGENT SOFT INTERRUPT IS PENDING>> ELSE<<R9241>>07420000
   BEGIN                                                       <<R9241>>07425000
   <<IF HK,SK OR STOP, CLEAR FATHER AND SON WAIT FLAGS>>       <<R9241>>07430000
   IF S0 < 3 THEN SPCBABORTWAKE:=0;                            <<R9241>>07435000
   IF TOS=5 AND LOG(SPCBWAKESOFT) THEN <<C Y PREEMPT PAUSE/IO>><<R9241>>07440000
      SPCBNONCRITWAIT:=0;                                      <<R9241>>07445000
   IF LOGICAL(PCB(PCBPT+RESABORTINFOWORDNUM)).HASSIRFLAG       <<R9241>>07450000
   OR LOGICAL(PCB(PCBPT+RESABORTINFOWORDNUM)).CRITFLAG         <<R9241>>07455000
   OR LOGICAL(PCB(PCBPT+WAKEMASKWORDNUM)).IMPEDEDWAITFLAG      <<R9241>>07460000
   OR LOGICAL(PCB(PCBPT+STKINFOWORDNUM)).INSYSTEMFLAG THEN     <<R9241>>07465000
      BEGIN <<PSEUDO-INTERRUPT MUST BE DELAYED>>               <<R9241>>07470000
      DELAY:=TRUE;                                             <<R9241>>07475000
      PCB(PCBPT+RESABORTINFOWORDNUM).PIOVRFLAG:=1;             <<R9241>>07480000
      END;                                                     <<R9241>>07485000
   END;                                                        <<R9241>>07490000
                                                               <<R9241>>07495000
CLEAR'PSIF:                                                    <<R9241>>07500000
                                                               <<R9241>>07505000
IF NOT SETTING THEN                                            <<R9241>>07510000
   BEGIN  <<CLEARING>>                                         <<R9241>>07515000
   DISABLE;                                                    <<R9241>>07520000
   X:=PCBPT+PROCSTATEWORDNUM;                                  <<R9241>>07525000
   TOS:=PCB(X):=LOGICAL(PCB(X)) LAND NOT FLAG.PIFLAGSFIELD;    <<R9241>>07530000
   IF TOS.PIFLAGSFIELD = 0                                     <<R9241>>07535000
   THEN PCB(PCBPT+RESABORTINFOWORDNUM).PIOVRFLAG:=0;           <<R9241>>07540000
   END;                                                        <<R9241>>07545000
                                                               <<R9241>>07550000
READYPROCESS(PCBPT);                                           <<R9241>>07555000
END  <<PROCEDURE SET'PSIF>>;                                   <<R9241>>07560000
$PAGE "SOFTWARE INTERRUPTS.  DATA STRUCTURES."                 <<R9241>>07565000
COMMENT                                                        <<R9241>>07570000
                                                               <<R9241>>07575000
Soft Interrupt Queue Structure.                                <<R9241>>07580000
                                                               <<R9241>>07585000
                   Msg Harbor                                  <<R9241>>07590000
   ...........    ............                                 <<R9241>>07595000
   .         .    .Port zero .    ........    ........   ......<<R9241>>07600000
   .  PCB    .    ............    .System.    .System.   .Syste<<R9241>>07605000
   .         .--->.Port one  .--->.Soft  .--->.Soft  .-->.Soft <<R9241>>07610000
   ...........    ............    .Int 0 .    .Int 1 .   .Int 2<<R9241>>07615000
                  .Port two  .-   ........    ........   ......<<R9241>>07620000
                  ............                                 <<R9241>>07625000
                               -                               <<R9241>>07630000
                                                               <<R9241>>07635000
                                - ........    ........         <<R9241>>07640000
                                  .User  .    .User  .         <<R9241>>07645000
                                 >.Soft  .--->.Soft  .         <<R9241>>07650000
                                  .Int 0 .    .Int 1 .         <<R9241>>07655000
                                  ........    ........         <<R9241>>07660000
                                                               <<R9241>>07665000
                                                               <<R9241>>07670000
Soft Interrupt Queue Entry Format.                             <<R9241>>07675000
                                                               <<R9241>>07680000
     ...............................                           <<R9241>>07685000
   0 . Soft int msg word zero      . 0                         <<R9241>>07690000
     ...............................                           <<R9241>>07695000
   1 . Soft int msg word one       . 1                         <<R9241>>07700000
     ...............................                           <<R9241>>07705000
   2 . Int handler's plabel        . 2                         <<R9241>>07710000
     ...............................                           <<R9241>>07715000
   3 . Soft int subtype            . 3                         <<R9241>>07720000
     ...............................                           <<R9241>>07725000
                                                               <<R9241>>07730000
;                                                              <<R9241>>07735000
$PAGE "PCB FIELDS USED BY SOFTWARE INTERRUPTS."                <<R9241>>07740000
COMMENT                                                        <<R9241>>07745000
                                                               <<R9241>>07750000
Process Control Block Fields.                                  <<R9241>>07755000
----------------------------                                   <<R9241>>07760000
                                                               <<R9241>>07765000
                                                               <<R9241>>07770000
Field name    Location      New  Description                   <<R9241>>07775000
------------- ------------  ---- ------------------------------<<R9241>>07780000
                                                               <<R9241>>07785000
SPCBCritSir    PCB.(2:2)     No   Nonzero if the process is    <<R9241>>07790000
                                  critical or with sir.        <<R9241>>07795000
                                                               <<R9241>>07800000
SPCBPIOvrFlag  PCB.(4:1)     No   Set when the execution of the<<R9241>>07805000
                                  soft interrupt must be postpo<<R9241>>07810000
                                  due to the process's being   <<R9241>>07815000
                                  critical, with sir, or impede<<R9241>>07820000
                                  Tells the appropriate kernel <<R9241>>07825000
                                  procedure to enter PSEUDOINT.<<R9241>>07830000
                                                               <<R9241>>07835000
SPCBDelaySoft  PCB.(14:1)    Yes  Set when the execution of the<<R9241>>07840000
                                  soft interrupt must be delaye<<R9241>>07845000
                                  critical, impeded, with sir, <<R9241>>07850000
                                  system code, or privileged co<<R9241>>07855000
                                  This bit tells the bounds    <<R9241>>07860000
                                  violation procedure in ININ t<<R9241>>07865000
                                  a soft interrupt is pending. <<R9241>>07870000
                                  The Dispatcher ignores this b<<R9241>>07875000
                                                               <<R9241>>07880000
SPCBWaitField  PCB(4).(0:12) No   Indicates which events (if an<<R9241>>07885000
                                  that the user process is wait<<R9241>>07890000
                                  on.  Does not include system <<R9241>>07895000
                                  events such as memory wait.  <<R9241>>07900000
                                                               <<R9241>>07905000
SPCBImpede     PCB(4).(12:1) No   Set when the process is imped<<R9241>>07910000
                                                               <<R9241>>07915000
SPCBPSim       PCB(8).(0:3)  No   Current value of process's   <<R9241>>07920000
                                  pseudo interrupt state.      <<R9241>>07925000
                                                               <<R9241>>07930000
SPCBWakeSoft   PCB(8).(3:1)  Yes  Set on when the process will <<R9241>>07935000
                                  accept the soft interrupt eve<<R9241>>07940000
                                  though it is waiting on other<<R9241>>07945000
                                  events.                      <<R9241>>07950000
                                                               <<R9241>>07955000
SPCBSoftInt    PCB(9).(9:1)       Set when the Dispatcher (and <<R9241>>07960000
                                  PSEUDOINT) should be aware of<<R9241>>07965000
                                  pending soft interrupt.      <<R9241>>07970000
                                                               <<R9241>>07975000
SPCBPIFlags    PCB(9).(10:6) No   Specifies which of the six,  <<R9241>>07980000
                                  independent pseudo interrupts<<R9241>>07985000
                                  may be pending against the   <<R9241>>07990000
                                  process.                     <<R9241>>07995000
                                                               <<R9241>>08000000
SPCBAllowSoft  PCB(13).(7:1) Yes  On implies that the process w<<R9241>>08005000
                                  process user soft interrupts.<<R9241>>08010000
                                  zero value postpones processi<<R9241>>08015000
                                  of user soft interrupts (but <<R9241>>08020000
                                  system soft interrupts).  Thi<<R9241>>08025000
                                  bit is managed by the user   <<R9241>>08030000
                                  through FINTSTATE and FINTEXI<<R9241>>08035000
;                                                              <<R9241>>08040000
$PAGE "SOFTWARE INTERRUPT MMSTAT ENTRY FORMATS."               <<R9241>>08045000
COMMENT                                                        <<R9241>>08050000
                                                               <<R9241>>08055000
MMSTAT Entry Formats.                                          <<R9241>>08060000
--------------------                                           <<R9241>>08065000
                                                               <<R9241>>08070000
MMSTAT tracing for the following types is enabled only if the  <<R9241>>08075000
"monitoring" has been turned on by the MON command.            <<R9241>>08080000
                                                               <<R9241>>08085000
Type          Number  Word 0       Word 1        Word 2        <<R9241>>08090000
------------- ------- ------------ ------------- --------------<<R9241>>08095000
                                                               <<R9241>>08100000
Cause soft    240     (0:4)  level Msg word one  Msg word two  <<R9241>>08105000
interrupt             (4:2)  type                              <<R9241>>08110000
                      (6:2)  stype                             <<R9241>>08115000
                      (8:8)  pin                               <<R9241>>08120000
                                                               <<R9241>>08125000
Pseudoint     241     (0:8)  type  Msg word one  Msg word two  <<R9241>>08130000
                      (8:8)  stype                             <<R9241>>08135000
                                                               <<R9241>>08140000
                                                               <<R9241>>08145000
Build stack   242     Plabel       Preg word of  Status word of<<R9241>>08150000
                                   prev marker   prev marker   <<R9241>>08155000
                                                               <<R9241>>08160000
CHANGE STATE  243     (14:1) old   User's        User's status <<R9241>>08165000
                             state P register    register      <<R9241>>08170000
                      (15:1) new                               <<R9241>>08175000
                             state                             <<R9241>>08180000
                                                               <<R9241>>08185000
TIMEOUT       244     Compltn type 16 msb of     16 lsb of     <<R9241>>08190000
                      0 timeout    timeout (ms)  timeout (ms)  <<R9241>>08195000
                      1 no trlx                                <<R9241>>08200000
                      2 control y                              <<R9241>>08205000
                        soft int                               <<R9241>>08210000
                                                               <<R9241>>08215000
where:                                                         <<R9241>>08220000
                                                               <<R9241>>08225000
   level          The current status of the interrupt/process  <<R9241>>08230000
                                                               <<R9241>>08235000
                  0  process is dying (hard kill or soft kill) <<R9241>>08240000
                                                               <<R9241>>08245000
                  1  other soft interrupts are pending         <<R9241>>08250000
                                                               <<R9241>>08255000
                  2  user interrupts are disabled              <<R9241>>08260000
                                                               <<R9241>>08265000
                  3  process is impeded, critical, and/or with <<R9241>>08270000
                     sir                                       <<R9241>>08275000
                                                               <<R9241>>08280000
                  4  interrupt was against own process         <<R9241>>08285000
                                                               <<R9241>>08290000
                  5  process was either waiting or ready to    <<R9241>>08295000
                     execute                                   <<R9241>>08300000
                                                               <<R9241>>08305000
                  6  process would have been readied but wasn't<<R9241>>08310000
                     due to caller's specification             <<R9241>>08315000
                                                               <<R9241>>08320000
                  7  process was readied                       <<R9241>>08325000
                                                               <<R9241>>08330000
   type           The type of the soft interrupt.              <<R9241>>08335000
                                                               <<R9241>>08340000
                  0  user                                      <<R9241>>08345000
                                                               <<R9241>>08350000
                  1  system                                    <<R9241>>08355000
                                                               <<R9241>>08360000
   stype          The subtype of the soft interrupt.           <<R9241>>08365000
                                                               <<R9241>>08370000
                  user type                                    <<R9241>>08375000
                                                               <<R9241>>08380000
                    0  no preprocessing                        <<R9241>>08385000
                    1  file system interrupt                   <<R9241>>08390000
                                                               <<R9241>>08395000
                  system type                                  <<R9241>>08400000
                                                               <<R9241>>08405000
                    0  no preprocessing                        <<R9241>>08410000
                    1  debug invocation                        <<R9241>>08415000
                                                               <<R9241>>08420000
   old state      Previous state of user soft interrupts       <<R9241>>08425000
                                                               <<R9241>>08430000
                  0  disabled                                  <<R9241>>08435000
                                                               <<R9241>>08440000
                  1  enabled                                   <<R9241>>08445000
                                                               <<R9241>>08450000
   new state      New state of user soft interrupts            <<R9241>>08455000
                                                               <<R9241>>08460000
                  0  disabled                                  <<R9241>>08465000
                                                               <<R9241>>08470000
                  1 enabled                                    <<R9241>>08475000
                                                               <<R9241>>08480000
;                                                              <<R9241>>08485000
$PAGE "SOFTWARE INTERRUPTS.  PROLOGUE."                        <<R9241>>08490000
COMMENT                                                        <<R9241>>08495000
                                                               <<R9241>>08500000
Software Interrupts                                            <<R9241>>08505000
-------------------                                            <<R9241>>08510000
                                                               <<R9241>>08515000
Software interrupts provide a mechanism to interrupt the       <<R9241>>08520000
executing sequence of a selected process, and to cause that    <<R9241>>08525000
process to execute a specified sequence of code.  When the soft<<R9241>>08530000
interrupt code completes, the state of the interrupted process <<R9241>>08535000
restored to that preceding the soft interrupt, and thus the    <<R9241>>08540000
process resumes its normal execution.  Multiple simultaneous   <<R9241>>08545000
interrupts will be executed in a fifo manner.                  <<R9241>>08550000
                                                               <<R9241>>08555000
Soft interrupts may be initiated from any environment, includin<<R9241>>08560000
the ICS, since invoking soft interrupts does not wait the calle<<R9241>>08565000
                                                               <<R9241>>08570000
                                                               <<R9241>>08575000
a) Causing software interrupts.                                <<R9241>>08580000
                                                               <<R9241>>08585000
   The kernel procedure which issues soft interrupts against a <<R9241>>08590000
   target process is CAUSESOFTINT.  Currently it recognizes two<<R9241>>08595000
   types of soft interrupts:                                   <<R9241>>08600000
                                                               <<R9241>>08605000
     1) User soft interrupts.                                  <<R9241>>08610000
                                                               <<R9241>>08615000
        These interrupts are only processed while in the user's<<R9241>>08620000
        code.  Additionally the user may enable/disable them wi<<R9241>>08625000
        the FINTSTATE intrinsic.  File system soft interrupts a<<R9241>>08630000
        are included in this type of interrupt.                <<R9241>>08635000
                                                               <<R9241>>08640000
     2) System soft interrupts.                                <<R9241>>08645000
                                                               <<R9241>>08650000
        System interrupts may execute while in system code (but<<R9241>>08655000
        not while critical, with sir, impeded, or waiting).  Th<<R9241>>08660000
        user may not disable them.                             <<R9241>>08665000
                                                               <<R9241>>08670000
                                                               <<R9241>>08675000
   The subtype and plabel of the soft interrupt handler is     <<R9241>>08680000
   supplied as an input parameter to CAUSESOFTINT.  This plabel<<R9241>>08685000
   must specify code which is within the interrupted process's <<R9241>>08690000
   code address space.  A short control message (max of two    <<R9241>>08695000
   words) may be sent along with the soft interrupt for use by <<R9241>>08700000
   the soft interrupt handler.                                 <<R9241>>08705000
                                                               <<R9241>>08710000
   CAUSESOFTINT first checks that the target process is healthy<<R9241>>08715000
   (not in soft or hard kill mode).  It then sends a message to<<R9241>>08720000
   the process's appropriate soft interrupt queue.  Each queue <<R9241>>08725000
   actually a kernel "in core" ipc port.  User interrupts are  <<R9241>>08730000
   sent to port number one whereas system interrupts go to port<<R9241>>08735000
   number two.                                                 <<R9241>>08740000
                                                               <<R9241>>08745000
   If this is the first message in the queue and there are no  <<R9241>>08750000
   other soft interrupts pending then:                         <<R9241>>08755000
                                                               <<R9241>>08760000
     1. Process is not critical, with sir, impeded, or waiting.<<R9241>>08765000
                                                               <<R9241>>08770000
        The soft interrupt bit is set in its PCB.  Since it is <<R9241>>08775000
        waiting, it must already be on the dispatcher queue so <<R9241>>08780000
        no further action is required.                         <<R9241>>08785000
                                                               <<R9241>>08790000
     2. Process is not critical, with sir, or impeded, but it i<<R9241>>08795000
        waiting.                                               <<R9241>>08800000
                                                               <<R9241>>08805000
        If the "wake soft interrupt" bit is set in the PCB, the<<R9241>>08810000
        the process can handle the soft interrupt even though i<<R9241>>08815000
        waiting on some other event.  The wake-soft-int bit is <<R9241>>08820000
        (thus signaling the process that it was awakened by a  <<R9241>>08825000
        soft interrupt).  Additionally its wait field is cleare<<R9241>>08830000
        the "delay soft interrupt" bit is set in the PCB.      <<R9241>>08835000
                                                               <<R9241>>08840000
        Processes which are waiting and do not have the        <<R9241>>08845000
        wake-soft-interrupt bit set must be allowed to         <<R9241>>08850000
        finish their processing before the soft interrupt occur<<R9241>>08855000
        Thus they should not be awakened until whatever they   <<R9241>>08860000
        specified in their wait field occurs.  When the process<<R9241>>08865000
        is ready to launch, the Dispatcher will notice the soft<<R9241>>08870000
        bit and launch the process into PSEUDOINT.             <<R9241>>08875000
                                                               <<R9241>>08880000
     2. The process has some combination of critical, with sir,<<R9241>>08885000
        or impede.                                             <<R9241>>08890000
                                                               <<R9241>>08895000
        The delayed-soft-int bit and the pseudo-interrupt      <<R9241>>08900000
        overflow bits are set in the PCB.  This cuts the       <<R9241>>08905000
        Dispatcher out of the picture but leaves marks such    <<R9241>>08910000
        that when the inhibiting conditions are removed,       <<R9241>>08915000
        PSEUDOINT will be invoked.  That is, RELSIR and        <<R9241>>08920000
        RESETCRITICAL both look at the pseudoint overflow flag <<R9241>>08925000
        the PCB and call PSEUDOINT if the flag is set.         <<R9241>>08930000
                                                               <<R9241>>08935000
b) Servicing soft interrupts                                   <<R9241>>08940000
                                                               <<R9241>>08945000
   This subsection describes the action the target process take<<R9241>>08950000
   to process a software interrupt.                            <<R9241>>08955000
                                                               <<R9241>>08960000
   Dispatcher                                                  <<R9241>>08965000
                                                               <<R9241>>08970000
      When the process is about to be launched by the dispatche<<R9241>>08975000
      the PCB soft interrupt bit is checked.  If it is set and <<R9241>>08980000
      the process is not critical or with sir, PSEUDOINT is    <<R9241>>08985000
      invoked.  Note that RELSIR and RESETCRITICAL will invoke <<R9241>>08990000
      PSEUDOINT later if the process was with sir or critical, <<R9241>>08995000
      respectively.                                            <<R9241>>09000000
                                                               <<R9241>>09005000
   First PSEUDOINT invocation.                                 <<R9241>>09010000
                                                               <<R9241>>09015000
      Backing out of PAUSE/IOWAIT.                             <<R9241>>09020000
                                                               <<R9241>>09025000
         If the process was awakened by a soft interrupt instea<<R9241>>09030000
         of the expected event, then the kernel WAIT procedure <<R9241>>09035000
         will note this before exiting to its caller.  It notif<<R9241>>09040000
         the caller with a CCG condition code.                 <<R9241>>09045000
                                                               <<R9241>>09050000
         IOWAIT and PAUSE will note that a soft interrupt      <<R9241>>09055000
         occurred, undo any processing they had done (for      <<R9241>>09060000
         example, PAUSE will cancel its timeout), set the      <<R9241>>09065000
         caller's stack marker to recall the intrinsic, and    <<R9241>>09070000
         invoke PSEUDOINT by causing a bounds violation through<<R9241>>09075000
         ININ on the intrinsic's exit (for a complete descripti<<R9241>>09080000
         of this way, see the paragraph of the delayed PSEUDOIN<<R9241>>09085000
         execution below).                                     <<R9241>>09090000
                                                               <<R9241>>09095000
      System soft interrupts.                                  <<R9241>>09100000
                                                               <<R9241>>09105000
         As a general rule these interrupts are executed straig<<R9241>>09110000
         away.  They are "pcaled" rather than being exited into<<R9241>>09115000
                                                               <<R9241>>09120000
         These interrupt procedures must be coded in one of thr<<R9241>>09125000
         ways:                                                 <<R9241>>09130000
                                                               <<R9241>>09135000
            1. procedure INTHANDLER                            <<R9241>>09140000
                                                               <<R9241>>09145000
            2. procedure INTHANDLER(Msg)                       <<R9241>>09150000
               value Msg                                       <<R9241>>09155000
               integer MSG                                     <<R9241>>09160000
                                                               <<R9241>>09165000
            3. procedure INTHANDLER(Msg0,Msg1)                 <<R9241>>09170000
               value Msg0,Msg1.                                <<R9241>>09175000
               integer Msg0,Msg1.                              <<R9241>>09180000
                                                               <<R9241>>09185000
         The above procedure head declarations are for zero, on<<R9241>>09190000
         and two message parameters, respectively.             <<R9241>>09195000
                                                               <<R9241>>09200000
         Software interrupts with nonzero subtype values will  <<R9241>>09205000
         have subtype-specific preprocessing done for them.    <<R9241>>09210000
         Since system soft interrupts have their own queue, the<<R9241>>09215000
         are not delayed if user soft interrupts are delayed.  <<R9241>>09220000
         All system interrupts are processed before user       <<R9241>>09225000
         interrupts are considered.  Note also that system     <<R9241>>09230000
         interrupts occur without the process's user code being<<R9241>>09235000
         aware of it.                                          <<R9241>>09240000
                                                               <<R9241>>09245000
      User soft interrupts                                     <<R9241>>09250000
                                                               <<R9241>>09255000
         PSEUDOINT checks that the user has soft interrupts    <<R9241>>09260000
         enabled.  If not then PSEUDOINT returns to the interru<<R9241>>09265000
         code.  When the user reenables soft interrupts with   <<R9241>>09270000
         either FINTSTATE or FINTEXIT, they will check for any <<R9241>>09275000
         pending soft interrupts by testing the user soft      <<R9241>>09280000
         interrupt port.                                       <<R9241>>09285000
                                                               <<R9241>>09290000
         Next it is determined if the interrupt can be executed<<R9241>>09295000
         right away.  That is, the process cannot be executing <<R9241>>09300000
         system code and if we are interrupting privileged user<<R9241>>09305000
         code, the user interrupt procedure must be privileged.<<R9241>>09310000
         If the procedure is compatible then the code described<<R9241>>09315000
         in "Second PSEUDOINT invocation" is executed.  Delayed<<R9241>>09320000
         execution is effected by setting the delayed soft     <<R9241>>09325000
         interrupt bit in the PCB and by setting bit zero of th<<R9241>>09330000
         P register save word of the first eligible stack marke<<R9241>>09335000
         The exit instruction against this stack marker will   <<R9241>>09340000
         cause a bounds violation trap to ININ, which will note<<R9241>>09345000
         that a soft interrupt is pending and invoke PSEUDOINT <<R9241>>09350000
         its secondary entry point, DELAYEDINT.                <<R9241>>09355000
                                                               <<R9241>>09360000
      Second PSEUDOINT invocation.                             <<R9241>>09365000
                                                               <<R9241>>09370000
         PSEUDOINT gets the interrupt's first in-core ipc messa<<R9241>>09375000
         and:                                                  <<R9241>>09380000
                                                               <<R9241>>09385000
           1. performs any required preprocessing (subtype <> 0<<R9241>>09390000
                                                               <<R9241>>09395000
           2. disables user soft interrupts,                   <<R9241>>09400000
                                                               <<R9241>>09405000
           3. builds the stack marker for the interrupt handler<<R9241>>09410000
                                                               <<R9241>>09415000
           4. and exits through it.                            <<R9241>>09420000
                                                               <<R9241>>09425000
;                                                              <<R9241>>09430000
$PAGE "DATA STRUCTURE INDEPENDENT INFORMATION PROCEDURES"      <<R9241>>09435000
$PAGE "SOFT INTERRUPTS. BUILDSTACKMARKER PROCEDURE."           <<R9241>>09440000
PROCEDURE BUILDSTACKMARKER(LOC,PLABEL);                        <<R9241>>09445000
VALUE LOC,PLABEL;                                              <<R9241>>09450000
                                                               <<R9241>>09455000
COMMENT FUNCTION                                               <<R9241>>09460000
  BUILDS A STACK MARKER BASED ON THE PLABEL PARAMETER.;        <<R9241>>09465000
                                                               <<R9241>>09470000
<<INPUT>>                                                      <<R9241>>09475000
  INTEGER                                                      <<R9241>>09480000
    LOC;         COMMENT    LOCATION OF THE DESIRED STACK MARKE<<R9241>>09485000
                            RELATIVE TO THE CALLER'S Q.  IT    <<R9241>>09490000
                            IS THE NUMBER OF WORDS FROM THE    <<R9241>>09495000
                            CALLER'S Q+0 TO THE FIRST WORD     <<R9241>>09500000
                            OF THE STACK MARKER (X REGISTER SAV<<R9241>>09505000
                            THIS WORD MUST BE POSITIVE.;       <<R9241>>09510000
  LOGICAL                                                      <<R9241>>09515000
    PLABEL;               <<TRAP PROCEDURE'S PLABEL.>>         <<R9241>>09520000
                                                               <<R9241>>09525000
  <<OUTPUT THE DESIRED STACK MARKER>>                          <<R9241>>09535000
                                                               <<R9241>>09540000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>09545000
                                                               <<R9241>>09550000
BEGIN                                                          <<R9241>>09555000
INTEGER                                                        <<R9241>>09560000
   DELTAQ=Q+0,INDEX,CSTN;                                      <<R9241>>09565000
ARRAY                                                          <<R9241>>09570000
   STACK(*)=Q+0;                                               <<R9241>>09575000
DEFINE                                                         <<R9241>>09580000
   PRIVINTERRUPTEE = LOG(STACK(-STACK-1).(0:1))#;              <<R9241>>09585000
                                                               <<R9241>>09590000
                                                               <<R9241>>09595000
<<INITIALIZE>>                                                 <<R9241>>09600000
INDEX:=LOC-DELTAQ;                                             <<R9241>>09605000
IF GLOBALTRACEFLAG THEN                                        <<R9241>>09610000
   MMSTAT'(MMBUILDMARKER,PLABEL,STACK(-DELTAQ-2),STACK(X+1),   <<R9241>>09615000
          0,0,0);                                              <<R9241>>09620000
                                                               <<R9241>>09625000
<<CONFIGURE THE STATUS WORD>>                                  <<R9241>>09630000
TOS:=PLABEL.(8:8);                                             <<R9241>>09635000
TOS.(1:1):=1;  <<ENABLE INTERRUPTS>>                           <<R9241>>09640000
IF PRIVINTERRUPTEE THEN  <<INTERRUPTEE PRIVILEGED?>>           <<R9241>>09645000
   TOS.(0:1):=1  <<YES, THEN SO SHALL THE TRAP PROCEDURE>>     <<R9241>>09650000
ELSE                                                           <<R9241>>09655000
   BEGIN  <<NO, GET TRAP HANDLER'S TRUE MODE FROM THE CST>>    <<R9241>>09660000
      X:=CSTCONV(PLABEL,0);                                    <<R9241>>09665000
      TOS.(0:1):=DST(X).(1:1);                                 <<R9241>>09670000
   END;                                                        <<R9241>>09675000
STACK(INDEX+2):=TOS;  <<STATUS REGISTER>>                      <<R9241>>09680000
                                                               <<R9241>>09685000
<<CONFIGURE REMAINDER OF THE MARKER>>                          <<R9241>>09690000
STACK(INDEX):=0;  <<X REGISTER>>                               <<R9241>>09695000
STACK(INDEX+1):=CONVEXTLABELTODELTAP(PLABEL); <<P-REGISTER>>   <<R9241>>09700000
IF MAPPINGFIRMWARE THEN                                        <<R9241>>09705000
   STACK(INDEX+1).(1:1):=PLABEL.(0:1); <<MAPPING FLAG>>        <<R9241>>09710000
STACK(INDEX+3):=LOC+3;  <<DELTA Q>>                            <<R9241>>09715000
                                                               <<R9241>>09720000
<<HOOK INTO THE NEW MARKER>>                                   <<R9241>>09725000
DELTAQ:=DELTAQ-LOC-3;                                          <<R9241>>09730000
END;  <<BUILDSTACKMARKER>>                                     <<R9241>>09735000
LOGICAL PROCEDURE SYSTEM'SEGMENT(STATUS',DELTAP);              <<R9241>>09740000
VALUE STATUS',DELTAP;                                          <<R9241>>09745000
LOGICAL STATUS',DELTAP;                                        <<R9241>>09750000
BEGIN                                                          <<R9241>>09755000
INTEGER                                                        <<R9241>>09760000
   SEG'NUM;                                                    <<R9241>>09765000
SYSTEM'SEGMENT := FALSE;                                       <<R9241>>09770000
TOS := 0D; << for the return of MAPPEDCSTTOPHYCST >>           <<R9241>>09775000
TOS := STATUS'.(8:8);                                          <<R9241>>09780000
TOS.(0:1) := DELTAP.(1:1);                                     <<R9241>>09785000
TOS := CURPRC;                                                 <<R9241>>09790000
TOS := MAPPEDCSTTOPHYCST(*,*);                                 <<R9241>>09795000
DELB;                                                          <<R9241>>09800000
SEG'NUM := TOS;                                                <<R9241>>09805000
IF MARKER'IS'SL'SEG(STATUS',DELTAP,0) AND                      <<R9241>>09810000
   LOG(SL(SEG'NUM & LSL(2) + 1).SYSTEMFLAG) THEN               <<R9241>>09815000
   SYSTEM'SEGMENT := TRUE;                                     <<R9241>>09820000
END;                                                           <<R9241>>09825000
$PAGE "SOFTWARE INTERRUPTS.  PSEUDOINT PROCEDURE."             <<R9241>>09830000
PROCEDURE PSEUDOINT;                                           <<R9241>>09835000
COMMENT                                                        <<R9241>>09840000
  PROCESSES ALL PSEUDO INTERRUPTS AND SOFTWARE INTERRUPTS.  ASS<<R9241>>09845000
  THAT IT IS CALLED PESUDODISABLED WITH INTERRUPTS OFF.  DB MAY<<R9241>>09850000
  AT ANY DATA SEGMENT (INCLUDING SYSTEM DB AND THE STACK).;    <<R9241>>09855000
                                                               <<R9241>>09860000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>09865000
                                                               <<R9241>>09870000
BEGIN                                                          <<R9241>>09875000
EQUATE                                                         <<R9241>>09880000
   RETURN0        = %31400,                                    <<R9241>>09885000
   STDINLOGDEV    = 8,                                         <<R9241>>09890000
   ABTYP          = [8/1,8/5],  <<HARD KILL ABORT CODE>>       <<R9241>>09895000
   ENABLELAUNCH   = TRUE,                                      <<R9241>>09900000
   NOPENABLE      = FALSE,                                     <<R9241>>09905000
   PRIMARYENTRY   = TRUE,                                      <<R9241>>09910000
   NOWAITDONE     = -1,                                        <<R9241>>09915000
   PRIVMODE       = FALSE;                                     <<R9241>>09920000
                                                               <<R9241>>09925000
EQUATE                                                         <<R9241>>09930000
   SOFTINTERRUPT  = 7;                                         <<R9241>>09935000
                                                               <<R9241>>09940000
ENTRY                                                          <<R9241>>09945000
   DELAYEDINT;                                                 <<R9241>>09950000
INTEGER                                                        <<R9241>>09955000
   CUTBACK:=0;  <<MUST BE AT Q+1>>                             <<R9241>>09960000
DOUBLE                                                         <<R9241>>09965000
  MSG0,MSG1;  <<MUST BE AT Q+2>>                               <<R9241>>09970000
INTEGER                                                        <<R9241>>09975000
   NEWINTERRUPT,SON,NEXT,MAIN,STACKMARKERNUM,DEPTHLIMIT,       <<R9241>>09980000
   I,PCBXLOC,X=X,DELTAQ,MARKERNUM,PCBPT,PLABEL=MSG1+1,         <<R9241>>09985000
   SVALUE;                                                     <<R9241>>09990000
LOGICAL                                                        <<R9241>>09995000
   PXFIXEDLOC,                                                 <<R9241>>10000000
   PROCESSREQUEST;                                             <<R9241>>10005000
                                                               <<R9241>>10010000
                                                               <<R9241>>10015000
SUBROUTINE PEXIT(ENABLELAUNCH);                                <<R9241>>10020000
VALUE ENABLELAUNCH;                                            <<R9241>>10025000
LOGICAL ENABLELAUNCH;                                          <<R9241>>10030000
   BEGIN                                                       <<R9241>>10035000
   IF ENABLELAUNCH THEN PENABLE;                               <<R9241>>10040000
   TOS:=RETURN0+CUTBACK;                                       <<R9241>>10045000
   ASMB(XEQ);                                                  <<R9241>>10050000
   END;  <<PEXIT>>                                             <<R9241>>10055000
SUBROUTINE INITIALIZE;                                         <<R9241>>10060000
   BEGIN  <<INITIALIZE LOCAL VARIABLES>>                       <<R9241>>10065000
   PXFIXED;                                                    <<R9241>>10070000
   PCBPT := (CURPRC);                                          <<R9241>>10075000
   END;  <<INITIALIZE>>                                        <<R9241>>10080000
                                                               <<R9241>>10085000
                                                               <<R9241>>10090000
LOGICAL SUBROUTINE FINDTARGETMARKER(NONPRIV);                  <<R9241>>10095000
VALUE NONPRIV;                                                 <<R9241>>10100000
COMMENT                                                        <<R9241>>10105000
  SCANS BACKWARD THROUGH THE STACK UNTIL IT FINDS THE FIRST    <<R9241>>10110000
  SUITABLE USER STACK MARKER.;                                 <<R9241>>10115000
                                                               <<R9241>>10120000
<<INPUT>>                                                      <<R9241>>10125000
  LOGICAL                                                      <<R9241>>10130000
    NONPRIV;        <<TRUE IF USER PROCEDURE MUST BE EXECUTIN>><<R9241>>10135000
                     << IN NON-PRIVILEGED MODE.>>              <<R9241>>10140000
COMMENT                                                        <<R9241>>10145000
  OUTPUT                                                       <<R9241>>10150000
  FINDTARGETMARKER      TRUE  - MARKER WAS THE ONE AT Q+0      <<R9241>>10155000
                        FALSE - MARKER WAS FURTHER BACK, BIT ZE<<R9241>>10160000
                                OF THE P-REGISTER SAVE WORD IS <<R9241>>10165000
                                TO FORCE THE EXIT INTO ININ (WI<<R9241>>10170000
                                BOUNDS VIOLATION).;            <<R9241>>10175000
                                                               <<R9241>>10180000
   BEGIN                                                       <<R9241>>10185000
   PUSH(Q,DL);                                                 <<R9241>>10190000
   DEPTHLIMIT:=TOS-TOS;   <<SET MAXIMUM STACK DEPTH LIMIT>>    <<R9241>>10195000
   I:=-1; MARKERNUM:=0;                                        <<R9241>>10200000
                                                               <<R9241>>10205000
COMMENT LOCATE THE MARKER.  CANNOT BE:                         <<R9241>>10210000
     1. IN SYSTEM SL                                           <<R9241>>10215000
     2. HAVE SYSTEM BIT SET ON IN CST                          <<R9241>>10220000
     3. PRIVILEGED, IF TRAP PROCEDURE IS USER MODE;            <<R9241>>10225000
   WHILE SYSTEM'SEGMENT(STACK(I),STACK(I-1)) OR                <<R9241>>10230000
         NONPRIV AND STACK(I)&CSL(1) DO                        <<R9241>>10235000
      BEGIN  <<INDEX BACK TO THE NEXT MARKER>>                 <<R9241>>10240000
      MARKERNUM:=MARKERNUM+1;                                  <<R9241>>10245000
      DELTAQ:=STACK(I+1);                                      <<R9241>>10250000
      IF DELTAQ < 4 OR -(I:=I-DELTAQ) > DEPTHLIMIT THEN        <<R9241>>10255000
         ABORT(MARKERNUM&LSL(8),22,0);  <<BAD MARKER IN STACK>><<R9241>>10260000
      END;                                                     <<R9241>>10265000
                                                               <<R9241>>10270000
   <<TALLY THE RESULT>>                                        <<R9241>>10275000
   IF MARKERNUM = 0 THEN                                       <<R9241>>10280000
      FINDTARGETMARKER:=TRUE                                   <<R9241>>10285000
   ELSE                                                        <<R9241>>10290000
      STACK(I-1).(0:1):=1;<<CAUSE TRAP TO ININ UPON USER MODE>><<R9241>>10295000
   END;  <<FINDTARGETMARKER>>                                  <<R9241>>10300000
SUBROUTINE SPECIALSYSTEMTRAP(PLABEL);                          <<R9241>>10305000
VALUE PLABEL;                                                  <<R9241>>10310000
LOGICAL PLABEL;                                                <<R9241>>10315000
                                                               <<R9241>>10320000
<<CAUSES TRAP TO OCCUR ON THE FIRST USER STACK MARKER.  >>     <<R9241>>10325000
<<NOTE - IF SUCCESSFUL, IT EXITS THIS PROCEDURE.>>             <<R9241>>10330000
                                                               <<R9241>>10335000
   BEGIN                                                       <<R9241>>10340000
   IF FINDTARGETMARKER(PRIVMODE) THEN                          <<R9241>>10345000
      BEGIN  <<CAN EXECUTE THE INTERRUPT NOW>>                 <<R9241>>10350000
      IF LOG(PORTSTATUS(SYSTEMSGPORT))                         <<R9241>>10355000
      OR LOG(PORTSTATUS(USERMSGPORT))AND LOG(SPCBALLOWSOFT)THEN<<R9241>>10360000
         BEGIN  <<ANOTHER SOFT INTERRUPT IS PENDING>>          <<R9241>>10365000
         STACK(-1).(0:1):=1; <<TRAP TO ININ ON SI PROC'S EXIT>><<R9241>>10370000
         SPCBDELAYSOFT:=1;                                     <<R9241>>10375000
         END;                                                  <<R9241>>10380000
      X:=PLABEL;                                               <<R9241>>10385000
      RECEIVEMSG(SYSTEMSGPORT,MAXMSGLEN,DELETEMSG);            <<R9241>>10390000
      BUILDSTACKMARKER(1,X); CUTBACK:=0;                       <<R9241>>10395000
      PEXIT(NOPENABLE);                                        <<R9241>>10400000
      END                                                      <<R9241>>10405000
   ELSE                                                        <<R9241>>10410000
      BEGIN  <<MUST POSTPONE THE EXECUTION>>                   <<R9241>>10415000
      DISABLE;                                                 <<R9241>>10420000
      SPCBDELAYSOFT:=1;                                        <<R9241>>10425000
      ENABLE;                                                  <<R9241>>10430000
      END;                                                     <<R9241>>10435000
   END;  <<SPECIALSYSTEMTRAP>>                                 <<R9241>>10440000
INTEGER SUBROUTINE PROCESSYSOFTINT;                            <<R9241>>10445000
COMMENT                                                        <<R9241>>10450000
  EAT AWAY AT THE PROCESS'S SYSTEM SOFT INTERRUPT QUEUE UNTIL  <<R9241>>10455000
  EITHER:                                                      <<R9241>>10460000
                                                               <<R9241>>10465000
   1. THE QUEUE IS EXHAUSTED (RETURNS TRUE),                   <<R9241>>10470000
                                                               <<R9241>>10475000
   2. OR THE HEAD INTERRUPT IS STALLED (RETURNS FALSE).        <<R9241>>10480000
                                                               <<R9241>>10485000
  MESSAGE FORMAT (S-REGISTER RELATIVE)                         <<R9241>>10490000
  S0    - REQUEST DEPENDENT PROCESSING TYPE                    <<R9241>>10495000
  S1    - INTERRUPT PROCEDURE'S PLABEL                         <<R9241>>10500000
  S2,S3 - INTERRUPT-TYPE DEPENDENT                             <<R9241>>10505000
                                                               <<R9241>>10510000
  NOTE - THE GENERAL CASE IS PCAL THE TRAP PROCEDURE FROM THIS <<R9241>>10515000
         SUBROUTINE (RATHER THAN BUILDING A STACK MARKER AND   <<R9241>>10520000
         EXITING THROUGH IT.;                                  <<R9241>>10525000
                                                               <<R9241>>10530000
   BEGIN                                                       <<R9241>>10535000
   <<INITIALIZE>>                                              <<R9241>>10540000
   PROCESSREQUEST:=TRUE;                                       <<R9241>>10545000
                                                               <<R9241>>10550000
   WHILE PROCESSREQUEST                                        <<R9241>>10555000
   AND (PROCESSYSOFTINT:=PORTSTATUS(-1)) = SYSTEMSGPORT DO     <<R9241>>10560000
      BEGIN  <<HAVE AN INTERRUPT TO PROCESS>>                  <<R9241>>10565000
      PUSH(S); SVALUE:=TOS;<<TRAP PROC MAY NOT DEL THEIR PARM>><<R9241>>10570000
      ASMB(ADDS MAXMSGLEN);  <<SO SAVE THE PROPER S VALUE.>>   <<R9241>>10575000
      RECEIVEMSG(SYSTEMSGPORT,MAXMSGLEN,SAVEMSG);              <<R9241>>10580000
      IF <> THEN SUDDENDEATH(UGLYPSEUDOINT);                   <<R9241>>10585000
      IF GLOBALTRACEFLAG THEN                                  <<R9241>>10590000
         MMSTAT'(MMPROCESS,SYSOFTINT CAT S0(0:8:8),S3,S2,      <<R9241>>10595000
                 0,0,0);                                       <<R9241>>10600000
      TOS:=TOS.(1:15); <<MASK OFF MODE BIT>>                   <<R9241>>10605000
      CASE TOS OF                                              <<R9241>>10610000
         BEGIN  <<REQUEST DEPENDENT PROCESSING>>               <<R9241>>10615000
         ;                    <<0 - NO OPERATION>>             <<R9241>>10620000
         BEGIN                <<1 - DEBUG>>                    <<R9241>>10625000
         SPECIALSYSTEMTRAP(LOG(@DEBUG));                       <<R9241>>10630000
         PROCESSREQUEST:=FALSE;                                <<R9241>>10635000
         END;                                                  <<R9241>>10640000
         END;  <<CASE>>                                        <<R9241>>10645000
      IF PROCESSREQUEST THEN                                   <<R9241>>10650000
         BEGIN  <<INVOKE THE TRAP'S HANDLER>>                  <<R9241>>10655000
         RECEIVEMSG(SYSTEMSGPORT,MAXMSGLEN,DELETEMSG); DEL;    <<R9241>>10660000
         IF S0 <> 0 THEN ASMB(PCAL 0);                         <<R9241>>10665000
         END;                                                  <<R9241>>10670000
      TOS:=SVALUE; SET(S);                                     <<R9241>>10675000
      END;                                                     <<R9241>>10680000
                                                               <<R9241>>10685000
   END;  <<PROCESSYSOFTINT>>                                   <<R9241>>10690000
                                                               <<R9241>>10695000
                                                               <<R9241>>10700000
SUBROUTINE PROCESSOFTINT;                                      <<R9241>>10705000
                                                               <<R9241>>10710000
<<PROCESS ALL THE PROCESS'S SOFTWARE INTERRUPTS.>>             <<R9241>>10715000
                                                               <<R9241>>10720000
   BEGIN                                                       <<R9241>>10725000
   DISABLE; SPCBSOFTINT:=0; SPCBDELAYSOFT:=0; ENABLE;          <<R9241>>10730000
   IF PROCESSYSOFTINT = USERMSGPORT AND LOG(SPCBALLOWSOFT) THEN<<R9241>>10735000
      BEGIN  <<OK TO PROCESS USER MODE SOFT INTERRUPTS>>       <<R9241>>10740000
COMMENT GET HEAD SOFT INTERRUPT                                <<R9241>>10745000
        MESSAGE FORMAT                                         <<R9241>>10750000
        S0    - REQUEST DEPENDENT PROCESSING TYPE  (SUBTYPE)   <<R9241>>10755000
                CauseSoftInt actually uses bit 0 of the        <<R9241>>10760000
                SubType to signify priv/non-priv. This info    <<R9241>>10765000
                will be used by FindTargetMarker.              <<R9241>>10770000
        S1    - Interrupt procedure's Plabel.                  <<R9241>>10775000
        S2,S3 - Interrupt dependent type. ;                    <<R9241>>10780000
                                                               <<R9241>>10785000
      ASMB(ADDS 4);                                            <<R9241>>10790000
      RECEIVEMSG(USERMSGPORT,4,SAVEMSG);                       <<R9241>>10795000
      IF <> THEN SUDDENDEATH(UGLYPSEUDOINT);                   <<R9241>>10800000
      IF GLOBALTRACEFLAG THEN                                  <<R9241>>10805000
         MMSTAT'(MMPROCESS,USERSOFTINT CAT S0(0:8:8),S3,S2,    <<R9241>>10810000
                0,0,0);                                        <<R9241>>10815000
                                                               <<R9241>>10820000
      << NOTE: S0 is the SubType field from CauseSoftInt >>    <<R9241>>10825000
                                                               <<R9241>>10830000
      IF FINDTARGETMARKER(S0.(0:1)) THEN                       <<R9241>>10835000
         BEGIN  <<WILL EXIT INTO THE TRAP PROCEDURE>>          <<R9241>>10840000
         RECEIVEMSG(USERMSGPORT,4,DELETEMSG);                  <<R9241>>10845000
         SPCBALLOWSOFT:=0;                                     <<R9241>>10850000
                                                               <<R9241>>10855000
                                                               <<R9241>>10860000
         << Get rid of the mode (i.e. priv/non priv) of the >> <<R9241>>10865000
         << interrupt procedure and save the file number.   >> <<R9241>>10870000
                                                               <<R9241>>10875000
         S0 := S0.(1:15); << Get rid of priv/non-priv bit.  >> <<R9241>>10880000
         CASE TOS OF                                           <<R9241>>10885000
            BEGIN  <<REQUEST DEPENDENT PROCESSING>>            <<R9241>>10890000
            ;                                <<0 - NO ACTION>> <<R9241>>10895000
            BEGIN                            <<1 - MSG FILE>>  <<R9241>>10900000
                                                               <<R9241>>10905000
            << Note : S1 is really the file number           >><<R9241>>10910000
                                                               <<R9241>>10915000
            FCPREPAFT(S1,NOWAITDONE);                          <<R9241>>10920000
            TOS:=DQM3;TOS:=DQM1;<<REMV CUTBCK PARM(ININ CALL)>><<R9241>>10925000
            X:=-CUTBACK+1;  <<BUT LEAVE ROOM FOR FILE NUMBER>> <<R9241>>10930000
            STACK(X):=TOS-CUTBACK+1; STACK(X:=X-1):=TOS;       <<R9241>>10935000
            STACK(X:=X-1):=TOS; STACK(X:=X-1):=TOS;            <<R9241>>10940000
            PUSH(Q); TOS:=TOS+X+3; SET(Q); INITIALIZE;         <<R9241>>10945000
            QM4:=S1;  <<RETURN FILE NUMBER>>                   <<R9241>>10950000
            END;                                               <<R9241>>10955000
                                                               <<R9241>>10960000
            BEGIN                        <<2 - PORT PROCEDURE>><<R9241>>10965000
            FCPREPAFT(S1,-S2);  << - IOWAIT PORT INDEX >>      <<R9241>>10970000
            TOS:=DQM3; TOS:=DQM1;  <<REMOVE CUTBACK PARMS>>    <<R9241>>10975000
            X:=-CUTBACK+1;   <<BUT LEAVE ROOM FOR FILE NUMBER>><<R9241>>10980000
            STACK(X):=TOS-CUTBACK+1; STACK(X:=X-1):=TOS;       <<R9241>>10985000
            STACK(X:=X-1):=TOS; STACK(X:=X-1):=TOS;            <<R9241>>10990000
            PUSH(Q); TOS:=TOS+X+3; SET(Q); INITIALIZE;         <<R9241>>10995000
            QM4:=S1;  <<RETURN FILE NUMBER>>                   <<R9241>>11000000
            END;                                               <<R9241>>11005000
            END;  <<CASE>>                                     <<R9241>>11010000
         BUILDSTACKMARKER(1,S0); CUTBACK:=0;                   <<R9241>>11015000
         DEL; DDEL;                                            <<R9241>>11020000
         END                                                   <<R9241>>11025000
      ELSE                                                     <<R9241>>11030000
         BEGIN  <<MUST DEFER PROCESSING OF THE INTERRUPT>>     <<R9241>>11035000
         DISABLE; SPCBDELAYSOFT:=1; ENABLE;                    <<R9241>>11040000
         ASMB(SUBS 4);                                         <<R9241>>11045000
         END;                                                  <<R9241>>11050000
      END;                                                     <<R9241>>11055000
   END;  <<PROCESSOFTINT>>                                     <<R9241>>11060000
                                                               <<R9241>>11065000
                                                               <<R9241>>11070000
SUBROUTINE PROCESSBREAK;                                       <<R9241>>11075000
   BEGIN                                                       <<R9241>>11080000
   <<GET LOGICAL DEVICE NUMBER FOR $STDIN>>                    <<R9241>>11085000
   PUSH(Q,DL);                                                 <<R9241>>11090000
   ASMB(XCH,SUB;DUP,STAX;DECX);                                <<R9241>>11095000
   TOS:=-QARRAY(X);                                            <<R9241>>11100000
   ASMB(ADD);                                                  <<R9241>>11105000
   TOS:=TOS+STDINLOGDEV;                                       <<R9241>>11110000
   ASMB(STAX);                                                 <<R9241>>11115000
   TOS:=QARRAY(X);                                             <<R9241>>11120000
   IF RESABORTINFO.RITBRKFLAG <> 0 THEN                        <<R9241>>11125000
      BEGIN                                                    <<R9241>>11130000
      DISABLE;                                                 <<R9241>>11135000
      PIINFO.OAFIELD := 0;                                     <<R9241>>11140000
      ENABLE;                                                  <<R9241>>11145000
      END;                                                     <<R9241>>11150000
   ATTACHIO(S0,0,0,0,30,0,1,0,%13); <<SETTMODE>>               <<R9241>>11155000
   SYSBREAK;                                                   <<R9241>>11160000
   ATTACHIO(S0,0,0,0,30,0,0,0,%13); <<RESETTMODE>>             <<R9241>>11165000
   DEL;                                                        <<R9241>>11170000
   PDISABLE;                                                   <<R9241>>11175000
   PIINFO.PSIMFIELD := 7;                                      <<R9241>>11180000
                                                               <<R9241>>11185000
   IF SONINFO = 0 THEN                                         <<R9241>>11190000
      BEGIN  <<NO EXISTING SON>>                               <<R9241>>11195000
      IF RESABORTINFO.RITBRKFLAG <> 0 THEN                     <<R9241>>11200000
         BEGIN  <<RIT BREAK>>                                  <<R9241>>11205000
         RESABORTINFO.RITBRKFLAG := 0;                         <<R9241>>11210000
         IF PIINFO.OAFIELD <> 3 THEN                           <<R9241>>11215000
            BEGIN                                              <<R9241>>11220000
            PENABLE;                                           <<R9241>>11225000
            WAIT(%40,0);                                       <<R9241>>11230000
            PEXIT(NOPENABLE);                                  <<R9241>>11235000
            END                                                <<R9241>>11240000
         ELSE                                                  <<R9241>>11245000
            PEXIT(ENABLELAUNCH);                               <<R9241>>11250000
         END                                                   <<R9241>>11255000
      ELSE                                                     <<R9241>>11260000
         PEXIT(ENABLELAUNCH);                                  <<R9241>>11265000
      END;                                                     <<R9241>>11270000
                                                               <<R9241>>11275000
   MAIN := NEXT := (CURPRC)/PCBSIZE;                           <<R9241>>11280000
   WHILE (NEXT:=FAMILY(NEXT,MAIN))<>MAIN DO                    <<R9241>>11285000
      CLEAR'PSIF(NEXT*PCBSIZE,4);                              <<R9241>>11290000
   END;  <<PROCESSBREAK>>                                      <<R9241>>11295000
                                                               <<R9241>>11300000
                                                               <<R9241>>11305000
SUBROUTINE ANALYZEINTERRUPT;                                   <<R9241>>11310000
                                                               <<R9241>>11315000
<<GETS THE HIGHEST PRIORITY PENDING PSEUDO/SOFT INTERRUPT. >>  <<R9241>>11320000
<<RETURNS THE INTERRUPT TYPE IN "NEWINTERRUPT.">>              <<R9241>>11325000
                                                               <<R9241>>11330000
   BEGIN                                                       <<R9241>>11335000
   TOS := PROCSTATE&LSL(10); << PI BITS INTO MSB OF TOS >>     <<R9241>>11340000
   IF <> THEN                                                  <<R9241>>11345000
      BEGIN  <<PSEUDO INTERRUPT OCCURRED>>                     <<R9241>>11350000
      SPCBPIFLAGS:=0;                                          <<R9241>>11355000
      ASMB(SCAN 0); DEL;                                       <<R9241>>11360000
      NEWINTERRUPT:=X+1;                                       <<R9241>>11365000
      IF NEWINTERRUPT >= SPCBPSIM THEN                         <<R9241>>11370000
         PEXIT(ENABLELAUNCH);<<ALREADY HAVE MORE IMPORT.PSE>> <<REMOV>> 11375000
      SPCBPSIM:=                                               <<R9241>>11380000
       IF NEWINTERRUPT=HARDKILLVALUE THEN NORMALVALUE ELSE     <<R9241>>11385000
                        NEWINTERRUPT;                          <<R9241>>11386000
      IF NEWINTERRUPT <= SOFTKILL THEN                         <<R9241>>11390000
         BEGIN  <<PROCESS IS DYING, FORGET SOFT INTERRUPTS>>   <<R9241>>11395000
         SPCBDELAYSOFT:=0;                                     <<R9241>>11400000
         SPCBSOFTINT:=0;                                       <<R9241>>11405000
         END;                                                  <<R9241>>11410000
      END                                                      <<R9241>>11415000
   ELSE                                                        <<R9241>>11420000
      BEGIN  <<ASSUME SOFT INTERRUPT OCCURRED>>                <<R9241>>11425000
      DEL;                                                     <<R9241>>11430000
      IF SPCBPSIM < CONTROLYVALUE THEN                         <<R9241>>11435000
         BEGIN  <<ALREADY EXECUTING A PSEUDO INTERRUPT>>       <<R9241>>11440000
         IF SPCBPSIM < SOFTKILL THEN                           <<R9241>>11445000
            BEGIN  <<PROCESS IS DYING, FORGET SOFT INT>>       <<R9241>>11450000
            SPCBSOFTINT:=0;                                    <<R9241>>11455000
            SPCBDELAYSOFT:=0;                                  <<R9241>>11460000
            PEXIT(ENABLELAUNCH);                               <<R9241>>11465000
            END;                                               <<R9241>>11470000
         END;                                                  <<R9241>>11475000
      NEWINTERRUPT:=SOFTINTERRUPT;                             <<R9241>>11480000
      END;                                                     <<R9241>>11485000
   END;  <<ANALYZEINTERRUPT>>                                  <<R9241>>11490000
PCBPT := (CURPRC);                                             <<R9241>>11495000
IF PROCSTATE.STOVFLAG <> 0 THEN                                <<R9241>>11500000
   BEGIN                                                       <<R9241>>11505000
   DISABLE;                                                    <<R9241>>11510000
   RESABORTINFO.STOVABORTFLAG := 1;                            <<R9241>>11515000
   ENABLE;                                                     <<R9241>>11520000
   PENABLE;    << Always PDISABLED when get here!!!!! >>       <<R9241>>11525000
   ABORT([8/2,8/4],0,0);                                       <<R9241>>11530000
   END;                                                        <<R9241>>11535000
IF PRIMARYENTRY THEN                                           <<R9241>>11540000
   BEGIN<<PRI ENTRY(CAUSESOFTINT,DISPATCH,RESETCRIT.,RELSIR>>  <<R9241>>11545000
   INITIALIZE;                                                 <<R9241>>11550000
   SPCBPIOVRFLAG:=0;                                           <<R9241>>11555000
   ANALYZEINTERRUPT;                                           <<R9241>>11560000
   PENABLE; ENABLE;                                            <<R9241>>11565000
   END                                                         <<R9241>>11570000
ELSE                                                           <<R9241>>11575000
   BEGIN  <<SECONDARY ENTRY (ININ), ENABLED & PSEUDOENABLED>>  <<R9241>>11580000
   DELAYEDINT:                                                 <<R9241>>11585000
   PUSH(Q);TOS:=TOS-STACK;SET(Q);<<DELETE ININ'S STACK MARKER>><<R9241>>11590000
   INITIALIZE;                                                 <<R9241>>11595000
   <<GET CAUSE OF INTERRUPT>>                                  <<R9241>>11600000
   PXFXDCY := 0;                                               <<R9241>>11605000
   IF <> AND (PXFXCTLYPLBL <> 0) THEN                          <<R9241>>11610000
      NEWINTERRUPT:=CONTROLYVALUE                              <<R9241>>11615000
   ELSE IF LOG(SPCBDELAYSOFT) THEN                             <<R9241>>11620000
      NEWINTERRUPT:=SOFTINTERRUPT                              <<R9241>>11625000
   ELSE                                                        <<R9241>>11630000
      PEXIT(NOPENABLE);                                        <<R9241>>11635000
   END;                                                        <<R9241>>11640000
                                                               <<R9241>>11645000
<<PROCESS THE PSEUDOINTERRUPT>>                                <<R9241>>11650000
CASE NEWINTERRUPT-1 OF                                         <<R9241>>11655000
   BEGIN                                                       <<R9241>>11660000
   BEGIN  <<** HARD KILL>>                                     <<R9241>>11665000
   <<PROCESS KILLED BY UCOP, QUITPROG SITUATION>>              <<R9241>>11670000
   MMSTAT'(MMPROCESS,HARDKILLER,0,0,0,0,0);                    <<R9241>>11675000
   ABORT(ABTYP,0,0);                                           <<R9241>>11680000
   END;                                                        <<R9241>>11685000
                                                               <<R9241>>11690000
   BEGIN  <<** SOFT KILL>>                                     <<R9241>>11695000
   MMSTAT'(MMPROCESS,SOFTKILLER,0,0,0,0,0);                    <<R9241>>11700000
   TERMINATE;                                                  <<R9241>>11705000
   END;                                                        <<R9241>>11710000
                                                               <<R9241>>11715000
   BEGIN  <<** STOP>>                                          <<R9241>>11720000
   SUDDENDEATH(UGLYPSEUDOINT);                                 <<R9241>>11725000
   END;                                                        <<R9241>>11730000
                                                               <<R9241>>11735000
   BEGIN  <<** HYBERNATE>>                                     <<R9241>>11740000
   SUDDENDEATH(UGLYPSEUDOINT);                                 <<R9241>>11745000
   END;                                                        <<R9241>>11750000
                                                               <<R9241>>11755000
   BEGIN  <<** CONTROL Y>>                                     <<R9241>>11760000
   PROCESSYSOFTINT;                                            <<R9241>>11765000
   PLABEL:=PXFXCTLYPLBL;                                       <<R9241>>11770000
   IF SPCBWAKESOFT = 0 THEN                                    <<R9241>>11775000
      BEGIN                                                    <<R9241>>11780000
      MMSTAT'(MMPROCESS,CONTROLY,0,0,0,0,0);                   <<R9241>>11785000
      IF FINDTARGETMARKER(PXFXCTLYTRP) THEN                    <<R9241>>11790000
         BEGIN                                                 <<R9241>>11795000
         PXFXSIFLAG:=SPCBALLOWSOFT;                            <<R9241>>11800000
         DISABLE;SPCBALLOWSOFT:=0;ENABLE;<<DISABLE USR SFTINT>><<R9241>>11805000
         BUILDSTACKMARKER(2,PLABEL); CUTBACK:=0;               <<R9241>>11810000
         END                                                   <<R9241>>11815000
      ELSE                                                     <<R9241>>11820000
         PXFXDCY := 1;                                         <<R9241>>11825000
      END                                                      <<R9241>>11830000
   ELSE                                                        <<R9241>>11835000
      BEGIN                                                    <<R9241>>11840000
      SPCBWAKESOFT := 0;                                       <<R9241>>11845000
      PXFXDCY := 1; << Pause/Iowait have to clean first >>     <<R9241>>11850000
      END;                                                     <<R9241>>11855000
   END;                                                        <<R9241>>11860000
                                                               <<R9241>>11865000
   BEGIN  <<** BREAK>>                                         <<R9241>>11870000
   MMSTAT'(MMPROCESS,BREAKER,0,0,0,0,0);                       <<R9241>>11875000
   PROCESSBREAK;                                               <<R9241>>11880000
   <<CUT OFF TWO STACK MARKERS>>                               <<R9241>>11885000
   Comment The situation we are in is that of a CI which has   <<R9241>>11890000
           been broken from a son wait. CI command executors   <<R9241>>11895000
           should always do a joint call to AWAKE and WAIT     <<R9241>>11900000
           whenever command executors which spawn processes    <<R9241>>11905000
           are written. The cutback on the stack will be than  <<R9241>>11910000
           the number of parameters which AWAKE has, namely 3  <<R9241>>11915000
   ;                                                           <<R9241>>11920000
   TOS:=@STACK-INTEGER(STACK)-INTEGER(STACK(-STACK));          <<R9241>>11925000
   TOS:=S0;                                                    <<R9241>>11930000
   SET(Q,S);                                                   <<R9241>>11935000
   TOS := 3;       << CUTBACK := 3, See comment above >>       <<R9241>>11940000
   WAIT(2,0);  <<WAIT FOR SON ACTIVATION>>                     <<R9241>>11945000
   END;                                                        <<R9241>>11950000
                                                               <<R9241>>11955000
   BEGIN  <<** SOFT INTERRUPT>>                                <<R9241>>11960000
   PROCESSOFTINT;                                              <<R9241>>11965000
   END;                                                        <<R9241>>11970000
   END;  <<CASE>>                                              <<R9241>>11975000
                                                               <<R9241>>11980000
PEXIT(NOPENABLE);                                              <<R9241>>11985000
END;   <<PSEUDOINT>>                                           <<R9241>>11990000
$PAGE "SOFTWARE INTERRUPTS.  CAUSESOFTINT PROCEDURE."          <<R9241>>11995000
PROCEDURE CAUSESOFTINT(PIN,TYPE,SUBTYPE,PLABEL,MSGLEN,FLAGS);  <<R9241>>12000000
VALUE PIN,TYPE,SUBTYPE,PLABEL,MSGLEN,FLAGS;                    <<R9241>>12005000
                                                               <<R9241>>12010000
COMMENT FUNCTION                                               <<R9241>>12015000
  CAUSES A SOFT INTERRUPT TO OCCUR ON THE TARGET PROCESS.;     <<R9241>>12020000
                                                               <<R9241>>12025000
<<INPUT>>                                                      <<R9241>>12030000
  INTEGER                                                      <<R9241>>12035000
    PIN,                 <<PROCESS ID NUMBER OF TARGET PROCES>><<R9241>>12040000
                         <<  ZERO IMPLIES OWN PROCESS.>>       <<R9241>>12045000
    TYPE,                  <<TYPE OF SOFT INTERRUPT >>         <<R9241>>12050000
                 COMMENT     0 - INTERRUPTS PROCESSED ONLY WHEN<<R9241>>12055000
                                 USER INTERRUPTS ARE ENABLED AN<<R9241>>12060000
                                 PROCESS IS EXECUTING IN USER C<<R9241>>12065000
                                 (I.E., EXECUTING IN %3XX CODE <<R9241>>12070000
                                 SL).                          <<R9241>>12075000
                             1 - INTERRUPTS PROCESSED IN CURREN<<R9241>>12080000
                                 UNLESS THE TARGET PROCESS:    <<R9241>>12085000
                                 1) IS WAITING,                <<R9241>>12090000
                                 2) HAS A SIR,                 <<R9241>>12095000
                                 3) IS IMPEDED,                <<R9241>>12100000
                                 4) IS CRITICAL,               <<R9241>>12105000
                                 5) OR PSEUDO INTERRUPT LEVEL  <<R9241>>12110000
                                    IS LESS THAN CONTROL Y.    <<R9241>>12115000
                             NOTE THAT THE ABOVE CONDITIONS ONL<<R9241>>12120000
                             DELAY THE SOFT INTERRRUPT, ONCE TH<<R9241>>12125000
                             GO AWAY THE SOFT INTERRUPT WILL OC<<R9241>>12130000
                             MULTIPLE, SIMULTANEOUS SOFT INTERR<<R9241>>12135000
                             ARE SERVICED IN A FIFO MANNER.  AL<<R9241>>12140000
                             ONES ARE SERVICE BEFORE TYPE ZERO;<<R9241>>12145000
    SUBTYPE,           <<TYPE OF PREPROCESSING TO BE DONE BY>> <<R9241>>12150000
                       <<PSEUDOINT PROCEDURE.  A ZERO IMPLIES>><<R9241>>12155000
                       <<NO PREPROCESSING.>>                   <<R9241>>12160000
                          << (0:1) - Execution context of    >><<R9241>>12165000
                          <<         user mode procedures.   >><<R9241>>12170000
                          <<         0 - O.K. execute in priv>><<R9241>>12175000
                          <<             user code.          >><<R9241>>12180000
                          <<         1 - Can only execute in >><<R9241>>12185000
                          <<             non-priv user code. >><<R9241>>12190000
                          <<                                 >><<R9241>>12195000
                          << (1:15) - Subtype info.          >><<R9241>>12200000
                                                               <<R9241>>12205000
    PLABEL,                << Interrupt procedure's PLABEL.  >><<R9241>>12210000
                           << A zero implies no procedure.   >><<R9241>>12215000
    MSGLEN;                <<# WORDS IN THE MESG(MAX OF 2 WRD>><<R9241>>12220000
                           <<NOTE: THE MESG IS ASSUMED TO BE>> <<R9241>>12225000
                            <<LOCATED IN THE STACK,JUST ABOVE>><<R9241>>12230000
                            <<THE PIN PARAMETER.  IT WILL BE>> <<R9241>>12235000
                            <<DELETED BY THIS PROCEDURE.>>     <<R9241>>12240000
  LOGICAL                                                      <<R9241>>12245000
    FLAGS; COMMENT           (0:14) - RESERVED FOR FUTURE USE, <<R9241>>12250000
                                      BE SET TO ZERO.          <<R9241>>12255000
                             (0:1)  - 0 - IF APPROPRIATE PLACE <<R9241>>12260000
                                          ON THE READY LIST.   <<R9241>>12265000
                                      1 - DO NOT PUT ON READY  <<R9241>>12270000
                               LIST;                           <<R9241>>12271000
  <<DB                       MAY BE ANYWHERE.>>                <<R9241>>12275000
                                                               <<R9241>>12280000
COMMENT OUTPUT                                                 <<R9241>>12285000
    CONDITION CODE                                             <<R9241>>12290000
       CCE                   SOFT INTERRUPT WAS SET UP.        <<R9241>>12295000
       CCL                   PROCESS IS DYING, NO ACTION WAS TA<<R9241>>12300000
       CCG                   ONLY RETURNED WHEN FLAGS PARAMETER<<R9241>>12305000
                             SPECIFIES NO WAKE, CCG IMPLIES THA<<R9241>>12310000
                             THE PROCESS WOULD HAVE BEEN PLACED<<R9241>>12315000
                             ON THE READY LIST HAD IT NOT BEEN <<R9241>>12320000
                             FOR THE FLAGS SPECIFICATION.;     <<R9241>>12325000
                                                               <<R9241>>12330000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>12335000
                                                               <<R9241>>12340000
BEGIN                                                          <<R9241>>12345000
EQUATE                                                         <<R9241>>12350000
   RETURN6        = %31406,                                    <<R9241>>12355000
   NOLAUNCH       = %100000,                                   <<R9241>>12360000
   HYBERNATE      = 4,                                         <<R9241>>12365000
   SOFTINTBASE    = 1,                                         <<R9241>>12370000
   UGLYPSEUDOINT  = 4,                                         <<R9241>>12375000
   MAXMSGLEN      = 2;                                         <<R9241>>12380000
DEFINE                                                         <<R9241>>12385000
   USERSOFTINT    = (TYPE = 0)#,                               <<R9241>>12390000
   LAUNCHPROCESS  = (NOT FLAGS.(15:1))#;                       <<R9241>>12395000
                                                               <<R9241>>12400000
EQUATE  <<MMSTAT DEFINITIONS>>                                 <<R9241>>12405000
   PROCESSDEAD    = 0,                                         <<R9241>>12410000
   OTHERSOFTINTS  = 1,                                         <<R9241>>12415000
   INTDISABLED    = 2,                                         <<R9241>>12420000
   IMPEDECRITSIR  = 3,                                         <<R9241>>12425000
   OWNPROCESS     = 4,                                         <<R9241>>12430000
   PROCESSWAITRDY = 5,                                         <<R9241>>12435000
   DELAYLAUNCH    = 6,                                         <<R9241>>12440000
   LAUNCHED       = 7;                                         <<R9241>>12445000
DEFINE                                                         <<R9241>>12450000
   TLEVEL         = TMISC.(0:4)#,                              <<R9241>>12455000
   TTYPE          = TMISC.(4:2)#,                              <<R9241>>12460000
   TSUBTYPE       = TMISC.(6:2)#,                              <<R9241>>12465000
   TPIN           = TMISC.(8:8)#;                              <<R9241>>12470000
                                                               <<R9241>>12475000
DOUBLE                                                         <<R9241>>12480000
   MSG=PIN-2;                                                  <<R9241>>12485000
INTEGER                                                        <<R9241>>12490000
   PCBPT;                                                      <<R9241>>12495000
INTEGER                                                        <<R9241>>12500000
  MSG0=MSG,MSG1=MSG+1,TMISC,LEVEL:=OTHERSOFTINTS;              <<R9241>>12505000
                                                               <<R9241>>12510000
                                                               <<R9241>>12515000
SUBROUTINE LEAVETRACKS;                                        <<R9241>>12520000
                                                               <<R9241>>12525000
COMMENT FUNCTION                                               <<R9241>>12530000
  LEAVE TRACKS IN PROCESS'S PCB SO THAT SOFT INT WILL BE       <<R9241>>12535000
  PROCESSED AT A LATER TIME.;                                  <<R9241>>12540000
                                                               <<R9241>>12545000
   BEGIN                                                       <<R9241>>12550000
   LEVEL:=IMPEDECRITSIR;                                       <<R9241>>12555000
   SPCBPIOVRFLAG:=1;                                           <<R9241>>12560000
   SPCBDELAYSOFT:=1;                                           <<R9241>>12565000
   END;  <<LEAVE TRACKS>>                                      <<R9241>>12570000
                                                               <<R9241>>12575000
                                                               <<R9241>>12580000
SUBROUTINE INTERRUPTSELF;                                      <<R9241>>12585000
                                                               <<R9241>>12590000
COMMENT FUNCTION                                               <<R9241>>12595000
  PROCESS SOFT INTERRUPT GENERATED AGAINST OURSELF.;           <<R9241>>12600000
                                                               <<R9241>>12605000
   BEGIN                                                       <<R9241>>12610000
   LEVEL:=OWNPROCESS;                                          <<R9241>>12615000
   SPCBDELAYSOFT:=1;                                           <<R9241>>12620000
   ENABLE;                                                     <<R9241>>12625000
   PSEUDOINT;                                                  <<R9241>>12630000
   END;  <<INTERRUPTSELF>>                                     <<R9241>>12635000
                                                               <<R9241>>12640000
                                                               <<R9241>>12645000
SUBROUTINE WAKEPROCESS;                                        <<R9241>>12650000
                                                               <<R9241>>12655000
COMMENT FUNCTION                                               <<R9241>>12660000
  WAKE THE TARGET PROCESS.;                                    <<R9241>>12665000
                                                               <<R9241>>12670000
   BEGIN                                                       <<R9241>>12675000
   SPCBNONCRITWAIT:=0;                                         <<R9241>>12680000
   SPCBDELAYSOFT:=1;                                           <<R9241>>12685000
   ENABLE;                                                     <<R9241>>12690000
   IF SPCBPSIM > HYBERNATE THEN                                <<R9241>>12695000
      BEGIN  <<CONTROL Y, BREAK, OR NORMAL>>                   <<R9241>>12700000
      IF LAUNCHPROCESS THEN                                    <<R9241>>12705000
         BEGIN                                                 <<R9241>>12710000
         LEVEL:=LAUNCHED;                                      <<R9241>>12715000
         READYPROCESS(PCBPT)                                   <<R9241>>12720000
         END                                                   <<R9241>>12725000
      ELSE                                                     <<R9241>>12730000
         BEGIN                                                 <<R9241>>12735000
         LEVEL:=DELAYLAUNCH;                                   <<R9241>>12740000
         CC:=CCG;                                              <<R9241>>12745000
         END;                                                  <<R9241>>12750000
      END;                                                     <<R9241>>12755000
   END;  <<WAKEPROCESS>>                                       <<R9241>>12760000
                                                               <<R9241>>12765000
                                                               <<R9241>>12770000
SUBROUTINE SENDSOFTINT;                                        <<R9241>>12775000
                                                               <<R9241>>12780000
<<DOES THE MECHANICS OF QUEUEING THE SOFT INT AND INFORMING >> <<R9241>>12785000
<<THE TARGET PROCESS.>>                                        <<R9241>>12790000
                                                               <<R9241>>12795000
   BEGIN                                                       <<R9241>>12800000
   CC:=CCE;                                                    <<R9241>>12805000
                                                               <<R9241>>12810000
   <<SEND THE MSG TO THE PROPER IPC PORT>>                     <<R9241>>12815000
   CASE MSGLEN OF BEGIN                                        <<R9241>>12820000
      <<0>> ;                                                  <<R9241>>12825000
      <<1>> TOS:=MSG1;                                         <<R9241>>12830000
      <<2>> TOS:=MSG;                                          <<R9241>>12835000
      END;                                                     <<R9241>>12840000
   TOS:=PLABEL;                                                <<R9241>>12845000
   TOS:=SUBTYPE;                                               <<R9241>>12850000
   SENDMSG(PIN,TYPE+SOFTINTBASE,MSGLEN+2,NOLAUNCH);            <<R9241>>12855000
                                                               <<R9241>>12860000
   <<CHECK IF THE PROCESS NEEDS TO BE NOTIFIED OF THE INTERPT>><<R9241>>12865000
   IF NOT LOG(SPCBSOFTINT) AND NOT LOG(SPCBDELAYSOFT) THEN     <<R9241>>12870000
      BEGIN  <<NO OTHER SOFT INTERRUPTS PENDING>>              <<R9241>>12875000
      DISABLE;<<MUST DISABLE INT 'CAUSE OF MULTI-FLD PCB WRD>><<REMOV>> 12880000
      IF LOG(SPCBALLOWSOFT) OR NOT USERSOFTINT THEN            <<R9241>>12885000
         BEGIN  <<PROCESS IS INTERESTED>>                      <<R9241>>12890000
         IF (SPCBCRITSIR<>0) OR (SPCBIMPEDE<>0) THEN           <<R9241>>12895000
            LEAVETRACKS  <<PROCESS CAN'T EXEC INT RIGHT NOW>>  <<R9241>>12900000
         ELSE                                                  <<R9241>>12905000
            BEGIN<<PROC WILL PROCESS INT,CHECK IF SHOULD WAKE>><<R9241>>12910000
            IF (PCBPT = (CURPRC)) THEN                         <<R9241>>12915000
               INTERRUPTSELF  <<CALLER SPECIFIED HIMSELF>>     <<R9241>>12920000
            ELSE                                               <<R9241>>12925000
               BEGIN<<INTERRUPT IS ON PROCESS OTHER THAN OURS>><<R9241>>12930000
               SPCBWAKESOFT:=0;                                <<R9241>>12935000
               IF <> THEN                                      <<R9241>>12940000
                  WAKEPROCESS<<PROC ASLEEP,OK TO WAKE ON SOFT>><<R9241>>12945000
                             <<INTERRUPT>>                     <<R9241>>12946000
               ELSE                                            <<R9241>>12950000
                  BEGIN<<PROC IS EITHER 1)ON RDY LIST(NO NEED>><<R9241>>12955000
                    <<TO WAKE) OR 2) WAITING ON ANOTHER EVENT>><<R9241>>12960000
                  LEVEL:=PROCESSWAITRDY;                       <<R9241>>12965000
                  SPCBSOFTINT:=1;                              <<R9241>>12970000
                  END;                                         <<R9241>>12975000
               END;                                            <<R9241>>12980000
            END;                                               <<R9241>>12985000
         END;                                                  <<R9241>>12990000
      ENABLE;                                                  <<R9241>>12995000
      END                                                      <<R9241>>13000000
   ELSE                                                        <<R9241>>13005000
      LEVEL:=INTDISABLED;                                      <<R9241>>13010000
   END;  <<SENDSOFTINT>>                                       <<R9241>>13015000
                                                               <<R9241>>13020000
                                                               <<R9241>>13025000
<<INITIALIZE>>                                                 <<R9241>>13030000
IF (FLAGS > 1) OR (MSGLEN > MAXMSGLEN) OR NOT (0 <= TYPE <= 1) <<R9241>>13035000
   THEN SUDDENDEATH(UGLYPSEUDOINT);                            <<R9241>>13040000
IF PIN = 0 THEN PIN := (CURPRC)/PCBSIZE;                       <<R9241>>13045000
PCBPT:=PIN*PCBSIZE;                                            <<R9241>>13050000
PDISABLE;                                                      <<R9241>>13055000
                                                               <<R9241>>13060000
<<PROCESS SOFT INTERRUPT>>                                     <<R9241>>13065000
IF SPCBPSIM > SOFTKILLVALUE THEN                               <<R9241>>13070000
   SENDSOFTINT                                                 <<R9241>>13075000
ELSE                                                           <<R9241>>13080000
   BEGIN  <<DYING PROCESS, REJECT THE INTERRUPT>>              <<R9241>>13085000
   LEVEL:=PROCESSDEAD;                                         <<R9241>>13090000
   CC:=CCL;                                                    <<R9241>>13095000
   END;                                                        <<R9241>>13100000
PENABLE;                                                       <<R9241>>13105000
                                                               <<R9241>>13110000
<<EMIT MMSTAT EVENT>>                                          <<R9241>>13115000
IF GLOBALTRACEFLAG THEN                                        <<R9241>>13120000
   BEGIN  <<MONITORING IS ENABLED>>                            <<R9241>>13125000
   TPIN:=PIN; TTYPE:=TYPE; TSUBTYPE:=SUBTYPE; TLEVEL:=LEVEL;   <<R9241>>13130000
   MMSTAT'(MMCAUSE,TMISC,MSG0,MSG1,0,0,0);                     <<R9241>>13135000
   END;                                                        <<R9241>>13140000
                                                               <<R9241>>13145000
<<RETURN TO THE CALLER>>                                       <<R9241>>13150000
TOS:=RETURN6+MSGLEN;                                           <<R9241>>13155000
ASMB(XEQ);                                                     <<R9241>>13160000
END;  <<CAUSESOFTINT>>                                         <<R9241>>13165000
$PAGE "SOFTWARE INTERRUPTS.  CHANGEINTSTATE PROCEDURE."        <<R9241>>13170000
LOGICAL PROCEDURE CHANGEINTSTATE(NEWSTATE);                    <<R9241>>13175000
VALUE NEWSTATE;                                                <<R9241>>13180000
                                                               <<R9241>>13185000
COMMENT FUNCTION                                               <<R9241>>13190000
  ENABLES/DISABLES USER SOFT INTERRUPTS AGAINST THE PROCESS.;  <<R9241>>13195000
                                                               <<R9241>>13200000
<<INPUT>>                                                      <<R9241>>13205000
  LOGICAL                                                      <<R9241>>13210000
    NEWSTATE;  COMMENT     (15:1):  0 - DISABLE THE INTERRUPT  <<R9241>>13215000
                                    1 - ENABLE USER INTERRUPTS <<R9241>>13220000
                           (0:15):  IGNORED.;                  <<R9241>>13225000
COMMENT OUTPUT                                                 <<R9241>>13230000
    CHANGEINTSTATE         OLD VALUE OF THE USER INTERRUPT STAT<<R9241>>13235000
    PREGISTER.(0:1)        SET TO ONE IF NEWSTATE = TRUE AND US<<R9241>>13240000
    AT CALLER'S Q-2.       SOFT INTERRUPT IS PENDING.  THIS CAU<<R9241>>13245000
                           A BOUNDS VIOLATION TO ININ WHEN THE <<R9241>>13250000
                           CALLING PROCEDURE EXITS.            <<R9241>>13255000
                                                               <<R9241>>13260000
  NOTE: THIS PROCEDURE ASSUMES THAT THE USER'S STACK MARKER IS <<R9241>>13265000
        Q-0 OF THE CALLING PROCEDURE.  IF THIS IS NOT SO, THEN <<R9241>>13270000
        AN EXTRA CALL TO PSEUDOINT (VIA ININ BOUNDS VIOLATION) <<R9241>>13275000
        RESULT.;                                               <<R9241>>13280000
                                                               <<R9241>>13285000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>13290000
                                                               <<R9241>>13295000
   BEGIN                                                       <<R9241>>13300000
   DEFINE                                                      <<R9241>>13305000
      TOLDSTATE   = TMISC.(14:1)#,                             <<R9241>>13310000
      TNEWSTATE   = TMISC.(15:1)#;                             <<R9241>>13315000
   INTEGER                                                     <<R9241>>13320000
      OLDSTATE=CHANGEINTSTATE,TMISC:=0,PCBXLOC,PCBPT,          <<R9241>>13325000
      PXFIXEDLOC;                                              <<R9241>>13330000
                                                               <<R9241>>13335000
   <<INITIALIZE>>                                              <<R9241>>13340000
   PXFIXED;                                                    <<R9241>>13345000
   PCBPT := (CURPRC);                                          <<R9241>>13350000
                                                               <<R9241>>13355000
   <<UPDATE INTERRUPT STATE>>                                  <<R9241>>13360000
   CHANGEINTSTATE:=SPCBALLOWSOFT;                              <<R9241>>13365000
   DISABLE; SPCBALLOWSOFT:=NEWSTATE; ENABLE;                   <<R9241>>13370000
   PXFXSIFLAG:=NEWSTATE;                                       <<R9241>>13375000
                                                               <<R9241>>13380000
   IF NEWSTATE AND LOG(PORTSTATUS(USERMSGPORT)) THEN           <<R9241>>13385000
      BEGIN  <<GOT AT LEAST ONE PENDING INTERRUPT>>            <<R9241>>13390000
      DISABLE; SPCBDELAYSOFT:=1; ENABLE;                       <<R9241>>13395000
      <<CAUSE TRAP TO ININ ON EXIT TO USER>>                   <<R9241>>13400000
      QARRAY(-DELTAQ-2).(0:1):=1;                              <<R9241>>13405000
      END;                                                     <<R9241>>13410000
                                                               <<R9241>>13415000
   IF GLOBALTRACEFLAG THEN                                     <<R9241>>13420000
      BEGIN  <<MONITORING IS ON>>                              <<R9241>>13425000
      TNEWSTATE:=NEWSTATE; TOLDSTATE:=OLDSTATE;                <<R9241>>13430000
      MMSTAT'(MMCHANGESTATE,TMISC,QARRAY(-DELTAQ-2),           <<R9241>>13435000
              QARRAY(-DELTAQ-1),0,0,0);                        <<R9241>>13440000
      END;                                                     <<R9241>>13445000
   END;  <<CHANGEINTSTATE>>                                    <<R9241>>13450000
$PAGE "DATA STRUCTURE INDEPENDENT INFORMATION PROCEDURES"      <<R9241>>13455000
                                                               <<R9241>>13460000
LOGICAL PROCEDURE STACKCHECK(DSTNUMBER);                       <<R9241>>13465000
VALUE DSTNUMBER;                                               <<R9241>>13470000
INTEGER DSTNUMBER;                                             <<R9241>>13475000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>13480000
                                                               <<R9241>>13485000
COMMENT                                                        <<R9241>>13490000
                                                               <<R9241>>13495000
RETURNS TRUE IS SPECIFIED DATA SEG IS A STACK ELSE FALSE       <<R9241>>13500000
                                                               <<R9241>>13505000
;                                                              <<R9241>>13510000
                                                               <<R9241>>13515000
BEGIN                                                          <<R9241>>13520000
STACKCHECK:=DST(DSTNUMBER&LSL(2)+1).STKFLAG;                   <<R9241>>13525000
END <<STACKCHECK>>;                                            <<R9241>>13530000
                                                               <<R9241>>13535000
LOGICAL PROCEDURE CHECKALIVE(PIN);                             <<R9241>>13540000
VALUE PIN;                                                     <<R9241>>13545000
INTEGER PIN;                                                   <<R9241>>13550000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>13555000
                                                               <<R9241>>13560000
COMMENT                                                        <<R9241>>13565000
                                                               <<R9241>>13570000
RETURNS FALSE IF PIN WITH PCB INDEX PCBPT IS UNASSIGNED ELSE TR<<R9241>>13575000
                                                               <<R9241>>13580000
;                                                              <<R9241>>13585000
                                                               <<R9241>>13590000
BEGIN                                                          <<R9241>>13595000
IF PCB(PIN*PCBSIZE+PQPTRWORDNUM)=-1 THEN CHECKALIVE:=FALSE     <<R9241>>13600000
ELSE CHECKALIVE:=TRUE;                                         <<R9241>>13605000
END <<CHECKALIVE>> ;                                           <<R9241>>13610000
                                                               <<R9241>>13615000
                                                               <<R9241>>13620000
$TITLE "UNCALLABLE UTILITIES : UPDATE DISC COPY"               <<R9241>>13625000
PROCEDURE UPDATEDISCCOPY(DSTENTRY);                            <<R9241>>13630000
VALUE DSTENTRY;                                                <<R9241>>13635000
INTEGER DSTENTRY;                                              <<R9241>>13640000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>13645000
                                                               <<R9241>>13650000
COMMENT                                                        <<R9241>>13655000
                                                               <<R9241>>13660000
UPDATEDISCCOPY ISSUES A BLOCKED ATTACHIO ON BEHALF OF THE PROCE<<R9241>>13665000
TO WRITE THE CONTENTS OF THE DATA SEGMENT TO THE COPY OF THE SE<<R9241>>13670000
IN VIRTUAL MEMORY.  IF THE DISC COPY IS                        <<R9241>>13675000
ALREADY VALID, CONTROL RETURNS IMMEDIATELY TO THE CALLING PROCE<<R9241>>13680000
                                                               <<R9241>>13685000
;                                                              <<R9241>>13690000
                                                               <<R9241>>13695000
BEGIN                                                          <<R9241>>13700000
DEFINE RTYPE=(14:2)#;                                          <<R9241>>13705000
ENTRY WRITEDSEG,WRITEDSEG'SERIAL;                              <<R9241>>13710000
INTEGER HODA,                                                  <<R9241>>13715000
        LDEVNUM,                                               <<R9241>>13720000
        DESCSTINX,                                             <<R9241>>13725000
        CNT,                                                   <<R9241>>13730000
        LODA,                                                  <<R9241>>13735000
        SERIAL'WRITE'QUEUE := %2001;                           <<R9241>>13740000
                                                               <<R9241>>13745000
LOGICAL                                                        <<R9241>>13750000
   USE'SERIAL'WRITE'QUEUE;                                     <<R9241>>13755000
                                                               <<R9241>>13760000
WRITEDSEG:      <<RENAMED TO UPDATEDISCCOPY>>                  <<R9241>>13765000
                                                               <<R9241>>13770000
IF (USE'SERIAL'WRITE'QUEUE := FALSE) THEN                      <<R9241>>13775000
   BEGIN                                                       <<R9241>>13780000
                                                               <<R9241>>13785000
WRITEDSEG'SERIAL:                                              <<R9241>>13790000
                                                               <<R9241>>13795000
   USE'SERIAL'WRITE'QUEUE := TRUE;                             <<R9241>>13800000
   END;                                                        <<R9241>>13805000
                                                               <<R9241>>13810000
DESCSTINX:=DSTENTRY&LSL(2);                                    <<R9241>>13815000
DISABLE;  <<WHILE FIGURING OUT THE DISC ADDRESS>>              <<R9241>>13820000
IF NOT LOGICAL(DST(X:=DESCSTINX+1)).DISCCOPYVALIDFLAG THEN     <<R9241>>13825000
   BEGIN                                                       <<R9241>>13830000
   CNT:=(DST(DESCSTINX).DATASIZEFIELD)&LSL(2);                 <<R9241>>13835000
   TOS:=DST(X:=DESCSTINX+2);                                   <<R9241>>13840000
   TOS:=DST(X:=X+1);                                           <<R9241>>13845000
   IF NOT LOGICAL(DST(DESCSTINX)).ABSENTFLAG                   <<R9241>>13850000
   OR LOGICAL(DST(DESCSTINX+1)).IMIFLAG                        <<R9241>>13855000
   OR LOGICAL(DST(DESCSTINX+1)).ROCFLAG THEN                   <<R9241>>13860000
      BEGIN <<DISC ADDRESS IS IN MEMORY HEADER>>               <<R9241>>13865000
      TOS:=TOS+RBTOHODADISP;                                   <<R9241>>13870000
      ASMB(LDEA);                                              <<R9241>>13875000
      END;                                                     <<R9241>>13880000
   ENABLE;                                                     <<R9241>>13885000
   LODA:=TOS;                                                  <<R9241>>13890000
   HODA:=S0.(8:8);                                             <<R9241>>13895000
   LDEVNUM:=TOS.(0:8);  <<LDEVN>>                              <<R9241>>13900000
                                                               <<R9241>>13905000
   IF USE'SERIAL'WRITE'QUEUE THEN                              <<R9241>>13910000
      TOS := ATTACHIO(LDEVNUM,0,DSTENTRY,0,WRITEREQ,CNT,HODA,  <<R9241>>13915000
                      LODA,SERIAL'WRITE'QUEUE)                 <<R9241>>13920000
   ELSE                                                        <<R9241>>13925000
      TOS := P'ATTACHIO(LDEVNUM,0,DSTENTRY,0,WRITEREQ,CNT,HODA,<<R9241>>13930000
                        LODA,1);                               <<R9241>>13935000
   IF S1.(13:3) <> 1 THEN SUDDENDEATH(654);                    <<R9241>>13940000
   END;                                                        <<R9241>>13945000
END  <<UPDATEDISCCOPY>>;                                       <<R9241>>13950000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS"                  <<R9241>>13955000
$page "PCB Impeded List Manipulators : String Pin At Tail"     <<R9241>>13960000
                                                               <<R9241>>13965000
PROCEDURE StringPinAtTail(headpin,newpin);                     <<R9241>>13970000
VALUE headpin,newpin;                                          <<R9241>>13975000
INTEGER headpin,newpin;                                        <<R9241>>13980000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>13985000
                                                               <<R9241>>13990000
COMMENT                                                        <<R9241>>13995000
                                                               <<R9241>>14000000
StringPinAtTail places the newpin at the end of the list of the<<R9241>>14005000
impeded processes which are strung thru the pcb entries.  The  <<R9241>>14010000
head of the impeded list is specified in the headpin parameter,<<R9241>>14015000
and the newpin specifies the pin to be added to the tail.      <<R9241>>14020000
                                                               <<R9241>>14025000
StringPinAtTail flips thru the list until it gets to the       <<R9241>>14030000
end, then adds the newpin at the tail.                         <<R9241>>14035000
                                                               <<R9241>>14040000
If the newpin parameter is zero, it is assumed that the pin to <<R9241>>14045000
strung is that of the currently executing process.             <<R9241>>14050000
No assumption is made on DB location.                          <<R9241>>14055000
                                                               <<R9241>>14060000
The caller is responsible for pdisabling or disabling if       <<R9241>>14065000
process switches or interrupts could cause the list structure  <<R9241>>14070000
to be changed.                                                 <<R9241>>14075000
                                                               <<R9241>>14080000
                                                               <<R9241>>14085000
;                                                              <<R9241>>14090000
                                                               <<R9241>>14095000
BEGIN                                                          <<R9241>>14100000
                                                               <<R9241>>14105000
INTEGER PREVPIX := 0,                                          <<R9241>>14110000
        NEXTPIX;                                               <<R9241>>14115000
                                                               <<R9241>>14120000
IF newpin=0 THEN newpin := (CURPRC)/PCBSIZE;                   <<R9241>>14125000
NEXTPIX := HEADPIN * PCBSIZE;                                  <<R9241>>14130000
WHILE NEXTPIX <> 0 DO                                          <<R9241>>14135000
   BEGIN <<locate end of impeded list>>                        <<R9241>>14140000
   PREVPIX := NEXTPIX;                                         <<R9241>>14145000
   NEXTPIX := PCB(NEXTPIX + NIMPPINWORDNUM);                   <<R9241>>14150000
   END;                                                        <<R9241>>14155000
                                                               <<R9241>>14160000
<<prevpin contains the last pin in the list>>                  <<R9241>>14165000
                                                               <<R9241>>14170000
<<put newpin into next imp ptr of prev pin pcb>>               <<R9241>>14175000
                                                               <<R9241>>14180000
IF PREVPIX <> 0 THEN                                           <<R9241>>14185000
   PCB(PREVPIX + NIMPPINWORDNUM) := NEWPIN * PCBSIZE;          <<R9241>>14190000
                                                               <<R9241>>14195000
<<zero next ptr of newly added pcb entry>>                     <<R9241>>14200000
                                                               <<R9241>>14205000
PCB(NEWPIN * PCBSIZE + NIMPPINWORDNUM) := 0;                   <<R9241>>14210000
                                                               <<R9241>>14215000
END;  <<StringPinAtEnd>>                                       <<R9241>>14220000
                                                               <<R9241>>14225000
$page "PCB Impeded List Manipulators : String Pin At Tail"     <<R9241>>14230000
                                                               <<R9241>>14235000
INTEGER PROCEDURE UnstringHeadPIN(headpin);                    <<R9241>>14240000
VALUE headpin;                                                 <<R9241>>14245000
INTEGER headpin;                                               <<R9241>>14250000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>14255000
                                                               <<R9241>>14260000
COMMENT                                                        <<R9241>>14265000
                                                               <<R9241>>14270000
UnstringHeadPIN removes the pcb entry specified by the headpin <<R9241>>14275000
parameter from the string of pcb entries on the impeded list.  <<R9241>>14280000
The new headpin of the list is returned.                       <<R9241>>14285000
No assumption is made on DB location.                          <<R9241>>14290000
                                                               <<R9241>>14295000
The caller is responsible for pdisabling or disabling if       <<R9241>>14300000
process switches or interrupts could cause the list structure  <<R9241>>14305000
to be changed.                                                 <<R9241>>14310000
                                                               <<R9241>>14315000
                                                               <<R9241>>14320000
;                                                              <<R9241>>14325000
                                                               <<R9241>>14330000
BEGIN                                                          <<R9241>>14335000
                                                               <<R9241>>14340000
IF headpin=0 THEN SuddenDeath(SFKernBadParm);                  <<R9241>>14345000
                                                               <<R9241>>14350000
UNSTRINGHEADPIN := PCB(HEADPIN * PCBSIZE + NIMPPINWORDNUM)     <<R9241>>14355000
                      /PCBSIZE;                                <<R9241>>14360000
                                                               <<R9241>>14365000
<<zero next ptr of removed pcb entry>>                         <<R9241>>14370000
                                                               <<R9241>>14375000
PCB(HEADPIN * PCBSIZE + NIMPPINWORDNUM) := 0;                  <<R9241>>14380000
                                                               <<R9241>>14385000
END;  <<UnstringHeadPIN>>                                      <<R9241>>14390000
LOGICAL PROCEDURE TIMEOUT(DELAY,ALLOWSOFTINT);                 <<R9241>>14395000
VALUE DELAY,ALLOWSOFTINT;                                      <<R9241>>14400000
                                                               <<R9241>>14405000
COMMENT FUNCTION                                               <<R9241>>14410000
  DELAYS A PROCESS FOR N MILLISECONDS.;                        <<R9241>>14415000
                                                               <<R9241>>14420000
<<INPUT>>                                                      <<R9241>>14425000
  DOUBLE                                                       <<R9241>>14430000
    DELAY;            <<# MILLISECONDS TO DELAY, -1D IMPLIES>> <<R9241>>14435000
                       <<  INFINITY>>                          <<R9241>>14440000
  LOGICAL                                                      <<R9241>>14445000
    ALLOWSOFTINT;        <<TRUE - SOFT INTERRUPTS OR CONTRL Y>><<R9241>>14450000
                         <<       ABORT THE TIMEOUT          >><<R9241>>14455000
                         <<FALSE-WAIT FOR THE ENTIRE DURATION>><<R9241>>14460000
                                                               <<R9241>>14465000
COMMENT OUTPUT                                                 <<R9241>>14470000
    TIMEOUT                REASON FOR RETURNING                <<R9241>>14475000
                           0 - TIMEOUT OCCURRED                <<R9241>>14480000
                           1 - NO TRLX ENTRIES AVAILABLE       <<R9241>>14485000
                           2 - CTLY/SOFT INTERRUPT IS PENDING; <<R9241>>14490000
                                                               <<R9241>>14495000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>14500000
                                                               <<R9241>>14505000
   BEGIN                                                       <<R9241>>14510000
   LOGICAL                                                     <<R9241>>14515000
      DONE;                                                    <<R9241>>14520000
   INTEGER                                                     <<R9241>>14525000
      PCBPT,PCBXLOC,TRLX:=0,RESULT:=TIMEOUTOCCURRED,           <<R9241>>14530000
      DELAY0=DELAY,PXFIXEDLOC,                                 <<R9241>>14535000
      DELAY1=DELAY+1;                                          <<R9241>>14540000
   LOGICAL                                                     <<R9241>>14545000
      SPECIALINFO;                                             <<R9241>>14550000
   DEFINE                                                      <<R9241>>14555000
      INFINITY    = -1D#;                                      <<R9241>>14560000
   EQUATE                                                      <<R9241>>14565000
      TIMEOUTCODE = 10,                                        <<R9241>>14570000
      TIMEOUTWAIT = -%10,                                      <<R9241>>14575000
      ALLOWSOFT   = %10000,                                    <<R9241>>14580000
      LONGWAIT    = 1;                                         <<R9241>>14585000
   INTEGER                                                     <<R9241>>14590000
      TRLPTR;                                                  <<R9241>>14595000
                                                               <<R9241>>14600000
                                                               <<R9241>>14605000
   SUBROUTINE TEXIT(RETURNVALUE);                              <<R9241>>14610000
   VALUE RETURNVALUE;                                          <<R9241>>14615000
   INTEGER RETURNVALUE;                                        <<R9241>>14620000
      BEGIN                                                    <<R9241>>14625000
      TIMEOUT:=RETURNVALUE;                                    <<R9241>>14630000
      IF GLOBALTRACEFLAG THEN                                  <<R9241>>14635000
         MMSTAT'(MMTIMEOUT,RETURNVALUE,DELAY0,DELAY1,0,0,0);   <<R9241>>14640000
      ASMB(EXIT 3);                                            <<R9241>>14645000
      END;  <<TEXIT>>                                          <<R9241>>14650000
   <<INITIALIZE>>                                              <<R9241>>14655000
   SPECIALINFO := (IF DELAY > 1000D THEN 1 ELSE 0) +           <<R9241>>14660000
                  (IF ALLOWSOFTINT THEN ALLOWSOFT              <<R9241>>14665000
                     ELSE 0);                                  <<R9241>>14670000
   PXFIXED;                                                    <<R9241>>14675000
   PCBPT := CURPRC;                                            <<R9241>>14680000
                                                               <<R9241>>14685000
   IF DELAY <> 0D THEN                                         <<R9241>>14690000
      BEGIN                                                    <<R9241>>14695000
      IF DELAY <> INFINITY THEN                                <<R9241>>14700000
         BEGIN  <<USER DESIRES A DELAY>>                       <<R9241>>14705000
         DISABLE;                                              <<R9241>>14710000
         IF NOT CHEKTRLFREE THEN                               <<R9241>>14715000
            BEGIN                                              <<R9241>>14720000
            ENABLE;                                            <<R9241>>14725000
            TEXIT(TRLXEXHAUSTED);                              <<R9241>>14730000
            END;                                               <<R9241>>14735000
         PXFXTRLXTOUT:=TRLX:=TIMEREQ(TIMEOUTCODE,PCBPT,DELAY); <<R9241>>14740000
         ENABLE;                                               <<R9241>>14745000
         END;                                                  <<R9241>>14750000
                                                               <<R9241>>14755000
      <<WAIT LOOP>>                                            <<R9241>>14760000
      DO                                                       <<R9241>>14765000
         BEGIN  <<DO UNTIL TIMEOUT/SOFT INT PENDING>>          <<R9241>>14770000
         DONE:=TRUE;                                           <<R9241>>14775000
         WAIT(TIMEOUTWAIT,SPECIALINFO);                        <<R9241>>14780000
         IF > THEN                                             <<R9241>>14785000
            RESULT:=SOFTINTOCCURRED                            <<R9241>>14790000
         ELSE                                                  <<R9241>>14795000
            BEGIN <<CHECK IF WAIT RETURNED BECAUSE OF PCB WWS>><<R9241>>14800000
            TRLPTR := TRLX*TRLENTRYSIZE;                       <<R9241>>14805000
            IF TRLX=0 OR TRLREQUEST<>0 THEN                    <<R9241>>14810000
               DONE:=FALSE;  <<ANOTHER EVENT SET THE WWS>>     <<R9241>>14815000
            END                                                <<R9241>>14820000
         END UNTIL DONE;                                       <<R9241>>14825000
                                                               <<R9241>>14830000
      <<RETURN THE TIMER REQUEST ENTRY>>                       <<R9241>>14835000
      IF TRLX <> 0 THEN                                        <<R9241>>14840000
         BEGIN                                                 <<R9241>>14845000
         PDISABLE;  <<PSEUDO DISABLE SO THAT CAN'T BE ABORTED>><<R9241>>14850000
         ABORTTIMEREQ(TRLX);                                   <<R9241>>14855000
         PXFXTRLXTOUT:=0;                                      <<R9241>>14860000
         PENABLE;                                              <<R9241>>14865000
         END;                                                  <<R9241>>14870000
      END;                                                     <<R9241>>14875000
                                                               <<R9241>>14880000
   TEXIT(RESULT);                                              <<R9241>>14885000
   END;  <<TIMEOUT>>                                           <<R9241>>14890000
$PAGE "DB MANIPULATION PROCEDURES"                             <<R9241>>14900000
                                                               <<R9241>>14905000
COMMENT                                                        <<R9241>>14910000
                                                               <<R9241>>14915000
DB MAY BE PLACED AT THE STACK DB, THE BASE OF AN EXTRA DATA SEG<<R9241>>14920000
OR AT AN ABSOLUTE LOCATION.                                    <<R9241>>14925000
                                                               <<R9241>>14930000
TO PLACE DB AT SYSDB, CALL PROCEDURE SETSYSDB, THEN CALL RESETD<<R9241>>14935000
PASSING THE VALUE RETURNED BY SETSYSDB IN ORDER TO RESTORE THE <<R9241>>14940000
PREVIOUS ENVIRONMENT.                                          <<R9241>>14945000
                                                               <<R9241>>14950000
TO PLACE DB AT AN ABSOLUTE LOCATION IN BANK 0 OTHER THAN AT SYS<<R9241>>14955000
FIRST CALL SETSYSDB, THEN CALL RESETDB WITH THE DESIRED VALUE. <<R9241>>14960000
WHEN DONE, CALL RESETDB WITH THE VALUE RETURNED FROM           <<R9241>>14965000
SETSYSDB.                                                      <<R9241>>14970000
                                                               <<R9241>>14975000
TO PLACE DB AT A SPECIFIC DATA SEGMENT, CALL EXCHANGEDB SUPPLYI<<R9241>>14980000
THE DESIRED DATA SEGMENT'S NUMBER (0 IF CALLER'S STACK).  SAVE <<R9241>>14985000
VALUE RETURNED AND SUPPLY THIS ON THE CALL TO EXCHANGEDB WHICH <<R9241>>14990000
RESTORE THE PREVIOUS ENVIRONMENT.                              <<R9241>>14995000
                                                               <<R9241>>15000000
;                                                              <<R9241>>15005000
$PAGE "DB MANIPULATION PROCEDURES : SETSYSDB"                  <<R9241>>15010000
LOGICAL PROCEDURE SETSYSDB;                                    <<R9241>>15015000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>15020000
                                                               <<R9241>>15025000
COMMENT                                                        <<R9241>>15030000
SETSYSDB LOADS THE DB REGISTER WITH THE SYSBASE VALUE AND      <<R9241>>15035000
SETS A FLAG IN THE CALLING PROCESS' PCB TO INDICATE THAT       <<R9241>>15040000
DB POINTS AT AN ABSOLUTE LOCATION.                             <<R9241>>15045000
                                                               <<R9241>>15050000
SETSYSDB RETURNS A VALUE WHICH THE CALLER SHOULD SAVE AND PASS <<R9241>>15055000
PARAMETER TO RESETDB SO THAT THE PREVIOUS ENVIRONMENT MAY BE   <<R9241>>15060000
PROPERLY RESTORED.  THE RETURNED VALUE IS -1 IF DB WAS NOT     <<R9241>>15065000
ALREADY SET TO AN ABSOLUTE LOCATION, AND IS THE PREVIOUS DB VAL<<R9241>>15070000
IF DB WAS AT AN ABSOLUTE LOCATION.                             <<R9241>>15075000
                                                               <<R9241>>15080000
;                                                              <<R9241>>15085000
                                                               <<R9241>>15090000
BEGIN                                                          <<R9241>>15095000
INTEGER PCBPT;                                                 <<R9241>>15100000
LOGICAL                                                        <<R9241>>15105000
   AT'ABSOLUTE'DB := FALSE;                                    <<R9241>>15110000
PDISABLE;                                                      <<R9241>>15115000
PCBPT := CURPRC;                                               <<R9241>>15120000
AT'ABSOLUTE'DB := DBXDSINFO.ABSDBFLAG;                         <<R9241>>15125000
DBXDSINFO.ABSDBFLAG := 1;                                      <<R9241>>15130000
IF NOT AT'ABSOLUTE'DB THEN                                     <<R9241>>15135000
   BEGIN                                                       <<R9241>>15140000
   TOS:=0;                                                     <<R9241>>15145000
   TOS:=SYSBASE;                                               <<R9241>>15150000
   EXCHDB;                                                     <<R9241>>15155000
   SETSYSDB:=-1;                                               <<R9241>>15160000
   END                                                         <<R9241>>15165000
ELSE                                                           <<R9241>>15170000
   BEGIN <<ALREADY AT AN ABS LOCATION>>                        <<R9241>>15175000
   TOS:=0;                                                     <<R9241>>15180000
   TOS:=SYSBASE;                                               <<R9241>>15185000
   ASMB(XCHD);                                                 <<R9241>>15190000
   SETSYSDB:=TOS;                                              <<R9241>>15195000
   END;                                                        <<R9241>>15200000
PENABLE;                                                       <<R9241>>15205000
END <<PROCEDURE SETSYSDB>>;                                    <<R9241>>15210000
$PAGE "DB MANIPULATION PROCEDURES : RESETDB"                   <<R9241>>15215000
                                                               <<R9241>>15220000
PROCEDURE RESETDB(WHERE);                                      <<R9241>>15225000
VALUE WHERE;                                                   <<R9241>>15230000
INTEGER WHERE;                                                 <<R9241>>15235000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>15240000
                                                               <<R9241>>15245000
COMMENT                                                        <<R9241>>15250000
                                                               <<R9241>>15255000
RESETDB IS CALLED AFTER CALLING SETSYSDB TO RESTORE DB TO THE  <<R9241>>15260000
VALUE THAT WAS EXPECTED UPON CALLING SETSYSDB.                 <<R9241>>15265000
                                                               <<R9241>>15270000
THE VALUE RETURNED BY SETSYSDB SHOULD BE SUPPLIED AS THE       <<R9241>>15275000
PARAMETER FOR RESETDB.                                         <<R9241>>15280000
                                                               <<R9241>>15285000
;                                                              <<R9241>>15290000
                                                               <<R9241>>15295000
BEGIN                                                          <<R9241>>15300000
INTEGER PCBPT,DSTNUMBER;                                       <<R9241>>15305000
                                                               <<R9241>>15310000
TURNOFFTRAPS;                                                  <<R9241>>15315000
                                                               <<R9241>>15320000
TOS:=WHERE;                                                    <<R9241>>15325000
IF = THEN SUDDENDEATH(611);                                    <<R9241>>15330000
IF S0 <> -1 THEN                                               <<R9241>>15335000
   BEGIN <<PUT PASSED VALUE INTO DB>>                          <<R9241>>15340000
   TOS:=0;                                                     <<R9241>>15345000
   ASMB(XCH;XCHD);                                             <<R9241>>15350000
   END                                                         <<R9241>>15355000
ELSE                                                           <<R9241>>15360000
   BEGIN  <<DB BACK TO PCB'S DBINFO>>                          <<R9241>>15365000
   DISABLE;<<PDIS IN MULIT-CPU>>                               <<R9241>>15370000
                                                               <<R9241>>15375000
   CHECKAGAIN:                                                 <<R9241>>15380000
   PCBPT := CURPRC;                                            <<R9241>>15385000
   TOS := DBXDSINFO;                                           <<R9241>>15390000
   TOS.ABSDBFLAG:=0;                                           <<R9241>>15395000
   DBXDSINFO := S0;                                            <<R9241>>15400000
   DSTNUMBER:=TOS.XDSDSTFIELD;                                 <<R9241>>15405000
   IF <> THEN                                                  <<R9241>>15410000
      BEGIN <<XDS>>                                            <<R9241>>15415000
      IF LOGICAL(DST(DSTNUMBER&LSL(2))).ABSENTFLAG THEN        <<R9241>>15420000
         BEGIN <<CLOCK ATE IT UP>>                             <<R9241>>15425000
          QueueOnObject(DOUBLE(DSTNUMBER));                    <<R9241>>15430000
          GO CHECKAGAIN;                                       <<R9241>>15435000
          END;                                                 <<R9241>>15440000
      DST(X).REFERENCEDFLAG:=1;                                <<R9241>>15445000
      TOS:=DST(X:=X+2);                                        <<R9241>>15450000
      TOS:=DST(X:=X+1);                                        <<R9241>>15455000
      END                                                      <<R9241>>15460000
   ELSE                                                        <<R9241>>15465000
      BEGIN  <<GOES BACK TO STK>>                              <<R9241>>15470000
      TOS:=ICS(-ICS'STKBANKCELL);                              <<R9241>>15475000
      TOS:=ICS(X:=X+1);                                        <<R9241>>15480000
      END;                                                     <<R9241>>15485000
   ASMB(XCHD);                                                 <<R9241>>15490000
   END;                                                        <<R9241>>15495000
END  <<PROCEDURE RESETDB>>;                                    <<R9241>>15500000
                                                               <<R9241>>15505000
$PAGE "DB MANIPULATION PROCEDURES : EXCHANGEDB"                <<R9241>>15510000
LOGICAL PROCEDURE EXCHANGEDB(WHERE);                           <<R9241>>15515000
VALUE WHERE;                                                   <<R9241>>15520000
INTEGER WHERE;                                                 <<R9241>>15525000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>15530000
                                                               <<R9241>>15535000
                                                               <<R9241>>15540000
COMMENT                                                        <<R9241>>15545000
                                                               <<R9241>>15550000
EXCHANGEDB IS CALLED TO PUT DB AT THE BASE OF A DATA SEGMENT   <<R9241>>15555000
OR TO RETURN DB TO THE CALLER'S STACK DB.  THE DESTINATION DATA<<R9241>>15560000
SEGMENT NUMBER IS SUPPLIED AS PARAMETER IF NOT RETURNING TO THE<<R9241>>15565000
STACK.  IF RETURNING TO THE STACK, SUPPLY 0 AS PARAMETER.      <<R9241>>15570000
                                                               <<R9241>>15575000
EXCHANGEDB RETURNS THE DST NUMBER OF WHERE DB WAS (0 IF STACK).<<R9241>>15580000
THIS VALUE MAY BE SAVED AND RETURNED ON THE NEXT CALL TO EXCHAN<<R9241>>15585000
TO RESTORE THE PREVIOUS ENVIRONMENT.                           <<R9241>>15590000
                                                               <<R9241>>15595000
;                                                              <<R9241>>15600000
                                                               <<R9241>>15605000
BEGIN                                                          <<R9241>>15610000
                                                               <<R9241>>15615000
LOGICAL DELTAP=Q-2;                                            <<R9241>>15620000
LOGICAL STATUS=Q-1;                                            <<R9241>>15625000
INTEGER PROCINX,                                               <<R9241>>15630000
        PCBPT;                                                 <<R9241>>15635000
DOUBLE OBJ := 0D;                                              <<R9241>>15640000
LOGICAL ARRAY OBJIDENT(*)=OBJ;                                 <<R9241>>15645000
INTEGER DESCSTINX;                                             <<R9241>>15650000
                                                               <<R9241>>15655000
TURNOFFTRAPS;                                                  <<R9241>>15660000
                                                               <<R9241>>15665000
PDISABLE;                                                      <<R9241>>15670000
<<MMSTAT'(MMSTATEXCHDB,WHERE,DELTAP,STATUS,0,0,0);>>           <<R9241>>15675000
IF PMBCFIRMWARE                                                <<*9382>>15680000
   THEN UPDATE'ICS'XDSEGBNKCELL;                               <<*9382>>15685000
TOS:=%1000D;                                                   <<R9241>>15690000
ASMB(XCHD);  <<FOR FAST ADDRESSING>>                           <<R9241>>15695000
PROCINX := PCBPT := CURPRC;                                    <<R9241>>15700000
TOS:=DBXDSINFO;                                                <<R9241>>15705000
IF < THEN SUDDENDEATH(611); <<MUST RESET FIRST>>               <<R9241>>15710000
EXCHANGEDB:=TOS.XDSDSTFIELD;                                   <<R9241>>15715000
TOS:=WHERE;                                                    <<R9241>>15720000
TOS.(0:1):=0;  <<DISCARD CLEAN BIT>>                           <<R9241>>15725000
DBXDSINFO.XDSDSTFIELD := S0;                                   <<R9241>>15730000
OBJIDENT(ObjIDnumField):=S0;                                   <<R9241>>15735000
IF S0=0 THEN                                                   <<R9241>>15740000
   BEGIN  <<DB GOES TO STK>>                                   <<R9241>>15745000
   TOS:=ICS(-ICS'STKBANKCELL);                                 <<R9241>>15750000
   TOS:=ICS(X:=X+1);                                           <<R9241>>15755000
   ASMB(XCHD);                                                 <<R9241>>15760000
   END                                                         <<R9241>>15765000
ELSE                                                           <<R9241>>15770000
   BEGIN <<GOING TO AN XDS>>                                   <<R9241>>15775000
      IF DST(0) < S0 THEN SUDDENDEATH(611); <<OUT OF RANGE>>   <<R9241>>15780000
   DISABLE;                                                    <<R9241>>15785000
   DESCSTINX:=TOS & LSL(2);                                    <<R9241>>15790000
   IF DST(DESCSTINX)=%100000 THEN                              <<R9241>>15795000
      SUDDENDEATH(625);                                        <<R9241>>15800000
   IF NOT LOGICAL(DST(DESCSTINX)).ABSENTFLAG THEN              <<R9241>>15805000
      BEGIN  <<NEW DB SEG IS PRESENT>>                         <<R9241>>15810000
      IF PMBCFIRMWARE                                          <<*9382>>15815000
                                                               <<*9382>>15820000
                                                               <<R9241>>15825000
        THEN BEGIN                                             <<*9382>>15830000
        X := DESCSTINX;                                        <<*9382>>15831000
        GET'XDSEG'LIMITS;                                      <<R9241>>15835000
        XFER'XDSEG'LIMITS;                                     <<R9241>>15840000
        END;                                                   <<R9241>>15845000
                                                               <<R9241>>15850000
      X := DESCSTINX;                                          <<*9382>>15851000
      TOS:=DST(X:=X+2);                                        <<R9241>>15855000
      TOS:=DST(X:=X+1);                                        <<R9241>>15860000
      ASMB(XCHD);                                              <<R9241>>15865000
      END                                                      <<R9241>>15870000
   ELSE                                                        <<R9241>>15875000
      BEGIN <<NOT PRESENT>>                                    <<R9241>>15880000
      ENABLE;                                                  <<R9241>>15885000
      IF LOGICAL(DST(X:=X+1)).ROCFLAG THEN                     <<R9241>>15890000
         BEGIN                                                 <<R9241>>15895000
         IF GCLASSENABLEDMASK.CLASS0 THEN                      <<R9241>>15900000
            BEGIN  <<MEASURE RECOVERY OF DATA SEG BY PROCESS>> <<R9241>>15905000
            TOS:=MEASSTATXDSBANK;                              <<R9241>>15910000
            TOS:=MEASSTATXDSBASE;                              <<R9241>>15915000
            TOS:=TOS+C0SUB0'SEGRELOFF+C'DATARECOVERY;          <<R9241>>15920000
            ASMB(LSEA);                                        <<R9241>>15925000
            TOS:=TOS+1;                                        <<R9241>>15930000
            ASMB(SSEA;DDEL);                                   <<R9241>>15935000
            END;                                               <<R9241>>15940000
         RECOVEROC(OBJ,DESCSTINX,0D);                          <<R9241>>15945000
         END                                                   <<R9241>>15950000
      ELSE                                                     <<R9241>>15955000
         BEGIN  <<REALLY ABSENT>>                              <<R9241>>15960000
         QueueOnObject(OBJ);                                   <<R9241>>15965000
         PDISABLE;                                             <<R9241>>15970000
         END;                                                  <<R9241>>15975000
                                                               <<*9382>>15980000
                                                               <<*9382>>15985000
         IF PMBCFIRMWARE  THEN                                 <<*9382>>15990000
                                                               <<R9241>>15995000
           BEGIN                                               <<R9241>>16000000
           X := DESCSTINX;  << SET X = TO DST ENTRY >>         <<*9382>>16001000
           GET'XDSEG'LIMITS;                                   <<R9241>>16005000
           XFER'XDSEG'LIMITS;                                  <<R9241>>16010000
           END;                                                <<R9241>>16015000
                                                               <<R9241>>16020000
      X := DESCSTINX;                                          <<*9382>>16021000
      TOS:= DST(X:= X+2);                                      <<R9241>>16025000
      TOS:=DST(X:=X+1);                                        <<R9241>>16030000
      ASMB(XCHD);                                              <<R9241>>16035000
      END;                                                     <<R9241>>16040000
   DST(DESCSTINX).REFERENCEDFLAG:=1;                           <<R9241>>16045000
   END;                                                        <<R9241>>16050000
PENABLE;                                                       <<R9241>>16055000
END  <<PROCEDURE EXCHANGEDB>>;                                 <<R9241>>16060000
$PAGE "DB MANIPULATION PROCEDURES : CHANGEDB"                  <<R9241>>16065000
double procedure changedb(newdb);                              <<R9241>>16070000
value                     newdb ;                              <<R9241>>16075000
double                    newdb ;                              <<R9241>>16080000
option privileged, uncallable;                                 <<R9241>>16085000
begin                                                          <<R9241>>16090000
                                                               <<R9241>>16095000
COMMENT --George R. O'Connor. HP Boise Division (11/20/81).    <<R9241>>16100000
                                                               <<R9241>>16105000
Purpose:  Performs  an extended EXCHANGEDB  to handle DB being <<R9241>>16110000
set to an absolute address, in bank zero.                      <<R9241>>16115000
                                                               <<R9241>>16120000
Error   reporting:   No  error  reporting  occurs  explicitly. <<R9241>>16125000
SUDDENDEATH's  may result from some  of the KERNELC procedures <<R9241>>16130000
which are called.                                              <<R9241>>16135000
                                                               <<R9241>>16140000
External references:                                           <<R9241>>16145000
                     exchangedb                                <<R9241>>16150000
                    ,fixed low memory                          <<R9241>>16155000
                    ,pcb                                       <<R9241>>16160000
                    ,resetdb                                   <<R9241>>16165000
                    ,setsysdb                                  <<R9241>>16170000
                                                               <<R9241>>16175000
Input:                                                         <<R9241>>16180000
     newdb  := A double word value which indicates where DB is <<R9241>>16185000
to  be set to.  If newdb < 0d  then DB will be set to the data <<R9241>>16190000
segment number -newdb.  If newdb = 0d then DB will be returned <<R9241>>16195000
to  the process's stack location.  If  newdb = 1d then DB will <<R9241>>16200000
be  returned  to the data segment or  stack location it was at <<R9241>>16205000
before  being set to an absolute location.  If newdb > 1d then <<R9241>>16210000
DB  will  be set to the absolute  address of newdb.  Note that <<R9241>>16215000
this  permits  DB  to be set to  absolute locations outside of <<R9241>>16220000
bank zero.                                                     <<R9241>>16225000
                                                               <<R9241>>16230000
Output:                                                        <<R9241>>16235000
    changedb  :=  The  value which the  caller should save and <<R9241>>16240000
pass  back to changedb so that the previous environment may be <<R9241>>16245000
properly  restored.   If  DB  was  at  the  stack  then  0d is <<R9241>>16250000
returned.   If  DB was set to the  base of a data segment then <<R9241>>16255000
the negative data segment number is returned.  If DB was at an <<R9241>>16260000
absolute  location  then  the  absolute  address  location  is <<R9241>>16265000
returned.                                                      <<R9241>>16270000
                                                               <<R9241>>16275000
Side effects:                                                  <<R9241>>16280000
     The  dbxdsinfo word of the  current process control block <<R9241>>16285000
may be changed.                                                <<R9241>>16290000
                                                               <<R9241>>16295000
Special considerations:                                        <<R9241>>16300000
     Highly privileged.                                        <<R9241>>16305000
;                                                              <<R9241>>16310000
$PAGE "PROCEDURE: CHANGEDB;  LOCAL DECLARATIONS"               <<R9241>>16315000
integer                                                        <<R9241>>16320000
        PCBPT                                                  <<R9241>>16325000
;                                                              <<R9241>>16330000
logical                                                        <<R9241>>16335000
        db'is'absolute                                         <<R9241>>16340000
;                                                              <<R9241>>16345000
$PAGE "DB MANIPULATION PROCEDURES : CHANGEDB"                  <<R9241>>16350000
                                                               <<R9241>>16355000
<<Determine if db is at an absolute location.Also the x     >> <<R9241>>16360000
<<register is set to point to the absolute address of the db>> <<R9241>>16365000
<<xds information word in the current process               >> <<R9241>>16370000
<<control block (cpcb).  This is done for speed.            >> <<R9241>>16375000
                                                               <<R9241>>16380000
PCBPT := CURPRC;                                               <<R9241>>16385000
DB'IS'ABSOLUTE := DBXDSINFO.ABSDBFLAG;                         <<R9241>>16390000
                                                               <<R9241>>16395000
if newdb <= 0D then                                            <<R9241>>16400000
                                                               <<R9241>>16405000
<<newdb is a request for DB to be set to a data segment or  >> <<R9241>>16410000
<<stack location.                                           >> <<R9241>>16415000
                                                               <<R9241>>16420000
  begin                                                        <<R9241>>16425000
  if db'is'absolute then                                       <<R9241>>16430000
                                                               <<R9241>>16435000
<<Return absolute db and reset db to the valid data segment >> <<R9241>>16440000
<<base or stack location and then exchangedb to the data    >> <<R9241>>16445000
<<segment or stack reqested.                                >> <<R9241>>16450000
                                                               <<R9241>>16455000
    begin                                                      <<R9241>>16460000
                                                               <<R9241>>16465000
<<Return absolute db.                                       >> <<R9241>>16470000
                                                               <<R9241>>16475000
    push(db);                                                  <<R9241>>16480000
    changedb := tos;                                           <<R9241>>16485000
                                                               <<R9241>>16490000
<<Reset db to a valid data segment base or stack location.  >> <<R9241>>16495000
                                                               <<R9241>>16500000
    resetdb(-1);                                               <<R9241>>16505000
    exchangedb( - integer ( newdb ) );                         <<R9241>>16510000
    end                                                        <<R9241>>16515000
                                                               <<R9241>>16520000
  else                                                         <<R9241>>16525000
                                                               <<R9241>>16530000
<<Return the inverted old data segment/stack number and >>     <<R9241>>16535000
<<exchangedb to the data segment or stack requested.    >>     <<R9241>>16540000
                                                               <<R9241>>16545000
    changedb := double( - integer(                             <<R9241>>16550000
                exchangedb( - integer( newdb ) ) ) );          <<R9241>>16555000
  end                                                          <<R9241>>16560000
else                                                           <<R9241>>16565000
                                                               <<R9241>>16570000
  if newdb = 1D then                                           <<R9241>>16575000
                                                               <<R9241>>16580000
<<newdb is a request for DB to be returned to the data >>      <<R9241>>16585000
<<segment or stack location it was at before being set >>      <<R9241>>16590000
<<to an absolute location.                             >>      <<R9241>>16595000
                                                               <<R9241>>16600000
    begin                                                      <<R9241>>16605000
    if db'is'absolute then                                     <<R9241>>16610000
                                                               <<R9241>>16615000
<<Return the absolute db location and reset db to the  >>      <<R9241>>16620000
<<data segment or stack location it was at before being>>      <<R9241>>16625000
<<set to an absolute location.                         >>      <<R9241>>16630000
                                                               <<R9241>>16635000
      begin                                                    <<R9241>>16640000
                                                               <<R9241>>16645000
<<Return absolute db. >>                                       <<R9241>>16650000
                                                               <<R9241>>16655000
      push(db);                                                <<R9241>>16660000
      changedb := tos;                                         <<R9241>>16665000
                                                               <<R9241>>16670000
<<reset db to the data segment or stack location it was >>     <<R9241>>16675000
<<at before being set to an absolute location.          >>     <<R9241>>16680000
                                                               <<R9241>>16685000
      resetdb(-1);                                             <<R9241>>16690000
      end                                                      <<R9241>>16695000
                                                               <<R9241>>16700000
    else                                                       <<R9241>>16705000
                                                               <<R9241>>16710000
<<The requester is at his request.  If the extra data >>       <<R9241>>16715000
<<segment number is zero then db is at its stack.     >>       <<R9241>>16720000
                                                               <<R9241>>16725000
      CHANGEDB := DOUBLE(-INTEGER(DBXDSINFO));                 <<R9241>>16730000
    end                                                        <<R9241>>16735000
                                                               <<R9241>>16740000
  else                                                         <<R9241>>16745000
                                                               <<R9241>>16750000
<< newdb is a request for an absolute address db. >>           <<R9241>>16755000
                                                               <<R9241>>16760000
    begin                                                      <<R9241>>16765000
    if db'is'absolute then                                     <<R9241>>16770000
                                                               <<R9241>>16775000
<<Set db to the absolute address requested and return the>>    <<R9241>>16780000
<<old absolute address of db.                            >>    <<R9241>>16785000
                                                               <<R9241>>16790000
      begin                                                    <<R9241>>16795000
      tos := newdb;                                            <<R9241>>16800000
      asmb( xchd );                                            <<R9241>>16805000
      changedb := tos;                                         <<R9241>>16810000
      end                                                      <<R9241>>16815000
    else                                                       <<R9241>>16820000
                                                               <<R9241>>16825000
<<Return the data segment number the caller is at. >>          <<R9241>>16830000
<<Set db to an absolute location.                  >>          <<R9241>>16835000
      begin                                                    <<R9241>>16840000
                                                               <<R9241>>16845000
<<Return the data segment number the caller is at. >>          <<R9241>>16850000
                                                               <<R9241>>16855000
      CHANGEDB := DOUBLE(-INTEGER(DBXDSINFO.XDSDSTFIELD));     <<R9241>>16860000
                                                               <<R9241>>16865000
<<Mark that db is at an absolute location.         >>          <<R9241>>16870000
                                                               <<R9241>>16875000
      TOS := DBXDSINFO;                                        <<R9241>>16880000
      tos.absdbflag := true;                                   <<R9241>>16885000
      DBXDSINFO := TOS;                                        <<R9241>>16890000
                                                               <<R9241>>16895000
<<Set db to an absolute location.                  >>          <<R9241>>16900000
                                                               <<R9241>>16905000
      tos := newdb;                                            <<R9241>>16910000
      asmb( xchd );                                            <<R9241>>16915000
      end                                                      <<R9241>>16920000
    end;                                                       <<R9241>>16925000
                                                               <<R9241>>16930000
end; <<changeDB>>                                              <<R9241>>16935000
DOUBLE  PROCEDURE MAPPEDCSTTOPHYCST(MAPCST,PCBPT);             <<R9241>>16940000
   VALUE MAPCST, PCBPT;                                        <<R9241>>16945000
   INTEGER MAPCST, PCBPT;                                      <<R9241>>16950000
   OPTION PRIVILEGED, UNCALLABLE;                              <<R9241>>16955000
   COMMENT                                                     <<R9241>>16960000
                                                               <<R9241>>16965000
        INPUT:                                                 <<R9241>>16970000
                                                               <<R9241>>16975000
           MAPCST = CODE SEGMENT                               <<R9241>>16980000
                    (0:1) = MAPFLAG (IGNORED IF NO MAPPING     <<R9241>>16985000
                                     FIRMWARE)                 <<R9241>>16990000
                            =1 PHYSICALLY MAPPED               <<R9241>>16995000
                               MAPCST.(1:15) = PHYSICAL        <<R9241>>17000000
                               CST #                           <<R9241>>17005000
                            =0 LOGICAL MAPPED MAPCST.(8:8)     <<R9241>>17010000
                               = LOGICAL CST #                 <<R9241>>17015000
           PCBPT   = PCB INDEX TO USE FOR MAPPING              <<R9241>>17020000
                    = 0 USE CURRENT PIN                        <<R9241>>17025000
                    <> 0 USE SPECIFIED PIN                     <<R9241>>17030000
                                                               <<R9241>>17035000
        OUTPUT:                                                <<R9241>>17040000
                                                               <<R9241>>17045000
           CCE - VALID CONVERSION                              <<R9241>>17050000
           CCL - INVALID MAPCST                                <<R9241>>17055000
                                                               <<R9241>>17060000
           MAPPEDCSTTOPHYCST = PHYSICAL CST # IF               <<R9241>>17065000
                               PROGRAM CST THEN                <<R9241>>17070000
                               RETURN IS IN BLKLABEL           <<R9241>>17075000
                               FORM                            <<R9241>>17080000
                                                               <<R9241>>17085000
                                                               <<R9241>>17090000
        NOTE: This procedure should not be called in           <<R9241>>17095000
              disabled or pdisabled mode to map MAPCST         <<R9241>>17100000
              for PIN other than current PIN.                  <<R9241>>17105000
;                                                              <<R9241>>17110000
BEGIN                                                          <<R9241>>17115000
                                                               <<R9241>>17120000
DEFINE                                                         <<R9241>>17125000
   PHYSICAL'MAPPED = (MAPCST < 0)#;                            <<R9241>>17130000
                                                               <<R9241>>17135000
   INTEGER                                                     <<R9241>>17140000
      PIN,                                                     <<R9241>>17145000
      INX,                                                     <<R9241>>17150000
      NRPGMSEGS,                                               <<R9241>>17155000
      LSTTDST,                                                 <<R9241>>17160000
      DBSAVE := 0;                                             <<R9241>>17165000
   LOGICAL                                                     <<R9241>>17170000
      DBFIXED := FALSE;                                        <<R9241>>17175000
   DOUBLE                                                      <<R9241>>17180000
      RESULT = MAPPEDCSTTOPHYCST,                              <<R9241>>17185000
      SAVEDB,                                                  <<R9241>>17190000
      DBVALUE;                                                 <<R9241>>17195000
   INTEGER ARRAY                                               <<R9241>>17200000
      LSTT(*) = DB+0;                                          <<R9241>>17205000
   LOGICAL ARRAY OBJRESULT(*)=RESULT;                          <<R9241>>17210000
   CC := CCE;                                                  <<R9241>>17215000
   IF MAPCST = 0 THEN                                          <<R9241>>17220000
      BEGIN                                                    <<R9241>>17225000
      CC := CCL;                                               <<R9241>>17230000
      RETURN;                                                  <<R9241>>17235000
      END;                                                     <<R9241>>17240000
                                                               <<R9241>>17245000
   IF PCBPT = 0 THEN                                           <<R9241>>17250000
      IF CURPRC <> 0 THEN                                      <<R9241>>17255000
         PCBPT := (CURPRC)                                     <<R9241>>17260000
      ELSE                                                     <<R9241>>17265000
         IF NOT PHYSICAL'MAPPED THEN SUDDENDEATH(999);         <<R9241>>17270000
   PIN := PCBPT/PCBSIZE;                                       <<R9241>>17275000
                                                               <<R9241>>17280000
   IF MAPPINGFIRMWARE THEN                                     <<R9241>>17285000
      BEGIN                                                    <<R9241>>17290000
      IF MAPCST < 0 THEN                                       <<R9241>>17295000
         BEGIN      << PHYSICALLY MAPPED >>                    <<R9241>>17300000
         RESULT := BUILDSEGID( 1, MAPCST.(8:8), PIN);          <<R9241>>17305000
         END                                                   <<R9241>>17310000
      ELSE                                                     <<R9241>>17315000
         BEGIN      << LOGICALLY MAPPED >>                     <<R9241>>17320000
         MAPCST := MAPCST.(8:8);                               <<R9241>>17325000
         INX := SPCBPBX;  << GET CST BLOCK INDEX >>            <<R9241>>17330000
         PDISABLE;                                             <<R9241>>17335000
         NRPGMSEGS := DST(CSTXBLK(INX));                       <<R9241>>17340000
         PENABLE;                                              <<R9241>>17345000
         IF INX <> 0 AND MAPCST <= NRPGMSEGS THEN              <<R9241>>17350000
            BEGIN     << PROGRAM SEGMENT >>                    <<R9241>>17355000
            RESULT := BUILDSEGID( 2, MAPCST, PIN);             <<R9241>>17360000
            END                                                <<R9241>>17365000
         ELSE                                                  <<R9241>>17370000
            BEGIN     << SL SEGMENT >>                         <<R9241>>17375000
            LSTTDST := SPCBMAPDST;                             <<R9241>>17380000
            IF = THEN GO NFG;                                  <<R9241>>17385000
            IF CURPRC = 0 THEN                                 <<R9241>>17390000
               BEGIN                                           <<R9241>>17395000
               TOS := DST( LSTTDST*4+2);                       <<R9241>>17400000
               TOS := DST( X:=X+1);                            <<R9241>>17405000
               ASSEMBLE( XCHD );                               <<R9241>>17410000
               SAVEDB := TOS;                                  <<R9241>>17415000
               END                                             <<R9241>>17420000
            ELSE                                               <<R9241>>17425000
               BEGIN                                           <<R9241>>17430000
               IF DBXDSINFO.ABSDBFLAG                          <<R9241>>17435000
                  THEN                                         <<R9241>>17440000
                  BEGIN                                        <<R9241>>17445000
                  DBFIXED := TRUE;                             <<R9241>>17450000
                  PUSH( DB );                                  <<R9241>>17455000
                  DBVALUE := TOS;                              <<R9241>>17460000
                  RESETDB( -1 );                               <<R9241>>17465000
                  END;                                         <<R9241>>17470000
               DBSAVE := EXCHANGEDB(LSTTDST) ;                 <<R9241>>17475000
               END;                                            <<R9241>>17480000
            IF LSTT = 0 OR MAPCST > LSTT THEN GO NFG;          <<R9241>>17485000
            << GET PHYSICAL CST FROM LSTT >>                   <<R9241>>17490000
            RESULT := DOUBLE(LSTT( MAPCST&LSL(1)));            <<R9241>>17495000
            RESULT:=BUILDSEGID(1,OBJRESULT(ObjIDnumField),PIN);<<R9241>>17500000
            GO RESTORE;                                        <<R9241>>17505000
NFG:        CC := CCL;                                         <<R9241>>17510000
RESTORE:                                                       <<R9241>>17515000
            << RE-ESTABLISH DB ENVIRONMENT >>                  <<R9241>>17520000
            IF CURPRC = 0 THEN                                 <<R9241>>17525000
               BEGIN                                           <<R9241>>17530000
               TOS := SAVEDB;                                  <<R9241>>17535000
               ASSEMBLE( XCHD );                               <<R9241>>17540000
               END                                             <<R9241>>17545000
            ELSE                                               <<R9241>>17550000
               BEGIN                                           <<R9241>>17555000
               DBSAVE := EXCHANGEDB( DBSAVE);                  <<R9241>>17560000
               IF DBFIXED THEN                                 <<R9241>>17565000
                  BEGIN  << SET ABSOLUTE MODE >>               <<R9241>>17570000
                  SETSYSDB; << SET ABS BIT IN PCB >>           <<R9241>>17575000
                  TOS := DBVALUE;                              <<R9241>>17580000
                  SET( DB );                                   <<R9241>>17585000
                  END;                                         <<R9241>>17590000
               END;                                            <<R9241>>17595000
            END;                                               <<R9241>>17600000
         END;                                                  <<R9241>>17605000
      END                                                      <<R9241>>17610000
   ELSE                                                        <<R9241>>17615000
      BEGIN         << NO MAPPING FIRMWARE >>                  <<R9241>>17620000
      MAPCST := MAPCST.(8:8);                                  <<R9241>>17625000
      RESULT := BUILDSEGID( IF MAPCST < %300 THEN 1 ELSE 2,    <<R9241>>17630000
                            MAPCST, PIN);                      <<R9241>>17635000
      END;                                                     <<R9241>>17640000
END;  << MAPPEDCSTTOPHYCST >>                                  <<R9241>>17645000
LOGICAL PROCEDURE SYSTEM( CSTNUM );                            <<R9241>>17650000
   VALUE CSTNUM;                                               <<R9241>>17655000
   INTEGER CSTNUM;                                             <<R9241>>17660000
   OPTION UNCALLABLE;                                          <<R9241>>17665000
BEGIN                                                          <<R9241>>17670000
   <<   RETURN TRUE IF MAPCST IS A SYSTEM SEGMENT   >>         <<R9241>>17675000
   <<   MAPCST IS OF THE FORM:                      >>         <<R9241>>17680000
   <<                                               >>         <<R9241>>17685000
   <<     MAPCST.(0:1)   = MAPFLAG                  >>         <<R9241>>17690000
   <<     MAPCST.(8:8)   = CST #                    >>         <<R9241>>17695000
                                                               <<R9241>>17700000
   DOUBLE  SEG;                                                <<R9241>>17705000
   SYSTEM:=FALSE;                                              <<R9241>>17710000
   SEG := MAPPEDCSTTOPHYCST( CSTNUM, 0);                       <<R9241>>17715000
   IF <> THEN RETURN;      << INVALID CST >>                   <<R9241>>17720000
   PDISABLE;                                                   <<R9241>>17725000
   SYSTEM := DST(CONVSEGIDTOSTINX(SEG)+1).SYSTEMFLAG;          <<R9241>>17730000
   PENABLE;                                                    <<R9241>>17735000
END;   << SYSTEM >>                                            <<R9241>>17740000
INTEGER PROCEDURE CSTCONV( SEG, PCBPT);                        <<R9241>>17745000
   VALUE SEG, PCBPT;                                           <<R9241>>17750000
   INTEGER SEG, PCBPT;                                         <<R9241>>17755000
   OPTION PRIVILEGED, UNCALLABLE;                              <<R9241>>17760000
BEGIN                                                          <<R9241>>17765000
   DOUBLE  CLABEL;                                             <<R9241>>17770000
                                                               <<R9241>>17775000
   CLABEL := MAPPEDCSTTOPHYCST( SEG, PCBPT );                  <<R9241>>17780000
   IF <> THEN RETURN;                                          <<R9241>>17785000
   CSTCONV := CONVSEGIDTOSTINX( CLABEL );                      <<R9241>>17790000
END;    << CSTCONV >>                                          <<R9241>>17795000
$page "CONVERT EXTERNAL LABEL TO DELTA P"                      <<R9241>>17805000
INTEGER PROCEDURE CONVEXTLABELTODELTAP(EXTLABEL);              <<R9241>>17810000
VALUE EXTLABEL;                                                <<R9241>>17815000
INTEGER EXTLABEL;                                              <<R9241>>17820000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>17825000
                                                               <<R9241>>17830000
COMMENT                                                        <<R9241>>17835000
                                                               <<R9241>>17840000
CONVEXTLABELTODELTAP QUEUES THE CALLING PROCESS ON THE SEGMENT <<R9241>>17845000
INDICATED IN THE EXTLABEL, AND WHEN THE SEGMENT IS PRESENT LOOK<<R9241>>17850000
UP THE DELTAP OF THE ENTRY POINT IN THE SEGMENT'S STT.         <<R9241>>17855000
                                                               <<R9241>>17860000
;                                                              <<R9241>>17865000
                                                               <<R9241>>17870000
BEGIN                                                          <<R9241>>17875000
                                                               <<R9241>>17880000
DOUBLE OBJ;                                                    <<R9241>>17885000
LOGICAL ARRAY objident(*)=obj;                                 <<R9241>>17890000
INTEGER DESCSTINX,                                             <<R9241>>17895000
        STTNUMBER;                                             <<R9241>>17900000
PDISABLE;                                                      <<R9241>>17905000
STTNUMBER:=EXTLABEL.(1:7);                                     <<R9241>>17910000
OBJ:=MAPPEDCSTTOPHYCST(EXTLABEL,0);                            <<R9241>>17915000
DESCSTINX:=CONVSEGIDTOSTINX(OBJ);                              <<R9241>>17920000
DISABLE;                                                       <<R9241>>17925000
IF DST(DESCSTINX) < 0 THEN  << SEG ABSENT >>                   <<R9241>>17930000
   DO                                                          <<R9241>>17935000
      BEGIN  <<ENSURE REQUESTED SEG IS PRESENT>>               <<R9241>>17940000
         QUEUEONOBJECT(OBJ);                                   <<R9241>>17945000
         PDISABLE;                                             <<R9241>>17950000
         IF objident(ObjIDTypeField)=ObjIDpgmType THEN BEGIN   <<R9241>>17955000
            X:=objident(ObjIDpbxField);                        <<R9241>>17960000
            DESCSTINX:=CSTXBLK(X)+                             <<R9241>>17965000
                          integer(objident(ObjIDnumField))*4;  <<R9241>>17970000
      END END UNTIL NOT LOGICAL(DST(DESCSTINX)).ABSENTFLAG;    <<R9241>>17975000
TOS:=DST(X:=DESCSTINX+2);                                      <<R9241>>17980000
TOS:=DST(X:=X+1);                                              <<R9241>>17985000
TOS:=DST(X:=X-3).CODESIZEFIELD&LSL(2)-1;                       <<R9241>>17990000
ASMB(LADD); <<ADDR OF PL>>                                     <<R9241>>17995000
TOS:=TOS-STTNUMBER;                                            <<R9241>>18000000
ASMB(LSEA);                                                    <<R9241>>18005000
IF MAPPINGFIRMWARE THEN                                        <<R9241>>18010000
   TOS.(1:1):=EXTLABEL.(0:1)                                   <<R9241>>18015000
ELSE                                                           <<R9241>>18020000
   TOS.(1:1):=0;<<RESET UNCALLABLE BIT/SET MAPPING FLAG>>      <<R9241>>18025000
CONVEXTLABELTODELTAP:=TOS;                                     <<R9241>>18030000
PENABLE;                                                       <<R9241>>18035000
END <<CONVEXTLABELTODELTAP>>;                                  <<R9241>>18040000
                                                               <<R9241>>18045000
$PAGE "DEBUG BREAKPOINT SETTING PROCEDURE"                     <<R9241>>18050000
$PAGE "KERNEL UTILITY PROCEDURES : GET DATA SEG CHANGE STATE"  <<R9241>>18055000
PROCEDURE GETDATASEGCHANGESTATE(SEGNUM);                       <<R9241>>18060000
VALUE SEGNUM;                                                  <<R9241>>18065000
INTEGER SEGNUM;                                                <<R9241>>18070000
OPTION PRIVILEGED,UNCALLABLE;                                  <<R9241>>18075000
                                                               <<R9241>>18080000
COMMENT                                                        <<R9241>>18085000
                                                               <<R9241>>18090000
CALLED FROM DLSIZE,ZSIZE,PXFILESIZE TO CLEAR ONGOING I/OS      <<R9241>>18095000
FLAG ABSENT, PDISABLE.ALSO FROM THE STACKOVERFLOW INTERRUPT HAN<<R9241>>18100000
                                                               <<R9241>>18105000
;                                                              <<R9241>>18110000
                                                               <<R9241>>18115000
BEGIN                                                          <<R9241>>18120000
                                                               <<R9241>>18125000
IF LOGICAL(DST(X:=SEGNUM&LSL(2)+1)).SEGRESIDENTFLAG THEN       <<R9241>>18130000
   CC:=CCL ELSE                                                <<R9241>>18135000
   BEGIN                                                       <<R9241>>18140000
   TOS:=DST(X:=X+1);                                           <<R9241>>18145000
   TOS:=DST(X:=X+1);                                           <<R9241>>18150000
   TOS:=TOS+RBTORASDISP;                                       <<R9241>>18155000
   DISABLE;                                                    <<R9241>>18160000
   PDISABLE;                                                   <<R9241>>18165000
   ASMB(LSEA);                                                 <<R9241>>18170000
   ASMB(TBC REGFZBIT);                                         <<R9241>>18175000
   IF <> THEN                                                  <<R9241>>18180000
      BEGIN                                                    <<R9241>>18185000
      CC := CCL;                                               <<R9241>>18190000
      PENABLE;                                                 <<R9241>>18195000
      END                                                      <<R9241>>18200000
   ELSE                                                        <<R9241>>18205000
      BEGIN                                                    <<R9241>>18210000
      ASMB(TBC REGLKDBIT);                                     <<R9241>>18215000
      IF <> THEN                                               <<R9241>>18220000
         BEGIN                                                 <<R9241>>18225000
         CC := CCL;                                            <<R9241>>18230000
         PENABLE;                                              <<R9241>>18235000
         END                                                   <<R9241>>18240000
      ELSE                                                     <<R9241>>18245000
         BEGIN                                                 <<R9241>>18250000
         ASMB(TBC REGIOFZBIT);                                 <<R9241>>18255000
         IF <> THEN                                            <<R9241>>18260000
            BEGIN                                              <<R9241>>18265000
            TOS.SIZECHANGEPNDGFLAG:=1;                         <<R9241>>18270000
            ASMB(SSEA);                                        <<R9241>>18275000
            TOS:=TOS+RASTOMPQLINKDISP;                         <<R9241>>18280000
            TOS := CURPRC;                                     <<R9241>>18285000
            ASMB(SSEA);                                        <<R9241>>18290000
            IMPEDE(0);                                         <<R9241>>18295000
            CC:=CCG;                                           <<R9241>>18300000
            END                                                <<R9241>>18305000
        ELSE                                                   <<R9241>>18310000
            BEGIN                                              <<R9241>>18315000
            DST(X:=SEGNUM&LSL(2)).ABSENTFLAG:=1;               <<R9241>>18320000
            CC:=CCE;                                           <<R9241>>18325000
            END;                                               <<R9241>>18330000
         END;                                                  <<R9241>>18335000
      END;                                                     <<R9241>>18340000
   END;                                                        <<R9241>>18345000
END  <<GETDATASEGCHANGESTATE(SEGNUM)>>;                        <<R9241>>18350000
$CONTROL SEGMENT=MAIN                                          <<R9241>>18355000
END.                                                           <<R9241>>18360000
