         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
DEFINE REGREFFLAGS = (3:2)#,                                   <<31857>>00971000
       REGREFFLAG1 = (3:1)#,                                   <<31857>>00971100
       REGREFFLAG2 = (4:1)#;                                   <<31857>>00971200
                                                               <<31857>>00971300
DEFINE PMBCFIRMWARE = ABS(%1220).(14:1)#;                      <<*9384>>01440000
$INCLUDE INCLCIMP  <<External Procedures for Disc Cacheing>>   <<R9229>>01996000
$INCLUDE INCLIOIM  <<External Procedures for I/O system>>      <<R9229>>01997000
$INCLUDE INCLMIMP                                              <<R9229>>01998000
$EDIT VOID = 2145000                                           <<R9229>>02130000
$EDIT VOID = 2170000                                           <<R9229>>02150000
                                                               <<02033>>02176500
    OPTION EXTERNAL;                                           <<R9229>>02195000
    OPTION EXTERNAL;                                           <<R9229>>02220000
$EDIT VOID = 2245000                                           <<R9229>>02230000
    OPTION EXTERNAL;                                           <<R9229>>02270000
                                                               <<R9229>>02276600
PROCEDURE PSEUDOINT;                                           <<R9229>>02276700
    OPTION EXTERNAL;                                           <<R9229>>02276800
                                                               <<R9229>>02276900
PROCEDURE SET'PSIF(PCBPT,FLAG);                                <<R9229>>02278400
    VALUE PCBPT,FLAG;                                          <<R9229>>02278500
    INTEGER PCBPT;                                             <<R9229>>02278600
    LOGICAL FLAG;                                              <<R9229>>02278700
    OPTION EXTERNAL;                                           <<R9229>>02278800
                                                               <<R9229>>02278900
LOGICAL PROCEDURE ISOBJECTIMI(OBJ);                            <<R9229>>02279600
    VALUE OBJ;                                                 <<R9229>>02279700
    DOUBLE OBJ;                                                <<R9229>>02279800
    OPTION EXTERNAL;                                           <<R9229>>02279900
                                                               <<R9229>>02280000
INTEGER PROCEDURE PROCESSPRI(PIN);                             <<R9229>>02280600
    VALUE PIN;                                                 <<R9229>>02280700
    INTEGER PIN;                                               <<R9229>>02280800
    OPTION EXTERNAL;                                           <<R9229>>02280900
                                                               <<R9229>>02281000
LOGICAL PROCEDURE ISOBJECTABSENT(OBJ);                         <<R9229>>02281100
    VALUE OBJ;                                                 <<R9229>>02281200
    DOUBLE OBJ;                                                <<R9229>>02281300
    OPTION EXTERNAL;                                           <<R9229>>02281400
                                                               <<R9229>>02281500
PROCEDURE MEAS'OBJFAULT(OBJ);                                  <<R9229>>02283600
    VALUE OBJ;                                                 <<R9229>>02283700
    DOUBLE OBJ;                                                <<R9229>>02283800
    OPTION EXTERNAL;                                           <<R9229>>02283900
                                                               <<R9229>>02283910
INTEGER PROCEDURE UPDATESTATISTICS(CLASS,SUBCLASS,             <<R9229>>02284000
    SUBCLASSENTRY,STARTINGITEM,NEWVALUEFLAG,VALUECHANGE,       <<R9229>>02284100
    DOUBLEITEMFLAG);                                           <<R9229>>02284110
    VALUE CLASS,SUBCLASS,SUBCLASSENTRY,STARTINGITEM,           <<R9229>>02284200
          NEWVALUEFLAG,VALUECHANGE,DOUBLEITEMFLAG;             <<R9229>>02284300
    INTEGER CLASS,SUBCLASS,SUBCLASSENTRY,STARTINGITEM;         <<R9229>>02284400
    DOUBLE VALUECHANGE;                                        <<R9229>>02284500
    LOGICAL NEWVALUEFLAG,DOUBLEITEMFLAG;                       <<R9229>>02284600
    OPTION EXTERNAL;                                           <<R9229>>02284700
                                                               <<R9229>>02284800
PROCEDURE RELSYSTABENTRY(TABLEDST,ENTRYINDEX);                 <<R9229>>02284900
    VALUE TABLEDST,ENTRYINDEX;                                 <<R9229>>02285000
    LOGICAL TABLEDST,ENTRYINDEX;                               <<R9229>>02285100
    OPTION EXTERNAL;                                           <<R9229>>02285200
                                                               <<R9229>>02285300
                                                               <<R9229>>02286100
LOGICAL PROCEDURE GETSYSTABENTRY(TABLEDST,PRIMARY,WAIT);       <<R9229>>02286200
    VALUE TABLEDST,PRIMARY,WAIT;                               <<R9229>>02286300
    LOGICAL TABLEDST,PRIMARY,WAIT;                             <<R9229>>02286400
    OPTION EXTERNAL;                                           <<R9229>>02286500
                                                               <<R9229>>02286600
PROCEDURE AWAKE(PCBPT,WAKECODE,WAITFLAGS);                     <<R9229>>02287000
VALUE PCBPT,WAKECODE,WAITFLAGS;                                <<R9229>>02288000
$EDIT VOID = 2490000                                           <<R9229>>02430000
$page                                                          <<U1718>>04201010
PROCEDURE MMSTAT'70(EVENT,P1,P2,P3,P4,P5,P6);                  <<U1718>>04201020
  VALUE   EVENT,P1,P2,P3,P4,P5,P6;                             <<U1718>>04201030
  INTEGER EVENT,P1,P2,P3,P4,P5,P6;                             <<U1718>>04201040
  OPTION  PRIVILEGED,UNCALLABLE;                               <<U1718>>04201050
                                                               <<U1718>>04201060
<<***********************************************************>><<U1718>>04201070
<<***********************************************************>><<U1718>>04201080
<<**                                                       **>><<U1718>>04201090
<<**    THIS IS THE MICROCODED VERSION OF MMSTAT'.         **>><<U1718>>04201100
<<**                                                       **>><<U1718>>04201110
<<**    ENTER THE EVENT INTO THE MONITOR TABLE AND/OR      **>><<U1718>>04201120
<<**    COLLECT PERFORMANCE MEASUREMENT DATA.              **>><<U1718>>04201130
<<**                                                       **>><<U1718>>04201140
<<**  ===================================================  **>><<U1718>>04201150
<<**  = WARNING   WARNING   WARNING   WARNING   WARNING =  **>><<U1718>>04201160
<<**  ===================================================  **>><<U1718>>04201170
<<**                                                       **>><<U1718>>04201180
<<**    THIS PROCEDURE IS INTENDED FOR USE ONLY WITH THE   **>><<U1718>>04201190
<<**    PERFORMANCE ENHANCEMENT MICROCODE WRITTEN TO       **>><<U1718>>04201200
<<**    REPLACE THE MPE PROCEDURE "MMSTAT'".               **>><<U1718>>04201210
<<**                                                       **>><<U1718>>04201220
<<**  ===================================================  **>><<U1718>>04201230
<<**  = CAUTION   CAUTION   CAUTION   CAUTION   CAUTION =  **>><<U1718>>04201240
<<**  ===================================================  **>><<U1718>>04201250
<<**                                                       **>><<U1718>>04201260
<<**    THE MICROCODE GROUP SHOULD EVALUATE ANY CHANGES    **>><<U1718>>04201270
<<**    TO THIS CODE TO AVOID POTENTIAL PROBLEMS.          **>><<U1718>>04201280
<<**                                                       **>><<U1718>>04201290
<<**    SEE MMSTAT' FOR FURTHER INFORMATION.               **>><<U1718>>04201300
<<**                                                       **>><<U1718>>04201310
<<***********************************************************>><<U1718>>04201320
<<***********************************************************>><<U1718>>04201330
                                                               <<U1718>>04201340
  BEGIN                                                        <<U1718>>04201350
                                                               <<U1718>>04201360
                                                               <<U1718>>04201370
                                                               <<U1718>>04201380
                                                               <<U1718>>04201390
INTEGER                                                        <<U1718>>04201400
   PCBPT,                                                      <<U1718>>04201410
   OFFSET;                                                     <<U1718>>04201420
DOUBLE                                                         <<U1718>>04201430
   BASE,                                                       <<U1718>>04201440
   SAVE'DB;                                                    <<U1718>>04201450
                                                               <<U1718>>04201460
INTRINSIC        TIMER;                 <<TIME FUNCTION>>      <<U1718>>04201470
                                                               <<U1718>>04201480
                                                               <<U1718>>04201490
                                                               <<U1718>>04201500
DOUBLE SUBROUTINE CONVERT'POINTER'TO'DOUBLE'ADDRESS(PTR);      <<U1718>>04201510
VALUE PTR;                                                     <<U1718>>04201520
LOGICAL PTR;                                                   <<U1718>>04201530
BEGIN                                                          <<U1718>>04201540
                                                               <<U1718>>04201550
TOS := ABS(SYSBASE + PTR).(11:5); << extract bank >>           <<U1718>>04201560
TOS := ABS(X) LAND %177740; << extract address >>              <<U1718>>04201570
BASE := TOS;                                                   <<U1718>>04201580
CONVERT'POINTER'TO'DOUBLE'ADDRESS := BASE;                     <<U1718>>04201590
                                                               <<U1718>>04201600
END; << subrouine CONVERT'POINTER'TO'DOUBLE'ADDRESS >>         <<U1718>>04201610
                                                               <<U1718>>04201620
$page                                                          <<U1718>>04201630
<< ============ MACHINE INSTRUCTION FOR MMSTAT' ============ >><<U1718>>04201640
                                                               <<U1718>>04201650
ASSEMBLE(CON %20104, %35);   << MICROCODED MMSTAT' >>          <<U1718>>04201660
                                                               <<U1718>>04201670
<< @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >><<U1718>>04201680
                                                               <<U1718>>04201690
IF > THEN                    << UNABLE TO HANDLE THE MPE >>    <<U1718>>04201700
  BEGIN                      << CODE IN MICROCODE        >>    <<U1718>>04201710
                                                               <<U1718>>04201720
<< IF A PROCESS IS EXECUTING, GET ITS PIN >>                   <<U1718>>04201730
                                                               <<U1718>>04201740
PCBPT := CURPRC;                                               <<U1718>>04201750
                                                               <<U1718>>04201760
                                                               <<U1718>>04201770
<< IF THE EVENT NUMBER IS POSITIVE THEN >>                     <<U1718>>04201780
<<                                      >>                     <<U1718>>04201790
<<      CHECK EVENT VALIDITY            >>                     <<U1718>>04201800
<<      DISABLE INTERRUPTS              >>                     <<U1718>>04201810
<<      XCHD TO SYSDB                   >>                     <<U1718>>04201820
<<      LOG THE EVENT TO MONBUF         >>                     <<U1718>>04201830
<<                                      >>                     <<U1718>>04201840
<< IF THE EVENT NUMBER IS NEGATIVE THEN >>                     <<U1718>>04201850
<<                                      >>                     <<U1718>>04201860
<<      MAKE IT POSITIVE                >>                     <<U1718>>04201870
<<      CHECK ITS VALIDITY              >>                     <<U1718>>04201880
<<      DISABLE INTERRUPTS              >>                     <<U1718>>04201890
<<      XCHD TO SYSDB                   >>                     <<U1718>>04201900
                                                               <<U1718>>04201910
                                                               <<U1718>>04201920
                                                               <<U1718>>04201930
                                                               <<U1718>>04201940
<<  Turn off traps >>                                          <<U1718>>04201950
PUSH(STATUS);                                                  <<U1718>>04201960
TOS.(2:1) := 0;                                                <<U1718>>04201970
SET(STATUS);                                                   <<U1718>>04201980
                                                               <<U1718>>04201990
TOS := EVENT;                                                  <<U1718>>04202000
                                                               <<U1718>>04202010
IF >= THEN                                                     <<U1718>>04202020
                                                               <<U1718>>04202030
  BEGIN <<POSITIVE EVENT>>                                     <<U1718>>04202040
                                                               <<U1718>>04202050
  IF EVENT > MAXEVENTNUMBER THEN                               <<U1718>>04202060
     RETURN;                                                   <<U1718>>04202070
                                                               <<U1718>>04202080
  DISABLE;                                                     <<U1718>>04202090
  push(z); push(s); assemble(sub);                             <<U1718>>04202100
                                                               <<U1718>>04202110
  if TOS<34 then return; <<MMstat cant stand a stack overflow>><<U1718>>04202120
                                                               <<U1718>>04202130
  TOS := SYSBASE D;                                            <<U1718>>04202140
                                                               <<U1718>>04202150
  ASSEMBLE(XCHD);                                              <<U1718>>04202160
  SAVE'DB := TOS;                                              <<U1718>>04202170
                                                               <<U1718>>04202180
                                                               <<U1718>>04202190
                                                               <<U1718>>04202200
<< Save procinx, event, and parms into MONBUF >>               <<U1718>>04202210
                                                               <<U1718>>04202220
  SMONBUF(SMONDIX) := PCBPT;                                   <<U1718>>04202230
  SMONBUF(X := X + 1) := EVENT;                                <<U1718>>04202240
  SMONBUF(X:=X+1)  := P1;                                      <<U1718>>04202250
  SMONBUF(X:=X+1)  := P2;                                      <<U1718>>04202260
  SMONBUF(X:=X+1)  := P3;                                      <<U1718>>04202270
  SMONBUF(X := X + 1) := P4;                                   <<U1718>>04202280
  SMONBUF(X := X + 1) := P5;                                   <<U1718>>04202290
  SMONBUF(X := X + 1) := P6;                                   <<U1718>>04202300
                                                               <<U1718>>04202310
                                                               <<U1718>>04202320
                                                               <<U1718>>04202330
                                                               <<U1718>>04202340
<< IF THE END OF THE BUFFER HAS BEEN REACHED, >>               <<U1718>>04202350
<< SET THE BUFFER INDEX TO THE START OF THE   >>               <<U1718>>04202360
<< BUFFER AND RESET THE TIME STAMPS IN THE    >>               <<U1718>>04202370
<< FIRST ENTRY.  THIS ENTRY CONTAINS TWO TIME >>               <<U1718>>04202380
<< TIME STAMPS INDICATING THE LAST TWO TIMES  >>               <<U1718>>04202390
<< WRAP AROUND HAS OCCURED.  TIME STAMPS ARE  >>               <<U1718>>04202400
<< TWO WORDS IN LENGTH.                       >>               <<U1718>>04202410
                                                               <<U1718>>04202420
                                                               <<U1718>>04202430
   IF (SMONDIX := SMONDIX + SMON'ENTRY'SIZE) >=                <<U1718>>04202440
       SMONBUFSIZE THEN                                        <<U1718>>04202450
                                                               <<U1718>>04202460
     BEGIN <<MONBUF WRAP AROUND>>                              <<U1718>>04202470
                                                               <<U1718>>04202480
     SMONDIX := SMON'ENTRY'SIZE;                               <<U1718>>04202490
     TOS := TIMER;            <<GET NEW TIME STAMP>>           <<U1718>>04202500
     TOS := SMONBUF(0);       <<GET OLD TIME STAMP>>           <<U1718>>04202510
     TOS := SMONBUF(X:=X+1);                                   <<U1718>>04202520
     SMONBUF(X:=X+2) := TOS;  <<SAVE OLD TIME STAMP>>          <<U1718>>04202530
     SMONBUF(X:=X-1) := TOS;                                   <<U1718>>04202540
     SMONBUF(X:=X-1) := TOS;  <<SAVE NEW TIME STAMP>>          <<U1718>>04202550
     SMONBUF(X:=X-1) := TOS;                                   <<U1718>>04202560
                                                               <<U1718>>04202570
     END; <<MONBUF WRAP AROUND>>                               <<U1718>>04202580
                                                               <<U1718>>04202590
  END <<POSITIVE EVENT>>                                       <<U1718>>04202600
                                                               <<U1718>>04202610
ELSE                                                           <<U1718>>04202620
                                                               <<U1718>>04202630
  BEGIN <<NEGATIVE EVENT>>                                     <<U1718>>04202640
                                                               <<U1718>>04202650
  TOS := -EVENT;                                               <<U1718>>04202660
                                                               <<U1718>>04202670
  IF (EVENT := TOS) > MAXEVENTNUMBER THEN                      <<U1718>>04202680
     RETURN;                                                   <<U1718>>04202690
                                                               <<U1718>>04202700
  DISABLE;                                                     <<U1718>>04202710
  TOS := SYSBASE D;                                            <<U1718>>04202720
  ASSEMBLE(XCHD);                                              <<U1718>>04202730
  SAVE'DB := TOS;                                              <<U1718>>04202740
                                                               <<U1718>>04202750
  END; <<NEGATIVE EVENT>>                                      <<U1718>>04202760
                                                               <<U1718>>04202770
                                                               <<U1718>>04202780
<< IF A MONITOR RUN IS REQUESTED THEN LOG THE EVENT >>         <<U1718>>04202790
<< TO THE MEASBUF DOUBLE BUFFER SET AND CALL MEASIO >>         <<U1718>>04202800
<< WHEN A BUFFER IS FILLED.                         >>         <<U1718>>04202810
                                                               <<U1718>>04202820
                                                               <<U1718>>04202830
IF (TOS:=MEASFLAG) THEN                                        <<U1718>>04202840
                                                               <<U1718>>04202850
  BEGIN <<MEASUREMENT ENABLED>>                                <<U1718>>04202860
                                                               <<U1718>>04202870
                                                               <<U1718>>04202880
<< COMPUTE THE GROUP ID (MODULO 10) AND TEST ITS >>            <<U1718>>04202890
<< CORRESPONDING MEASUREMENT ENABLE FLAG.        >>            <<U1718>>04202900
                                                               <<U1718>>04202910
                                                               <<U1718>>04202920
  TOS := EVENT/10;                                             <<U1718>>04202930
  ASSEMBLE(TRBC 11);                                           <<U1718>>04202940
                                                               <<U1718>>04202950
  TOS := IF = THEN MEAS'MSK0 ELSE MEAS'MSK1;                   <<U1718>>04202960
                                                               <<U1718>>04202970
  ASSEMBLE(STBX; TBC 0,X; DDEL);                               <<U1718>>04202980
                                                               <<U1718>>04202990
                                                               <<U1718>>04203000
                                                               <<U1718>>04203010
<< IF THE EVENT IS ENABLED FOR MONTIORING, DUMP IT   >>        <<U1718>>04203020
<< TO THE CURRENT MEASUREMENT BUFFER.  IF THE BUFFER >>        <<U1718>>04203030
<< IS FILLED, CALL "MEASIO" TO WRITE THE BUFFER TO   >>        <<U1718>>04203040
<< TAPE AND SWITCH TO THE OTHER BUFFER.              >>        <<U1718>>04203050
                                                               <<U1718>>04203060
                                                               <<U1718>>04203070
                                                               <<U1718>>04203080
  IF <> THEN                            <<TEST ENABLE FLAG>>   <<U1718>>04203090
                                                               <<U1718>>04203100
     BEGIN <<EVENT ENABLED>>                                   <<U1718>>04203110
                                                               <<U1718>>04203120
     ASSEMBLE(TBC 14);                  <<TEST GROUP FLAG>>    <<U1718>>04203130
     OFFSET := IF = THEN 0 ELSE MEASBUFSIZE;                   <<U1718>>04203140
                                                               <<U1718>>04203150
     TOS := TIMER;                                             <<U1718>>04203160
     ASSEMBLE(XCH);                                            <<U1718>>04203170
     MEASBUF(INTEGER(MEAS'IDX) + OFFSET) := TOS;               <<U1718>>04203180
     MEASBUF(X:=X+1)  := TOS;                                  <<U1718>>04203190
     MEASBUF(X := X + 1) := PCBPT;                             <<U1718>>04203200
     MEASBUF(X:=X+1)  := EVENT;                                <<U1718>>04203210
     MEASBUF(X:=X+1)  := P1;                                   <<U1718>>04203220
     MEASBUF(X:=X+1)  := P2;                                   <<U1718>>04203230
     MEASBUF(X:=X+1)  := P3;                                   <<U1718>>04203240
     MEASBUF(X := X + 1) := P4;                                <<U1718>>04203250
     MEASBUF(X := X + 1) := P5;                                <<U1718>>04203260
     MEASBUF(X := X + 1) := P6;                                <<U1718>>04203270
                                                               <<U1718>>04203280
     IF (MEAS'IDX := MEAS'IDX + MEAS'ENTRY'SIZE) >=            <<U1718>>04203290
         MEASBUFSIZE THEN                                      <<U1718>>04203300
                                                               <<U1718>>04203310
        BEGIN <<WRITE BUFFER>>                                 <<U1718>>04203320
                                                               <<U1718>>04203330
        MEAS'IDX := 0;                                         <<U1718>>04203340
        ASSEMBLE(TCBC 14; DUP);   <<SWITCH BUFFER FLAG>>       <<U1718>>04203350
        MEASFLAG := TOS;          <<SAVE IN CASE INTERRUPTED>> <<U1718>>04203360
        TOS := 0;                 <<RESULT>>                   <<U1718>>04203370
        TOS := MEAS'LDEV;         <<TAPE LDEV>>                <<U1718>>04203380
        TOS := 1;                 <<MEASIO WRITE REQUEST>>     <<U1718>>04203390
        TOS := CONVERT'POINTER'TO'DOUBLE'ADDRESS(MEASBUFPTR);  <<U1718>>04203400
        TOS := TOS + OFFSET;                                   <<U1718>>04203410
        TOS := MEASBUFSIZE;       <<MEASBUF SIZE>>             <<U1718>>04203420
        TOS := MEAS'PLAB;         <<MEASIO PLABEL>>            <<U1718>>04203430
                                                               <<U1718>>04203440
        TOS := SYSBASE D;                                      <<U1718>>04203450
        ASSEMBLE(XCHD;DDEL);                                   <<U1718>>04203460
                                                               <<U1718>>04203470
        ASSEMBLE(PCAL 0);         <<CALL MEASIO>>              <<U1718>>04203480
                                                               <<U1718>>04203490
                                                               <<U1718>>04203500
                                                               <<U1718>>04203510
<< ON RETURN FROM "MEASIO", CHECK THE TAPE STATUS  >>          <<U1718>>04203520
<< AND MARK THE APPROPRIATE MEASFLAG BIT:          >>          <<U1718>>04203530
<<          MEASFLAG(12:1) - TAPE ERROR            >>          <<U1718>>04203540
<<          MEASFLAG(13:1) - END OF TAPE           >>          <<U1718>>04203550
<<          MEASFLAG(14:1) - BUFFER SELECT         >>          <<U1718>>04203560
<<          MEASFLAG(15:1) - MEASIO ENABLE         >>          <<U1718>>04203570
                                                               <<U1718>>04203580
        DEL;                 <<DELETE TAPE STATUS WORD>>       <<U1718>>04203590
                                                               <<U1718>>04203600
        IF <> THEN           <<TEST TAPE STATUS>>              <<U1718>>04203610
                                                               <<U1718>>04203620
           BEGIN <<TAPE STATUS>>                               <<U1718>>04203630
                                                               <<U1718>>04203640
           IF > THEN TOS.(13:1) := 1    <<END OF TAPE>>        <<U1718>>04203650
                ELSE TOS.(12:1) := 1;   <<TAPE ERROR>>         <<U1718>>04203660
                                                               <<U1718>>04203670
           TOS.(15:1) := 0;             <<CLEAR MEASIO ENABLE>><<U1718>>04203680
                                                               <<U1718>>04203690
           END; <<TAPE STATUS>>                                <<U1718>>04203700
                                                               <<U1718>>04203710
        END; <<WRITE BUFFER>>                                  <<U1718>>04203720
                                                               <<U1718>>04203730
     END; <<EVENT ENABLED>>                                    <<U1718>>04203740
                                                               <<U1718>>04203750
  MEASFLAG := TOS;                 <<RESTORE MEASFLAG>>        <<U1718>>04203760
                                                               <<U1718>>04203770
  END <<MEASUREMENT ENABLED>>                                  <<U1718>>04203780
                                                               <<U1718>>04203790
                                                               <<U1718>>04203800
ELSE                                                           <<U1718>>04203810
                                                               <<U1718>>04203820
  DEL;                             <<DELETE MEASFLAG>>         <<U1718>>04203830
                                                               <<U1718>>04203840
TOS := SAVE'DB;                                                <<U1718>>04203850
ASSEMBLE(XCHD);                                                <<U1718>>04203860
DDEL;                                                          <<U1718>>04203870
                                                               <<U1718>>04203880
  END;    << UNABLE TO HANDLE THE MPE CODE IN MICROCODE >>     <<U1718>>04203890
                                                               <<U1718>>04203900
<< @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >><<U1718>>04203910
                                                               <<U1718>>04203920
END;   << MMSTAT'70 >>                                         <<U1718>>04203930
$page                                                          <<U1718>>04203940
$EDIT VOID = 15375000                                          <<R9229>>04210000
$EDIT VOID = 16845000                                          <<R9229>>16515000
$EDIT VOID=18255000                                                     18150000
COMMENT                                                                 18150100
**BEGIN_IS*****************************************************         18150200
*                                                             *         18150300
* PROCEDURE WAIT(EVENTMASK,SPECIALINFO)                       *         18150400
*                                                             *         18150500
* PURPOSE:  WAIT IS A PROCEDURE CALLED TO PUT THE CURRENT     *         18150600
*           PROCESSIN A BLOCKED (SUSPENDED) STATE UNTIL       *         18150700
*           EITHER ONE EVENT OF A GROUP OF EVENT(S) SPECIFIED *         18150800
*           BY THE EVENTMASK PARAMETER OR AN EXPLICIT AWAKE   *         18150900
*           REQUEST IS SENT TO HAVE THE PROCESS RESCHEDULED.  *         18151000
*           THE CALLER MAY REQUEST THAT WAIT RETURN           *         18151100
*           IMMEDIATELY IF ONE OF THE WAITED EVENT(S) HAS     *         18151200
*           ALREADY HAPPENED BY MAKING THE EVENTMASK          *         18151300
*           NEGATIVE.  WHEN THE WAIT IS OVER, ABORT THE       *         18151400
*           PROCESS IF A STACK OVERLFOW HAS OCCURRED OR FLAG  *         18151500
*           ANY PSEUDO INTERRUPTS THAT MAY HAVE OCCURRED      *         18151600
*           BEFORE RETURNING TO THE CALLER.                   *         18151700
*                                                             *         18151800
*           START BY TURNING OFF USER TRAPS, SET UP THE       *         18151900
*           CURRENT PROCESS POINTER AND DISABLE INTERRUPTS.   *         18152000
*           IF SOFT (PSEUDO) INTERRUPTS ARE TO BE CHECKED AND *         18152100
*           WAITED FOR (SPECIFIED IN THE SPECIALINFO          *         18152200
*           PARAMETER) THEN MAP INTO THE CURRENT PROCESS'     *         18152300
*           PXFIXED AREA AND SEE IF A SOFT INTERRUPT HAS      *         18152400
*           ALREADY OCCURRED (BY CHECKING THE PROCESS CONTROL *         18152500
*           BLOCK [PCB]) OR WHETHER A CONTROL-Y HAS HAPPENED. *         18152600
*           IF EITHER HAS HAPPENDED THEN RETURN WITH THE      *         18152700
*           CONDITION CODE (CC) SET TO CCG.  OTHERWISE SET    *         18152800
*           THE BIT IN THE PCB INDICATING THAT SOFT           *         18152900
*           INTERRUPTS ARE OK.                                *         18153000
*                                                             *         18153100
*           THEN BEGIN THE CHECKING TO SEE IF ANY OF THE      *         18153200
*           EVENTS TO BE WAITED ON HAS ALREADY OCCURRED BY    *         18153300
*           FIRST MAPPING DB TO SYSDB AND DISABLING           *         18153400
*           INTERRUPTS.  IF THE CALLER HAS REQUESTED TO SEE   *         18153500
*           IF ANY OF THE WAITED EVENTS HAS OCCURRED, THEN    *         18153600
*           DETERMINE WHETHER TO USE THE NEW OR OLD VERSION   *         18153700
*           OF WAIT.  IF THE NEW VERSION IS SELECTED, THEN    *         18153800
*           SUDDENDEATH WITH A 604 BECAUSE IT HAS NOT BEEN    *         18153900
*           IMPLEMENTED.  IF THE WAKE UP WAITING SWITCH (WWS) *         18154000
*           IS ON, THEN AT LEAST ONE NON-CRITICAL (USER),     *         18154100
*           WAITABLE EVENT HAS OCCURRED, SO INDICATE THAT THE *         18154200
*           PROCESS IS NO LONGER IN TRANSITION FROM ACTIVE TO *         18154300
*           A WAITED STATE, CLEAR THE EVENT FLAGS, INDICATE   *         18154400
*           THAT THE TRANSACTION IS COMPLETED, RESET DB AND   *         18154500
*           CLEAR THE PSEUDO-DISABLE FLAG BEFORE RETURNING.   *         18154600
*                                                             *         18154700
*           IF THE PROCESS IS TO BE IMPEDED UNCONDITIONALLY   *         18154800
*           OR TOSSED (IGNORED) DUE TO A SHUTDOWN, THEN DO    *         18154900
*           THE FOLLOWING:  IF IT IS TO BE IMPEDED, THEN TURN *         18155000
*           ON THE IMPEDED BIT IN THE WAIT MASK, AND BUMP THE *         18155100
*           GLOBAL NUMBER OF PROCESSES BEING IMPEDED OR THE   *         18155200
*           PROCESS SPECIFIC NUMBER OF TIMES IT WAS IMPEDED   *         18155300
*           IF THE MEASUREMENT INTERFACE STATISTICS GATHERING *         18155400
*           FLAGS WERE ENABLED.  OTHERWISE ASSUME THE PROCESS *         18155500
*           IS TO BE TOSSED AND HAVE IT UNQUEUED FROM ANY     *         18155600
*           SYSTEM QUEUE BY CALLING PROCEDURE QUEUEPROC.      *         18155700
*                                                             *         18155800
*           THE NEXT THING TO DO IS TO CHECK TO SEE IF ANY    *         18155900
*           PENDING EVENTS HAD ALREADY OCCURRED OR NOT.  IF   *         18156000
*           ANY DID NOT, THEN CLEAR THE EVENT WORD OF ANY     *         18156100
*           LEFT OVER EVENTS.  IF ANY DID, THEN JUST CLEAR    *         18156200
*           OUT THE CRITICAL EVENT FLAGS USED BY THE SYSTEM.  *         18156300
*           THEN MERGE THE NEW EVENT BIT(S) TO BE WAITED ON   *         18156400
*           WITH ANY OF THE OLD ONES LEFT IN.  IF THERE IS A  *         18156500
*           WAIT FOR A FATHER/SON EVENT, THEN INDICATE TO THE *         18156600
*           DISPATCHER THAT THE TRANSACTION IS COMPLETE.      *         18156700
*           ALSO PASS ALONG ANY SPECIALINFO INFORMATION TO    *         18156800
*           THE DISPATCHER, CLEAR THE PSEUDO INTERRUPT        *         18156900
*           COUNTER AND RESTORE DB BEFORE CALLING DISPATCHER  *         18157000
*           WITH AN ASMB(DISP) INSTRUCTION.                   *         18157100
*                                                             *         18157200
*           WHEN THE WAIT IS OVER, PROCEDURE ABORT IS CALLED  *         18157300
*           IF THE PROCESS HAD A STACK OVERFLOW AND WAS NOT   *         18157400
*           IN A PREVIOUS STACK OVERFLOW, NOT EXECUTING       *         18157500
*           SYSTEM CODE, NOT IN CRITICAL CODE AND DOESN'T     *         18157600
*           HAVE A SYSTEM INTERNAL RESOURCE (SIR).  ALSO, IF  *         18157700
*           SOFT INTERRUPTS WERE ENABLED, RESET THE WAKESOFT  *         18157800
*           FLAG BIT IN THE PCB AND SET THE CONDITION CODE TO *         18157900
*           CCG IF ONE HAS OCCURRED.                          *         18158000
*                                                             *         18158100
* ENTRY     EVENTMASK  <0    IF TO CHECK FOR EVENT AND RETURN *         18158200
*                            IMMEDIATELY IF EVENT HAS ALREADY *         18158300
*                            OCCURRED.                        *         18158400
*                                                             *         18158500
*                      =IMPWAITCODE (%100000) IF IMPEDED      *         18158600
*                       WAIT CODE                             *         18158700
*                      =SIRWAITCODE (%40000) IF WAITING       *         18158800
*                       ON SIR                                *         18158900
*                      =TIMERWAITCODE (%20000) IF             *         18159000
*                       WAITING FOR TIMER                     *         18159100
*                      =MEMORYWAITCODE (%10000) IF            *         18159200
*                       WAITING ON MEMORY                     *         18159300
*                      =MOURNINGWAITCODE (%4000) IF IN        *         18159400
*                       MOURNING WAIT                         *         18159500
*                      =GLOBALRINWAITCODE (%2000) IF          *         18159600
*                       GLOBAL RIN WAIT                       *         18159700
*                      =LOCALRINWAITCODE (%1000) IF           *         18159800
*                       LOCAL RIN WAIT                        *         18159900
*                      =MAILWAITCODE (%400) IF MAIL WAIT      *         18160000
*                      =BIOWAITCODE (%200) IF BLOCKED         *         18160100
*                       I/O WAIT                              *         18160200
*                      =UIOWAITCODE (%100) IF WAITING         *         18160300
*                       AND NOWAIT IO/IOWAIT                  *         18160400
*                      =UCOPWAITCODE (%40) IF UCP, UCOP       *         18160500
*                       AND RIT WAIT                          *         18160600
*                      =JUNKWAITCODE (%20) IF JUNK WAIT       *         18160700
*                      =MSGWAITCODE (%4) IF FILE SYS IPC      *         18160800
*                       MESSAGE WAIT                          *         18160900
*                      =SONWAITCODE (%2) IF SON WAIT          *         18161000
*                      =FATHERWAITCODE (%1) IF FATHER         *         18161100
*                       WAIT                                  *         18161200
*                      =0 IF TO IMPEDE OR TO DO SHUTDOWN      *         18161300
*                                                             *         18161400
*           SPECIALINFO=WAIT CONTROL BITS & BITS PASSED TO    *         18161500
*                       DISPATCHER VIA WAITTODISPMSG WORD     *         18161600
*                                                             *         18161700
*                       BIT 2=USE NEW VERSION OF WAIT         *         18161800
*                       BIT 3=ALLOW SOFT INTERRUPT OR         *         18161900
*                             CONTROL-Y                       *         18162000
*                       BIT 5=IMPEDED TRAP                    *         18162100
*                                                             *         18162200
* EXIT:     CONDITION CODE=CCE IF PROCESS IS AWAKEN BY A WAIT *         18162300
*                              EVENT                          *         18162400
*                         =CCG IF SOFT INTERRUPT HAS OCCURRED *         18162500
*                              AND SOFT INTERRUPT WAS ENABLED *         18162600
*                              (INTERRUPTS, TRAPS ARE         *         18162700
*                              DISABLED).                     *         18162800
*                                                             *         18162900
**END_IS*******************************************************         18163000
;                                                                       18163100
                                                                        18276000
                                                                        18281000
!  TURN OFF TRAPS, SETUP CUR PROC POINTER, DISABLE INTERRUPTS           18306000
!  ----------------------------------------------------------           18307000
$EDIT                                                                   18330000
                                                                        18336100
COMMENT****************************************************             18336200
* ENABLE SOFT (PSEUDO) INTERRUPT PROCESSING, IF REQUESTED *             18336300
**********************************************************;             18336400
                                                                        18336500
!  CHECK FOR OCCURRANCE OF SOFT INTERRUPT AND RETURN IF TRUE            18336600
!  ---------------------------------------------------------            18336700
                                                                        18351000
                                                                        18376000
!  INDICATE THAT SOFT INTERRUPTS ARE OK                                 18377000
!  ------------------------------------                                 18378000
                                                                        18386000
COMMENT*******************************************                      18387000
* DETERMINE IF WAITED EVENT HAS ALREADY OCCURRED *                      18388000
*************************************************;                      18389000
!  MAP DB TO SYSGLOB & DISABLE INTERRUPT                                18391000
!  -------------------------------------                                18392000
$EDIT                                                                   18410000
                                                                        18431000
!  IF TO USE NEW VERSION OF WAIT, THEN:                                 18432000
!  ------------------------------------                                 18433000
                                                                        18456000
!        SUDDENDEATH IF EVENT HAS ALREADY OCCURRED                      18457000
!        -----------------------------------------                      18458000
                                                                        18461000
!        INDICATE NO LONGER IN PHASE TRANSACTION OR DISC WAIT           18462000
!        ----------------------------------------------------           18463000
                                                                        18471000
!        RESTORE DB AND RETURN                                          18472000
!        ---------------------                                          18473000
                                                                        18501000
!  IF TO USE OLD VERSION OF WAIT, THEN:                                 18502000
!  ------------------------------------                                 18503000
                                                                        18511000
!     IF EVENT ALREADY OCCURRED, SETUP TO RETURN TO PROCESS             18512000
!     -----------------------------------------------------             18513000
      IF EVENTFLAGS.WWS<>0 THEN                                <<.1045>>18515000
         IF (LOG((EVENTMASK&CSL(4)).NONCRITEVENTFIELD) LAND    <<.1045>>18516000
         EVENTFLAGS.NONCRITEVENTFIELD)<>0 THEN                 <<.1045>>18517000
                                                                        18518000
$EDIT                                                          <<.1045>>18520000
                                                                        18526000
!        INDICATE TO DSP NO LONGER IN TRANSACTION OR DISC WAIT          18527000
!        -----------------------------------------------------          18528000
                                                                        18541000
!        RESTORE DB AND CLEAR PSEUDO DISABLE COUNTER                    18542000
!        -------------------------------------------                    18543000
                                                                        18576000
COMMENT******************************************************           18577000
* SEE IF PROCESS IS TO BE IMPEDED OR TOSSED DUE TO SHUTDOWN *           18578000
************************************************************;           18579000
                                                                        18586000
!  CHECK FOR EXPLICIT REQUEST TO IMPEDE PROCESS                         18587000
!  --------------------------------------------                         18588000
                                                                        18606000
!     IF GETTING GLOBAL STATUS, BUMP # OF IMPEDES COUNTER               18607000
!     ---------------------------------------------------               18608000
                                                                        18651000
!     IF GETTING PROC STATUS, BUMP # OF PROCESS IMPEDES COUNTER         18652000
!     ---------------------------------------------------------         18653000
                                                                        18701000
$EDIT VOID=18710000                                                     18705000
!     PUT IMPEDE REASON INTO CURRENT PROCESS' PCBX                      18706000
!     --------------------------------------------                      18707000
                                                                        18741000
!  ASSUME SHUTDOWN AND TAKE CURRENT PROCESS OFF OF QUEUE                18742000
!  -----------------------------------------------------                18743000
                                                                        18751000
                                                                        18751100
COMMENT********************************************************         18751200
* HAVE PROCESS WAITED BY CALLING DISP TO WORK ON NEXT PROCESS *         18751300
**************************************************************;         18751400
                                                                        18751500
!  CLEAR EVENT WORD ONLY IF NO PENDING EVENTS                           18752000
!  ------------------------------------------                           18753000
IF EVENTFLAGS.WWS=0 THEN EVENTFLAGS:=0                                  18754000
   ELSE EVENTFLAGS.CRITEVENTFIELD':=0;                                  18755000
                                                                        18756000
!  MERGE NEW EVENT WAIT BITS WITH OLD EVENT WAIT BITS                   18757000
!  --------------------------------------------------                   18758000
                                                                        18761000
!  IF WAITING FOR FATHER/SON, INDICATE TRANSACTION COMPLETED            18762000
!  ---------------------------------------------------------            18763000
                                                                        18771000
!  PASS SPECIALINFO TO DISPATCHER & HAVE IT WORK ON NEXT PROC           18772000
!  ----------------------------------------------------------           18773000
                                                                        18795100
COMMENT*******************************************************          18795200
* WHEN WAIT IS OVER, SEE IF OVERFLOW/PSEUDO INT HAS OCCURRED *          18795300
*************************************************************;          18795400
                                                                        18795500
!  IF PROCESS HAS STACK OVERFLOW, HAVE IT ABORTED IF POSSIBLE           18795600
!  ----------------------------------------------------------           18795700
$EDIT                                                                   18810000
$EDIT                                                                   18840000
!  IF PSEUDO INTERRUPT ENABLED, FLAG IT IF ONE HAS OCCURRED             18856000
!  --------------------------------------------------------             18857000
                << SEND MESSAGE TO DISPATCHER TO SCAN >>       <<D9229>>19401000
                << PROCESSES TO BE LAUNCHED BY SETTING>>       <<D9229>>19402000
                << PIN'S PRIORITY IN SYSGLOB AWAKETOSCHEDMSG>> <<D9229>>19403000
                << CELL                                >>      <<D9229>>19404000
         X:=PROCINX;                                           <<D9229>>19405000
         TOS := QUEUEINGINFO.PRIFIELD;                         <<D9229>>19410000
         IF AWAKETOSCHEDMSG <= LS0 THEN ASMB(DEL)              <<D9229>>19415000
         ELSE AWAKETOSCHEDMSG:=TOS;                            <<D9229>>19420000
$EDIT VOID = 19435000                                          <<P9520>>19425000
         IF DISPTOAWAKEMSG.PAUSEDFLAG THEN                     <<D9229>>19440000
         BEGIN   <<DISPATCHER WAS PAUSED>>                     <<P9520>>19445000
            TOS := SAVEDB;                                     <<P9520>>19446000
            EXCHDB;                                            <<P9520>>19447000
            PENABLE;                                           <<P9520>>19448000
            ASMB(DISP);                                        <<P9520>>19450000
         END ELSE                                              <<P9520>>19450100
         BEGIN   <<DISPATCHER WAS RUNNING>>                    <<P9520>>19450200
            TOS := SAVEDB;                                     <<P9520>>19451000
            EXCHDB;                                            <<P9520>>19452000
            PENABLE;                                           <<P9520>>19453000
            END;                                               <<P9520>>19454000
                                                               <<D9229>>19455000
                                                               <<D9229>>19460000
                                                               <<D9229>>19465000
                                                               <<D9229>>19470000
                                                               <<D9229>>19475000
                                                               <<D9229>>19480000
                                                               <<D9229>>19485000
COMMENT *** CheckPri will return True if Resource Holder       <<P9520>>20010000
   Priority is in Non-Linear Queue and the Requestor Pri.      <<P9520>>20011000
   is in Linear Queue;                                         <<P9520>>20012000
                                                               <<P9520>>20013000
IF NOT QUEUEINGINFO.LSCHEDFLAG AND                             <<P9520>>20014000
   PRI < ICS(-ICS'CSCHEDBASECELL) THEN CHECKPRI := TRUE;       <<P9520>>20015000
$EDIT VOID = 20030000                                          <<P9520>>20020000
IF INTEGER(QUEUEINGINFO).PRIFIELD > MYPRI THEN                 <<P9520>>20065000
   BEGIN                                                       <<P9520>>20070000
   IF CHECKPRI(MYPRI) THEN MYPRI := ICS(-ICS'CSCHEDBASECELL);  <<P9520>>20075000
$EDIT VOID = 20715000                                          <<R9229>>20290000
$EDIT VOID = 21520000                                          <<R9229>>21025000
$edit void = 22750000                                          <<01648>>22690000
If the process is giving up the last SIR and not holding any   <<S2213>>22905000
other resource, such as DBCB, then its priority will be        <<S2213>>22906000
adjusted back to the appropriate queueing priority where it    <<S2213>>22907000
belongs.                                                       <<S2213>>22908000
The algorithm used in here is similiar to that using in the    <<S2213>>22909000
DISPATCHER to adjust the process's priority when it get        <<S2213>>22910000
RESCHEDULE.                                                    <<S2213>>22911000
Example:                                                       <<S2213>>22911100
  Newpriority = Priority of the queuing base + (Number of      <<S2213>>22912000
                used TIME QUANTUM * 2).                        <<S2213>>22913000
However, the NEWPRIORITY can not be excessed the WORST         <<S2213>>22914000
PRIORITY for that particuliar queueing base.                   <<S2213>>22915000
                                                               <<S2213>>22916000
                                                               <<S2213>>22975100
INTEGER PXFIXEDLOC, <<To use the PXFIXED Include file>>        <<S2213>>22975200
        QUANTUMCNT, <<# of times process used time quantum>>   <<S2213>>22975300
        NEWPRIOFFSET,                                          <<S2213>>22975400
        PROCNEWPRI; <<new priority for process who just >>     <<S2213>>22975500
                    <<gave up its last SIR>>                   <<S2213>>22975600
                                                               <<S2213>>22975700
         IF NOT QUEUEINGINFO.LSCHEDFLAG THEN                   <<H2256>>23325010
         BEGIN <<ONLY ADJUST PRI. IF NOT RUNS IN LINEAR Q>>    <<H2256>>23325020
         IF S0.HOLDIMPPRIFLAG = 0 AND S0.HOLDSIRPRIFLAG = 1    <<S2213>>23325100
         THEN BEGIN                                            <<S2213>>23325200
         <<only adjust the caller's priority if it is giving>> <<S2213>>23325300
         <<up the last SIR and not holding any other>>         <<S2213>>23325400
         <<resource, such as DBCB.>>                           <<S2213>>23325500
            PXFIXED;<<set up to use the PXFIXED IncludeFile>>  <<S2213>>23325600
            QUANTUMCNT := PXFXQCNT;<<Get the number of >>      <<S2213>>23325700
            <<quantun time out from the PXFIXED>>              <<S2213>>23325710
            NEWPRIOFFSET := IF 0<=QUANTUMCNT<=127 THEN         <<S2213>>23325800
            QUANTUMCNT*2 ELSE 256; <<the offset can not be>>   <<S2213>>23325900
            <<greater than 256>>                               <<S2213>>23325910
            IF QUEUEINGINFO.CSCHEDFLAG THEN                    <<S2213>>23326000
               BEGIN  <<process is running on CQ>>             <<S2213>>23326100
               PROCNEWPRI := ICS(-ICS'CSCHEDBASECELL) +        <<S2213>>23326200
               NEWPRIOFFSET;                                   <<S2213>>23326300
               IF PROCNEWPRI > ICS(-ICS'WORSTCPRICELL) THEN    <<S2213>>23326400
               PROCNEWPRI := ICS(-ICS'WORSTCPRICELL);          <<S2213>>23326500
               END ELSE                                        <<S2213>>23326600
                  BEGIN                                        <<S2213>>23326700
                  IF QUEUEINGINFO.DSCHEDFLAG THEN              <<S2213>>23326800
                     BEGIN                                     <<S2213>>23326900
                     PROCNEWPRI := ICS(-ICS'DSCHEDBASECELL)+   <<S2213>>23327000
                     NEWPRIOFFSET;                             <<S2213>>23327100
                     IF PROCNEWPRI > ICS(-ICS'WORSTDPRICELL)   <<S2213>>23327200
                     THEN PROCNEWPRI :=ICS(-ICS'WORSTDPRICELL);<<S2213>>23327300
                     END ELSE                                  <<S2213>>23327400
                     IF QUEUEINGINFO.ESCHEDFLAG THEN           <<S2213>>23327500
                        BEGIN                                  <<S2213>>23327600
                        PROCNEWPRI:=ICS(-ICS'ESCHEDBASECELL)+  <<S2213>>23327700
                        NEWPRIOFFSET;                          <<S2213>>23327800
                        IF PROCNEWPRI>ICS(-ICS'WORSTEPRICELL)  <<S2213>>23327900
                        THEN PROCNEWPRI :=                     <<S2213>>23328000
                        ICS(-ICS'WORSTEPRICELL);               <<S2213>>23328100
                        END;                                   <<S2213>>23328200
                  END;                                         <<S2213>>23328300
         QUEUEINGINFO.PRIFIELD := PROCNEWPRI;<<Put the new >>  <<S2213>>23328310
         <<priority into the PCB entry for the caller>>        <<S2213>>23328320
         END;                                                  <<S2213>>23328400
         END;                                                  <<H2256>>23328450
                                                               <<S2213>>23328500
$EDIT VOID = 26390000                                          <<R9229>>23480000
$PAGE "RESOURCE EXCLUSION AND PROTECTION: FREE ALL SIRS"       << 1481>>23480900
PROCEDURE FREESIRS;                                            << 1481>>23481000
OPTION PRIVILEGED,UNCALLABLE;                                  << 1481>>23482000
                                                               << 1481>>23483000
COMMENT :                                                      << 1481>>23484000
FREESIRS is called to release all SIRs a process may still     << 1481>>23485000
hold on to when it is not supposed to ( e.g. a CI process      << 1481>>23486000
that just exit from a Command Executor, or any process that    << 1481>>23487000
is terminating).                                               << 1481>>23488000
The procedure scans thru the SIR table to match the PCBINX     << 1481>>23489000
with the SIR'HOLDER, if a match is found, it calls RELSIR      << 1481>>23490000
to release the SIR.                                            << 1481>>23491000
This procedure does not release the Job SIR (JIR), however.    << 1481>>23491100
Therefore, caller must always follow up with an UNLOCKJIR (0)  << 1481>>23491200
to completely release all sirs.  Not until then that the       << 1481>>23491300
HASSIR flag be reset to 0 ( if it was non-zero before).        << 1481>>23491400
;  << end comment >>                                           << 1481>>23492000
                                                               << 1481>>23493000
BEGIN                                                          << 1481>>23494000
INTEGER SIRTABINX,                                             << 1481>>23495000
        SIRNUM,                                                << 1481>>23496000
        PCBINX;                                                << 1481>>23497000
                                                               << 1481>>23498000
PCBINX := CURPRC;                                              << 1481>>23499000
SIRTABINX := SIRTABENTRYLENGTH; << init to 1st sir number >>   << 1481>>23500000
WHILE (SIRNUM:= SIRTABINX/SIRTABENTRYLENGTH) < FIRST'JOBSIR    << 1481>>23501000
   DO                                                          << 1481>>23502000
   BEGIN                                                       << 1481>>23503000
   IF PCBINX = SIR'HOLDER THEN                                 << 1481>>23504000
      RELSIR (SIRNUM,1);                                       << 1481>>23505000
   SIRTABINX := SIRTABINX + SIRTABENTRYLENGTH;                 << 1481>>23506000
   END;                                                        << 1481>>23507000
END;    << FreeSirs >>                                         << 1481>>23508000
<<SEE COMMENT IN PROCEDURE FLAGPROCABSENT>>                    <<02035>>26630000
TOS := STOPSEGFAULT;                                           <<02035>>26631000
$EDIT VOID = 26895000                                          <<R9229>>26660000
$EDIT VOID = 27520000                                          <<R9229>>27230000
   <<SINCE WE DON'T HAVE ENOUGH COUNTERS TO KEEP TRACK STOP >> <<02035>>27935000
   <<TIME FOR DIFFERENT STOP REASONS, WE USE STOPSEGFAULT   >> <<02035>>27936000
   <<FOR ALL SEGMENT FAULT, INCLUDING CACHE FAULT.          >> <<02035>>27937000
   TOS := STOPSEGFAULT;                                        <<02035>>27938000
                                                               <<s9976>>29008000
     <<****************************************************>>  <<s9976>>29008100
     <<                                                    >>  <<s9976>>29008200
     <<  This is to fix SF#610's caused by fix #8400 in    >>  <<s9976>>29008300
     <<  PROCESSCOMPMSG and CHECKFORDEFERREDDISCREQ which  >>  <<s9976>>29008400
     <<  can cause us to call AWAKE with a MEMWAIT event   >>  <<s9976>>29008500
     <<  twice for the same PIN if a completion interrupt  >>  <<s9976>>29008600
     <<  of a cache domain read occurs between the time    >>  <<s9976>>29008700
     <<  that we decrement the SLLIOCOMPTOAWAKECNT and     >>  <<s9976>>29008800
     <<  before we make the call to AWAKE with a MEMWAIT.  >>  <<s9976>>29008900
     <<  To fix it we will disable external interrupts     >>  <<s9976>>29009000
     <<  during this window.     HKS                       >>  <<s9976>>29009100
     <<                                                    >>  <<s9976>>29009200
     <<****************************************************>>  <<s9976>>29009300
                                                               <<s9976>>29009400
      disable;                                                 <<s9976>>29009500
                                                               <<s9976>>29009600
      enable;                                                  <<s9976>>29051000
                                                               <<01648>>30966000
EQUATE MM'REQUEST   = %40000, << Flags word for MM request >>  <<01648>>30968000
       DRQ'BANK     = (DRQ'DST*4)+2;  << DST Bank for DRQ  >>  <<01648>>30969000
LOGICAL MAPPEDDOMAIN;                                          <<02033>>31062000
LOGICAL DRQ'DB'FLAGS'INDEX = DB + DRQ'FLAGS'INDEX,             <<01648>>31080100
        DRQ'DB'SEGDISP'INDEX = DB + DRQ'SEGDISP'INDEX,         <<01648>>31080200
        DRQ'DB'BUFADR'INDEX = DB + DRQ'BUFADR'INDEX,           <<01648>>31080300
        DRQ'DB'BUFDST'INDEX = DB + DRQ'BUFDST'INDEX,           <<01648>>31080400
        DRQ'DB'FUNC'INDEX = DB + DRQ'FUNC'INDEX,               <<01648>>31080500
        DRQ'DB'COUNT'INDEX = DB + DRQ'COUNT'INDEX,             <<01648>>31080600
        DRQ'DB'LDEV'INDEX = DB + DRQ'LDEV'INDEX,               <<01648>>31080700
        DRQ'DB'PARM1'INDEX = DB + DRQ'PARM1'INDEX,             <<01648>>31080800
        DRQ'DB'PARM2'INDEX = DB + DRQ'PARM2'INDEX,             <<01648>>31080900
        DRQ'DB'STATUS'INDEX = DB + DRQ'STATUS'INDEX,           <<01648>>31081000
        DRQ'DB'PCB'INDEX = DB + DRQ'PCB'INDEX,                 <<01648>>31081100
        DRQ'DB'QMISC'INDEX = DB + DRQ'QMISC'INDEX,             <<01648>>31081200
        DRQ'DB'SEGID1'INDEX = DB + DRQ'SEGID1'INDEX,           <<01648>>31081300
        DRQ'DB'SEGID2'INDEX = DB + DRQ'SEGID2'INDEX,           <<01648>>31081400
        DRQ'DB'URGCLAS'INDEX = DB + DRQ'URGCLAS'INDEX;         <<01648>>31081500
                                                               <<01648>>31082600
MAPPEDDOMAIN := FALSE;                                         <<02033>>31092000
   MAPPEDDOMAIN := TRUE;                                       <<02033>>31212000
<< Move DB to DRQ entry for fast access >>                     <<01648>>31361000
TOS := DST(DRQ'BANK);                << Bank on TOS >>         <<01648>>31362000
TOS := DST(X := X+1);                << Offset on TOS >>       <<01648>>31363000
TOS := TOS + DISCREQINX;             << Add entry's offset >>  <<01648>>31364000
EXCHDB;                                                        <<01648>>31365000
                                                               <<01648>>31366000
<< Load DRQ >>                                                 <<01648>>31367000
DRQ'DB'PARM2'INDEX := XFERLODA;                                <<01648>>31368000
DRQ'DB'PARM1'INDEX := XFERHODA;                                <<01648>>31369000
DRQ'DB'LDEV'INDEX := LDEV;                                     <<01648>>31370000
DRQ'DB'BUFADR'INDEX := MMBASE;   << XFERBASE >>                <<01648>>31371000
DRQ'DB'BUFDST'INDEX := MMBANK;   << XFERBANK >>                <<01648>>31372000
DRQ'DB'COUNT'INDEX := XFERCOUNT;                               <<01648>>31373000
DRQ'DB'SEGDISP'INDEX := XFEROFFSET;                            <<01648>>31374000
DRQ'DB'FLAGS'INDEX := MM'REQUEST;                              <<01648>>31375000
DRQ'DB'STATUS'INDEX := 0;                                      <<01648>>31376000
DRQ'DB'PCB'INDEX := 0;  << Required for SIODM (??) >>          <<01648>>31377000
DRQ'DB'QMISC'INDEX := 0;                                       <<01648>>31378000
DRQ'DB'FUNC'INDEX := WRITEREQ;                                 <<01648>>31379000
DRQ'DB'SEGID1'INDEX := OBJID(OBJIDDESCFIELD);                  <<01648>>31380000
DRQ'DB'SEGID2'INDEX := OBJID(OBJIDNUMFIELD);                   <<01648>>31381000
DRQ'DB'URGCLAS'INDEX  := URGCLASS;                             <<01648>>31382000
                                                               <<01648>>31383000
<< Put DB back >>                                              <<01648>>31384000
EXCHDB;                                                        <<01648>>31385000
ASMB(DDEL);   << Remove stacked BANK, OFFSET >>                <<01648>>31386000
                                                               <<01648>>31387000
$edit void=31445000                                            <<01648>>31390000
                                                               <<02033>>31446000
<<IF OBJECT TYPE IS CACHE DOMAIN, THE ABOVE DRQ IS BUILT TO >> <<02033>>31447100
<<CAUSE A PHYSICAL DISC WRITE FOR THE CACHE MISS REQUEST.   >> <<02033>>31447200
<<FOR SOME UNKNOWN REASON, THE PCBNUM OF THIS DRQ HAS TO BE >> <<02033>>31447300
<<ZERO. THUS BY THE TIME WE GET TO SIODM TO ACTUALLY PERFORM>> <<02033>>31447400
<<THE PHYSICAL DISC WRITE, WE LOSE THE PCBNUM THEREFORE     >> <<02033>>31447500
<<UNABLE TO CHARGE IT TO THE RIGHT PROCESS AS WELL AS TO    >> <<02033>>31447600
<<LOG THE DRQ PROPERLY INTO THE IODCP LOG FILE. WHAT I DO   >> <<02033>>31447700
<<NOW IS TO UPDATE THE MI COUNTERS AT THE CREATION TIME OF  >> <<02033>>31447800
<<THE DRQ BECAUSE THE PCBNUM STILL AROUND. H. NGUYEN        >> <<02033>>31447900
                                                               <<02033>>31448300
IF MAPPEDDOMAIN THEN                                           <<02033>>31448400
BEGIN                                                          <<02033>>31448500
   <<UPDATE MI DISC IO COUNTERS TO THE RIGHT PROCESS >>        <<02033>>31448700
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<02033>>31448800
   BEGIN                                                       <<02033>>31448900
      TOS := MEASPROCXDSBANK;                                  <<02033>>31449000
      TOS := MEASPROCXDSBASE + LDR'PCB * CLASS15'SUB0SIZE +    <<02033>>31449100
             CP'DISCWRITE;                                     <<02033>>31449200
      ASMB (LSEA);                                             <<02033>>31449300
      TOS := TOS + 1;   <<INCREMENT WRITE COUNTER>>            <<02033>>31449400
      ASMB (SSEA);                                             <<02033>>31449500
      <<BUMP TRANSFER COUNT>>                                  <<02033>>31449600
      TOS := TOS - CP'DISCWRITE + CP'WORDSTRANS;               <<02033>>31449700
      ASMB (LDEA;ZERO); <<OLD COUNT, ZERO FOR DOUBLE ADDITION>><<02033>>31449800
      TOS := XFERCOUNT;                                        <<02033>>31449900
      ASMB (DADD;SDEA;DDEL);                                   <<02033>>31450000
   END;                                                        <<02033>>31450100
   <<SET DRQ'BIT IN LDR TO DENOTE A PHYSICAL WRITE OCCURS>>    <<02033>>31450200
   if ldr'entry'index <> 0 then ldr'drq := 1;                  <<p2318>>31450300
END;                                                           <<02033>>31450400
                                                               <<02033>>31450500
   ASMB(SSEA);  << Store back FLAGS word >>                    <<01648>>31525000
   << Store back DRQ (may have just been allocated) >>         <<01648>>31536000
   TOS := TOS + (CDT'MD'DISCREQ - CDT'MD'FLAGS);               <<01648>>31537000
   TOS := DISCREQINX;                                          <<01648>>31538000
   ASMB(SSEA;DDEL);  << Store back disc request >>             <<01648>>31539000
$EDIT VOID=31745000                                            <<.2369>>31690000
COMMENT                                                        <<.2458>>31691100
**BEGIN_IS*********************************************7/18/86*<<.2458>>31691200
*                                                             *<<.2458>>31691300
* PROCEDURE PROCESSINITMSG(REGIONBASE)                        *<<.2458>>31691400
*                                                             *<<.2458>>31691500
* PURPOSE:  PROCESSINITMSG IS A PROCEDURE CALLED TO INITIATE  *<<.2458>>31691600
*           A DISC SEGMENT OBJECT READ, IF POSSIBLE AND       *<<.2458>>31691700
*           RELEASE ANY RESIDUAL MEMORY PAGES AT THE END OF   *<<.2458>>31691800
*           THE SEGMENT OBJECT'S REGION.                      *<<.2458>>31691900
*                                                             *<<.2458>>31692000
*           FIRST GET THE SEGMENT OBJECT AND THE INITIATION   *<<.2458>>31692100
*           WORD (INITMSG) FORM THE REGION HEADER.  IF THE    *<<.2458>>31692200
*           INITIATION TOGGLE BIT (INITMSGTOGGLESWITCH) IS    *<<.2458>>31692300
*           ON, THEN SUDDENDEATH WITH A 613 BECAUSE THE       *<<.2458>>31692400
*           HANDSHAKING (SYNCHRONIZATION) IS NOT CORRECT.     *<<.2458>>31692500
*                                                             *<<.2458>>31692600
*           IF THE INITIATION OF THE SEGMENT OBJECT DISC      *<<.2458>>31692700
*           READ IS DISABLED OR THERE IS AN ONGOING I/O       *<<.2458>>31692800
*           ALREADY IN PROGRESS, THEN BYPASS THE READ AND     *<<.2458>>31692900
*           RETURN.  IF THE MESSAGE IS VALID, THEN MARK IT    *<<.2458>>31693000
*           AS RECEIVED AND INDICATE TO THE I/O COMPLETOR     *<<.2458>>31693100
*           NOT TO RELEASE ANY RESIDUAL PAGES BY CLEARING THE *<<.2458>>31693200
*           INITMSGRELRESPAGESFLAG BIT IN THE INITIATION      *<<.2458>>31693300
*           MESSAGE WORD OF THE REGION HEADER.                *<<.2458>>31693400
*                                                             *<<.2458>>31693500
*           IF THERE ARE ANY QUEUED SEGMENT OBJECT DISC READS *<<.2458>>31693600
*           LET, THEN GET THE DISC REQUEST QUEUE (DRQ) ENTRY  *<<.2458>>31693700
*           ADDRESS FROM THE REGION HEADER, LOG THE SEGMENT   *<<.2458>>31693800
*           OBJECT DISC READ EVENT IN THE MONITOR TABLE AND   *<<.2458>>31693900
*           START THE DISC REQUEST BY QUEUEING IT IN THE DISC *<<.2458>>31694000
*           INFORMATION TABLE (DIT) QUEUE.  IF THERE IS NO    *<<.2458>>31694100
*           PENDING SEGMENT OBJECT READ REQUEST, THEN         *<<.2458>>31694200
*           INDICATE THAT COMPLETION PROCESSING IS            *<<.2458>>31694300
*           ACCEPTABLE.                                       *<<.2458>>31694400
*                                                             *<<.2458>>31694500
*           NOW BEGIN THE PROCESS OF RELEASING ANY RESIDUAL   *<<.2458>>31694600
*           MEMORY PAGES OF THE MEMORY REGION NOT NEEDED BACK *<<.2458>>31694700
*           TO THE SYSTEM.  THIS IS DONE BY GETTING THE       *<<.2458>>31694800
*           RESIDUAL SIZE FROM THE REGION HEADER AND MAKING   *<<.2458>>31694900
*           SURE THAT THE RELEASE RESIDUAL MEMORY FLAG AND    *<<.2458>>31695000
*           THE SIZE CORRESPOND (SUDDENDEATH WITH A 612 IF    *<<.2458>>31695100
*           THE FLAG SAYS THAT THERE ARE PAGES TO RELEASE BUT *<<.2458>>31695200
*           THE SIZE IS ZERO AND VICE-VERSA).                 *<<.2458>>31695300
*                                                             *<<.2458>>31695400
*           THEN PUT THE ACTUAL (NET) SIZE OF THE SEGMENT     *<<.2458>>31695500
*           OBJECT INTO THE GLOBAL, SUBREGION SIZE WORDS OF   *<<.2458>>31695600
*           THEN REGION HEADER, MARK THE MEMORY REGION'S      *<<.2458>>31695700
*           TRAILER WITH A BIT INDICATING THE SEGMENT REGION  *<<.2458>>31695800
*           IS RESERVED.  ALSO PUT THE ACTUAL SIZE IN THE     *<<.2458>>31695900
*           SEGMENT REGION'S TRAILER.                         *<<.2458>>31696000
*                                                             *<<.2458>>31696100
*           THEN IF THERE ARE ANY RESIDUAL PAGES TO BE        *<<.2458>>31696200
*           RELEASED, THEN UPDATE THE REGION HEADER OF THESE  *<<.2458>>31696300
*           RESIDUAL PAGES AS BEING RESERVED, PUT IN THE      *<<.2458>>31696400
*           RESIDUAL REGION SIZE IN BOTH THE REGION HEADER/   *<<.2458>>31696500
*           SUBREGION HEADER.  ZERO OUT THE SEGMENT OBJECT ID *<<.2458>>31696600
*           DOUBLE WORD IN THE REGION HEADER AND UPDATE THE   *<<.2458>>31696700
*           RESIDUAL REGION'S TRAILER WITH ITS SIZE AND THAT  *<<.2458>>31696800
*           IT IS RESERVED.  FINALLY SEND A MESSAGE TO THE    *<<.2458>>31696900
*           DISPATCHER ASKING THAT THE RESIDUAL MEMORY REGION *<<.2458>>31697000
*           BE RELEASED.                                      *<<.2458>>31697100
*                                                             *<<.2458>>31697200
*           IF THERE WAS NO PENDING SEGMENT OBJECT DISC READ  *<<.2458>>31697300
*           THEN THERE WAS PROBABLY NO NEED TO BECAUSE IT IS  *<<.2458>>31697400
*           AN UNUSED CACHE DOMAIN AND ALREADY IN MEMORY      *<<.2458>>31697500
*           (SUDDENDEATH WITH A 672 IF NOT A CACHED DOMAIN OR *<<.2458>>31697600
*           IF AN INVALID CDT ENTRY).  THIS ALLOWS FOR        *<<.2458>>31697700
*           IMMEDIATE COMPLETION PROCESSING, SO PROCEDURE     *<<.2458>>31697800
*           PROCESSCOMPMSG IS CALLED.                         *<<.2458>>31697900
*                                                             *<<.2458>>31698000
* ENTRY:    REGIONBASE=BANK/BASE ADDRESS OF MEMORY REGION     *<<.2458>>31698100
*                      THAT CONTAINS THE INITIATION           *<<.2458>>31698200
*                      INFORMATION OF THE SEGMENT OBJECT DISC *<<.2458>>31698300
*                      READ OPERATION THAT IS TO BE           *<<.2458>>31698400
*                      PERFORMED.                             *<<.2458>>31698500
*                                                             *<<.2458>>31698600
**END_IS*******************************************************<<.2458>>31698700
;                                                              <<.2458>>31698800
$EDIT                                                          <<.2458>>31698900
Integer Dst'index;                                             <<01787>>31756000
!  GET SEGMENT OBJECT FROM REGION HEADER                       <<.2369>>31816000
!  -------------------------------------                       <<.2369>>31817000
                                                               <<.2369>>31836000
!  GET INIT MSG FROM REGION HEADER & SUDDENDEATH IF NOT SYNC   <<.2369>>31837000
!  ---------------------------------------------------------   <<.2369>>31838000
                                                               <<.2369>>31866000
                                                               <<.2369>>31866100
COMMENT****************************************                <<.2369>>31866200
* DETERMINE IF ANY I/O INITIATION IS POSSIBLE *                <<.2369>>31866300
**********************************************;                <<.2369>>31866400
                                                               <<.2369>>31866500
!  IF READ OF SEGMENT OBJECT IS NOT DISABLED, THEN:            <<.2369>>31866600
!  ------------------------------------------------            <<.2369>>31866700
                                                               <<.2369>>31876000
!  IF NO ON-GOING I/O IN PROGRESS, THEN:                       <<.2369>>31877000
!  -------------------------------------                       <<.2369>>31878000
                                                               <<.2369>>31886000
!     IF VALID MSG, MARK IT RECEIVED & RELEASE RESIDUAL PAGES  <<.2369>>31887000
!     -------------------------------------------------------  <<.2369>>31888000
$EDIT VOID=32005000                                            <<.2369>>31920000
         IF INITMSG.QUEUEREADREQFLAG THEN                      <<.2458>>31921000
            BEGIN <<START UP THE READ>>                        <<.2458>>31925000
            ENABLE;                                            <<.2458>>31930000
            TIMEFORCOMPMSG:=FALSE;                             <<.2458>>31935000
            TOS:=TOS+INITMSGTOINITINFODISP;                    <<.2458>>31940000
            ASMB(LSEA);                                        <<.2458>>31945000
            DRQ'ENTRY'INDEX:=REQP:=TOS;                        <<.2458>>31950000
            MMSTAT'(MMSTATSEGIOINIT,OBJIDENT(OBJIDDESCFIELD),  <<.2458>>31955000
                   OBJIDENT(OBJIDNUMFIELD),REQP,DRQ'LDEV,0,0); <<.2458>>31960000
            QUEUEDISCREQ                                       <<.2458>>31965000
               (REQP,DITREQQ,LPDT(DRQ'LDEV&LSL(2)+LPDT'DITP)); <<.2458>>31970000
            END                                                <<.2458>>31975000
         ELSE IF INITMSG.INITMSGSTARTCOMPFLAG                  <<.2458>>31980000
            THEN TIMEFORCOMPMSG:=TRUE;                         <<.2458>>31985000
                                                               <<.2458>>31990000
COMMENT******************************************************  <<.2369>>32011000
* GET # OF RESIDUAL PAGES TO REL & SUDDENDEATH IF SYNC PROB *  <<.2369>>32012000
************************************************************;  <<.2369>>32013000
$EDIT                                                          <<.2458>>32014000
$EDIT VOID=32080000                                            <<.2369>>32075000
COMMENT*************************************************       <<.2369>>32086100
* PUT RESERVED REGION'S SIZE IN ITS HEADERS & TRAILERS *       <<.2369>>32086200
*******************************************************;       <<.2369>>32086300
                                                               <<.2369>>32086400
!        PUT REGION SIZE IN REGION, SUBREGION HEADER           <<.2369>>32086500
!        -------------------------------------------           <<.2369>>32086600
                                                               <<.2369>>32131000
!        MARK REGION AS RESERVED IN REGION TRAILER             <<.2369>>32132000
!        -----------------------------------------             <<.2369>>32133000
                                                               <<.2369>>32146000
!        PUT NET REGION SIZE IN RESERVED REGION'S TRAILER      <<.2369>>32147000
!        ------------------------------------------------      <<.2369>>32148000
$EDIT VOID=32205000                                            <<.2369>>32180000
                                                               <<.2369>>32208000
COMMENT*****************************************************   <<.2369>>32209000
* RELEASE ANY EXTRA RESIDUAL PAGES OFF RESERVED REGION END *   <<.2369>>32210000
***********************************************************;   <<.2369>>32211000
         IF RESREGSIZE <> 0 THEN                               <<.2369>>32212000
            BEGIN                                              <<.2369>>32213000
$EDIT VOID=32225000                                            <<.2369>>32220000
                                                               <<.2369>>32246000
!           UPDATE RESIDUAL REGION HEADER & SUBREGION HEADER   <<.2369>>32247000
!           ------------------------------------------------   <<.2369>>32248000
                                                               <<.2369>>32261000
                                                               <<.2369>>32291000
                                                               <<.2369>>32306000
!           UPDATE RESIDUAL REGION'S TRAILER                   <<.2369>>32307000
!           --------------------------------                   <<.2369>>32308000
                                                               <<.2369>>32326000
                                                               <<.2369>>32341000
                                                               <<.2369>>32361000
!           GO ASK DISPATCHER TO RELEASE RESIDUAL PAGES        <<.2369>>32362000
!           -------------------------------------------        <<.2369>>32363000
$EDIT VOID = 32378200                                          <<.2458>>32375000
COMMENT**********************************************          <<.2369>>32378300
* START COMPLETION PROCESSING IF NO READ WAS NEEDED *          <<.2369>>32378400
****************************************************;          <<.2369>>32378500
            <<OR NEWLY CREATED DATA SEGMENT>>                  <<01787>>32385050
            If Objident(Objidtypefield) = Objiddatatype then   <<01787>>32385100
               Begin  <<newly created DATA segment>>           <<01787>>32385200
               Dst'index := Objident(ObjIDnumfield) & LSL(2);  <<01787>>32385300
               Processcompmsg(RegionBase,Obj,Dst'index,        <<01787>>32385400
                              IostatusOk);                     <<01787>>32385500
               End Else                                        <<01787>>32385600
               BEGIN <<GOT TO BE CDT TYPE>>                    <<01787>>32386000
               OR OBJIDENT(Objidnumfield) = 0                  <<01787>>32395000
               END; <<CDT TYPE>>                               <<01787>>32406000
IF XFERSTATUS <> IOSTATUSOK THEN                               <<S2205>>32930000
   BEGIN <<Bad I/O status returned>>                           <<S2205>>32930100
   <<Only call Suddendeath(651) if this is a Memory >>         <<S2205>>32931000
   <<Management write. If Disc Caching issued the write>>      <<S2205>>32932000
   <<on behalf of an User, then the Suddendeath(651)>>         <<S2205>>32933000
   <<will be called, but only if BLOCKONWRITE = NO>>           <<S2205>>32934000
   IF DATASEG' OR                                              <<S2205>>32935000
     NOT LOGICAL(CDT'GET'WORD(0,CDT'FORCE'POST,0))             <<S2205>>32935100
     THEN SUDDENDEATH(SFKERNDATASEGWRITEFAIL);                 <<S2205>>32936000
   END;                                                        <<S2205>>32937000
                                                               << 9924>>33931000
   << By default, don't preempt current process >>             << 9924>>33932000
   TOS := 0;                                                   << 9924>>33933000
   TOS.MSGDON'TPREEMPTFLAG := 1;                               << 9924>>33934000
   SENDMSGFLAGS := TOS;                                        << 9924>>33935000
         IF PROCESSPRI(IOPIN) < PROCESSPRI(CURRENTPIN)         << 9924>>33980000
         THEN SENDMSGFLAGS := 0;                               << 9924>>33985000
        CURRENTPRI,          << If CPCB, its priority >>       << 9924>>34165000
        DRQ'ENTRY'INDEX = LDR'ENTRY'INDEX,                     << 9924>>34186000
   BEGIN     << Process the mapped domain >>                   << 9924>>34776000
   << Only process if on the ICS, not on the user's stack >>   << 9924>>34777000
   PUSH(S,DB,SBANK);  << 4 words on TOS >>                     << 9924>>34778000
   if (TOS = 0) then   << S is indeed in bank 0 >>             << 9924>>34779000
   begin                                                       << 9924>>34779100
   ASMB(DELB,LADD); << Remove DBBANK, add S and DB for real S>><< 9924>>34779200
   << See if S is in ICS range >>                              << 9924>>34780000
   if (LS0 > ABS(ICS'QI)) then                                 << 9924>>34781000
   if (TOS < logical(ABS(ICS'ZI))) then                        << 9924>>34782000
   BEGIN    << We are on the ICS >>                            << 9924>>34784000
   << Set up Scheduler message to NOT preempt (by default) >>  << 9924>>34816000
   TOS := 0;                                                   << 9924>>34817000
   TOS.MSGDON'TPREEMPTFLAG := 1;                               << 9924>>34818000
   SENDMSGFLAGS := TOS;                                        << 9924>>34819000
                                                               << 9924>>34819100
   << Get priority of current PIN.  If none, use bkgrndpri. >> << 9924>>34819200
   CURRENTPIN := (CURPRC)/PCBSIZE;                             << 9924>>34819300
   IF (CURRENTPIN = 0) THEN                                    << 9924>>34819400
      CURRENTPRI := 0   << This will force NO preemption >>    << 9924>>34819500
   ELSE                                                        << 9924>>34819600
      CURRENTPRI := PROCESSPRI(CURRENTPIN);                    << 9924>>34819700
                                                               << 9924>>34861000
      << Preempt if LDR's PCB is higher priority >>            << 9924>>34862000
      IF (PROCESSPRI(LDR'PCB) < CURRENTPRI) THEN               << 9924>>34863000
         SENDMSGFLAGS := 0;                                    << 9924>>34864000
   << Stack SENDMSG parameters >>                              << 9924>>34885000
   TOS := OBJIDENT(OBJIDNUMFIELD);                             << 9924>>34890000
   TOS := IOSTAT;                                              << 9924>>34895000
   TOS := CACHEMOVEREADYCODE;                                  << 9924>>34900000
                                                               << 9924>>34905000
   << Send the message >>                                      << 9924>>34910000
   SENDMSG(SCHEDPIN,CACHEMOVEPORT,3,SENDMSGFLAGS);             << 9924>>34915000
                                                               << 9924>>34920000
$edit void=34940000                                            << 9924>>34925000
   END;   << Of processing on ICS >>                           << 9924>>34946000
   END;  << Of determining that S is in bank 0 >>              << 9924>>34947000
DEF'GET'BIT;                                                   <<01648>>37876000
DEF'SET'BIT;                                                   <<01648>>37877000
DOUBLE SAVEADDRESS;                                            <<A1029>>39601000
LOGICAL DONE;                                                  <<A1029>>39602000
LOGICAL WREQ;                                                  <<A1029>>39604000
DOUBLE OBJ;                                                    <<A1029>>39605000
LOGICAL ARRAY OBJIDENT(*) = OBJ;                               <<A1029>>39606000
                                                               <<A1029>>39607000
DONE := FALSE;                                                 <<A1029>>39626000
$EDIT VOID = 39720000                                          <<A1029>>39710000
      TOS := TOS + NLTORBDISP;                                 <<A1029>>39725000
      REGIONBASE := SAVEADDRESS := TOS;                        <<A1029>>39730000
      WHILE NOT DONE DO BEGIN <<LOOP TO FIND REG W/O WREQ>>    <<A1029>>39735100
      TOS := REGIONBASE;                                       <<A1029>>39735200
      TOS := TOS + RBTORSDISP; <<POINT TO REGION SIZE>>        <<A1029>>39735300
      ASMB(LSEA);                                              <<A1029>>39735400
      BESTFITSIZE := TOS; <<SAVE THE REGION SIZE>>             <<A1029>>39735500
      TOS := TOS + RSTOOBJIDENTDIS; <<POINT TO OBJIDENT>>      <<A1029>>39735600
      ASMB(LDEA);  <<GET OBJID FROM REG HEADER>>               <<A1029>>39735700
      OBJ := TOS;                                              <<A1029>>39735800
      IF OBJ <> 0D <<THERE IS SOME THING IN THIS REGION>> AND  <<A1029>>39735900
      (OBJIDENT(OBJIDTYPEFIELD) = OBJIDCDTYPE OR               <<A1029>>39736000
      OBJIDENT(OBJIDTYPEFIELD) = OBJIDDATATYPE )THEN           <<A1029>>39736100
         BEGIN  <<CHECK FOR BACK GROUND WRITE>>                <<A1029>>39736200
         TOS := TOS + OBJIDENTTOWREQP; <<POINT TO WREQPTR>>    <<A1029>>39736300
         ASMB(LSEA);                                           <<A1029>>39736400
         WREQ := TOS;                                          <<A1029>>39736500
         IF WREQ = 0 THEN DONE := TRUE                         <<A1029>>39736600
         ELSE <<GO TO THE NEXT REGION>>                        <<A1029>>39736700
            BEGIN                                              <<A1029>>39736800
            TOS := TOS + WREQPTORBDISP;                        <<A1029>>39736900
            TOS := TOS + RBTONLDISP; <<GET TO NEXT LINK>>      <<A1029>>39737000
            ASMB(LDEA); <<LOAD THE ADDRESS OF NEXT REGION>>    <<A1029>>39737100
            IF = THEN <<GET TO THE END OF THE LIST>>           <<A1029>>39737200
               BEGIN                                           <<A1029>>39737300
               REGIONBASE := SAVEADDRESS;                      <<A1029>>39737400
               ASMB(DDEL); <<DELETE BANK AND BASE OF NEXT LNK>><<A1029>>39737410
               DONE := TRUE;                                   <<A1029>>39737500
               END                                             <<A1029>>39737600
            ELSE <<TRY THE NEXT REGION>>                       <<A1029>>39737700
               BEGIN                                           <<A1029>>39737800
               TOS := TOS + NLTORBDISP;                        <<A1029>>39737900
               REGIONBASE := TOS;                              <<A1029>>39738000
               END;                                            <<A1029>>39738100
            END;                                               <<A1029>>39738200
         END                                                   <<A1029>>39738300
      ELSE DONE := TRUE; <<ALWAYS TRUE IF NOT DATA OR CDT>>    <<A1029>>39738400
      ASMB(DDEL);  <<DELETE BANK & BASE -- REGIONBASE>>        <<A1029>>39738500
      END;                                                     <<A1029>>39741000
   IF BESTFITSIZE > MAXAVAILREG THEN SUDDENDEATH(619);         <<s2242>>39816000
   <<The regionsize returned from FINDBESTFITHOLE Subroutine>> <<s2242>>39817000
   <<should never be greater than the bigest region size>>     <<s2242>>39818000
   <<available from the free list>>                            <<s2242>>39819000
DEF'SET'BIT;                                                   <<01648>>40331000
INTEGER SEGDESCSTINX;                                          <<S1041>>41821000
IF OBJECTID(OBJIDTYPEFIELD) <> OBJIDCDTYPE THEN                <<S1041>>41895010
   BEGIN                                                       <<S1041>>41895020
   IF OBJECTID(OBJIDTYPEFIELD) = OBJIDDATATYPE THEN            <<S1041>>41895100
   SEGDESCSTINX := OBJECTID(OBJIDNUMFIELD) & LSL(2)            <<S1041>>41895200
   ELSE SEGDESCSTINX := CONVSEGIDTOSTINX(OBJIDENTIFIER);       <<S1041>>41895300
   X := DSTSYSBASEINX + SEGDESCSTINX;                          <<S1041>>41895400
   IF SEGDESCFIRMINFO = %100000 THEN SUDDENDEATH(617);         <<S1041>>41895500
   <<Try to add an unallocated seg. into locality list>>       <<S1041>>41895600
   END;                                                        <<S1041>>41896600
$EDIT                                                          <<01648>>42815000
            IF SEGDESCFLAGS.DISCCOPYVALIDFLAG = 0 AND          <<01788>>43490000
            OBJIDENT(OBJIDTYPEFIELD) = OBJIDDATATYPE THEN      <<01788>>43491000
INTEGER CYCLECOUNTER;                                          <<S9229>>45956000
LOGICAL OK'TO'MAKEOC;                                          <<31857>>45957000
LOGICAL MEM'PRESSURE;                                          <<31857>>45958000
DOUBLE LASTMAKEROOMTIME,                                       <<31857>>45959000
       CURRMAKEROOMTIME,                                       <<31857>>45959100
       MEMPRESSINTERVAL;                                       <<31857>>45959200
                                                               <<31857>>45959300
EQUATE MAXCOUNT = 20000;                                       <<S9229>>46001000
                                                               <<31857>>46001100
SUBROUTINE CHECK'REF'BITS;                                     <<31857>>46001200
                                                               <<31857>>46001300
BEGIN                                                          <<31857>>46001400
If not Mem'pressure then OK'to'MakeOc := True                  <<31857>>46001410
<<Only Use 1 reference bit if the system doesn't have >>       <<31857>>46001420
<<memory pressure.......>>                                     <<31857>>46001430
Else <<Use 3 ref. bits if there is memory pressure>>           <<31857>>46001440
   Begin                                                       <<31857>>46001450
   Ok'To'MakeOC := False; <<assume that all bits were set>>    <<31857>>46001500
   Subregflags.Regrefflag1 := 0; <<Reset the first bit>>       <<31857>>46001600
   If = then                                                   <<31857>>46001700
      Begin  <<The ref. bit was off>>                          <<31857>>46001800
      Subregflags.Regrefflag2 := 0; <<Reset the second bit>>   <<31857>>46001900
      If = then Ok'To'MakeOC := True;                          <<31857>>46002000
      End;                                                     <<31857>>46002500
   End;                                                        <<31857>>46002510
END; <<subroutine>>                                            <<31857>>46002600
                                                               <<31857>>46002700
      CYCLECOUNTER := CYCLECOUNTER + 1; <<number of times >>   <<S9229>>46306000
      <<cycle through whole memory. Will call SUDDENDEATH if >><<S9229>>46307000
      <<can not make room for crictical MPE segment instead >> <<S9229>>46308000
      <<off stay in the loop for ever>>                        <<S9229>>46309000
CYCLECOUNTER := 0;  <<INIT. THE COUNTER>>                      <<S9229>>46396000
TOS := 0;                                                      <<31857>>46397000
TOS := MEMPRESSDUREXT;                                         <<31857>>46398000
MEMPRESSINTERVAL := TOS; <<BUILD DOUBLE WORD FOR MEMORY >>     <<31857>>46399000
                         <<PRESSURE INTERVAL>>                 <<31857>>46399100
                                                               <<31857>>46399200
TOS := HOTIMELASTMAKEROOM;                                     <<31857>>46400000
TOS := LOTIMELASTMAKEROOM;                                     <<31857>>46401000
LASTMAKEROOMTIME := TOS; <<SAVE LAST MAKEROOM TIME>>           <<31857>>46402000
TOS := HOTIMELASTMAKEROOM := TRLDTIME1;                        <<31857>>46403000
TOS := LOTIMELASTMAKEROOM := TRLDTIME2;                        <<31857>>46404000
CURRMAKEROOMTIME := TOS; <<SAVE CURRENT MAKEROOM TIME>>        <<31857>>46405000
IF CURRMAKEROOMTIME - LASTMAKEROOMTIME < 0D THEN               <<31857>>46406000
MEM'PRESSURE := FALSE <<CLOCK ROLLOVER SINCE LAST MAKROOM>>    <<31857>>46407000
ELSE IF CURRMAKEROOMTIME - LASTMAKEROOMTIME < MEMPRESSINTERVAL <<31857>>46408000
THEN MEM'PRESSURE := TRUE ELSE MEM'PRESSURE := FALSE;          <<31857>>46409000
      IF CYCLECOUNTER >= MAXCOUNT THEN SUDDENDEATH (615);      <<S9229>>46506000
            IF = THEN CHECK'REF'BITS ELSE                      <<31857>>46610000
               BEGIN                                           <<31857>>46611000
               OK'TO'MAKEOC := FALSE;                          <<31857>>46612000
               SUBREGFLAGS.REGREFFLAGS := 3; <<SET ALL  BITS>> <<31857>>46613000
               END;                                            <<31857>>46614000
            IF OK'TO'MAKEOC THEN MAKEOC (0,OBJ,REQSIZE,        <<31857>>46615000
                                                  SCANPOINT)   <<31857>>46616000
            ELSE                                               <<31857>>46617000
               IF = THEN CHECK'REF'BITS ELSE                   <<31857>>46725000
                  BEGIN                                        <<31857>>46726000
                  OK'TO'MAKEOC := FALSE;                       <<31857>>46727000
                  SUBREGFLAGS.REGREFFLAGS := 3;<<SET ALL BITS>><<31857>>46728000
                  END;                                         <<31857>>46729000
               IF OK'TO'MAKEOC AND NOT NEED'IT THEN            <<31857>>46730000
               MAKEOC(DESCSTINX,OBJ,REQSIZE,SCANPOINT) ELSE    <<31857>>46731000
                  BEGIN                                        <<31857>>46732000
                  TOS := SUBREGFLAGS;                          <<31857>>46733000
                  ASMB(SSEA);                                  <<31857>>46734000
                  END;                                         <<31857>>46735000
COMMENT                                                        <<L1009>>46840100
**BEGIN_IS*****************************************************<<L1009>>46840200
*                                                             *<<L1009>>46840300
* PROCEDURE CREATELOCKSPACE(PAGESREQUIRED)                    *<<L1009>>46840400
*                                                             *<<L1009>>46840500
* PURPOSE:  CREATELOCKSPACE IS A FUNCTION CALLED TO HAVE A    *<<L1009>>46840600
*           CONTIGUOUS MEMORY REGION SPACE FOUND AND THE      *<<L1009>>46840700
*           ADDRESS PASSED BACK TO THE CALLER.  THIS MEMORY   *<<L1009>>46840800
*           REGION USUALLY STARTS ON A BANK BOUNDARY (THE     *<<L1009>>46840900
*           ONLY EXCEPTION IS THAT THE SEARCH BEGINS A THE    *<<L1009>>46841000
*           ADDRESS POINTED TO BY SYSGLOB VARIABLE            *<<L1009>>46841100
*           FIRSTMEMADDR WHICH MAY POINT TO THE MIDDLE OF A   *<<L1009>>46841200
*           MEMORY BANK) AND THE PROCEDURE IS USED BY CALLERS *<<L1009>>46841300
*           TO OBTAIN A CONTIGUOUS, LOCKABLE MEMORY REGION.   *<<L1009>>46841400
*                                                             *<<L1009>>46841500
*           START THE MEMORY SCAN AT THE ADDRESS SPECIFIED BY *<<L1009>>46841600
*           SYSGLOB VARIABLE FIRSTMEMADDR (CONTAINS ADDRESS   *<<L1009>>46841700
*           OF FIRST PAGE OF LINKABLE [AVAILABLE] MEMORY) AND *<<L1009>>46841800
*           CONTINUE UNTIL EITHER A MEMORY REGION OF THE      *<<L1009>>46841900
*           DESIRED SIZE IS FOUND OR THE LOOP IS TOLD TO QUIT *<<L1009>>46842000
*           BECAUSE THE LIMITS OF MEMORY HAVE BEEN REACHED.   *<<L1009>>46842100
*           GET EACH MEMORY REGION'S SIZE AND IF IT IS        *<<L1009>>46842200
*           AVAILABLE, THEN CALL BUMPSEARCHPOINTER TO         *<<L1009>>46842300
*           POSITION TO THE NEXT MEMORY REGION.  IF THE       *<<L1009>>46842400
*           MEMORY REGION IS LOCKED, FROZEN OR I/O FROZEN,    *<<L1009>>46842500
*           THEN POSITION TO THE FIRST MEMORY REGION IN THE   *<<L1009>>46842600
*           NEXT BANK.  BUT IF THE MEMORY REGION IS IN AN     *<<L1009>>46842700
*           IN-MOTION-IN STATE WHERE A SEGMENT OBJECT IS      *<<L1009>>46842800
*           COMING IN, THEN SET THE CONDITION CODE INDICATING *<<L1009>>46842900
*           A DELAY SHOULD BE DONE TO WAIT FOR THE READ TO    *<<L1009>>46843000
*           COME IT.                                          *<<L1009>>46843100
*                                                             *<<L1009>>46843200
*           OTHERWISE TRY TO MAKE THE ASSIGNED MEMORY REGION  *<<L1009>>46843300
*           AN OVERLAY CANDIDATE BY CALLING PROCEDURE MAKEOC. *<<L1009>>46843400
*           THIS IS DONE BY FIRST SAVING AWAY THE MEMORY      *<<L1009>>46843500
*           PRESSURE CELL, CALLING MAKEOC, RESTORING THE      *<<L1009>>46843600
*           MEMORY PRESSURE CELL AND POSITIONING TO THE NEXT  *<<L1009>>46843700
*           MEMORY REGION.                                    *<<L1009>>46843800
*                                                             *<<L1009>>46843900
*           IF THERE WERE NO ERRORS, THEN PASS BACK THE       *<<L1009>>46844000
*           DOUBLE WORD BANK/BASE ADDRESS OF THE MEMORY       *<<L1009>>46844100
*           REGION THAT WAS FOUND (OTHERWISE RETURN A DOUBLE  *<<L1009>>46844200
*           WORD 0).  ALSO RETURN THE CONDITION CODE          *<<L1009>>46844300
*           INDICATING THE RESULT OF THE CREATELOCKSPACE      *<<L1009>>46844400
*           CALL.                                             *<<L1009>>46844500
*                                                             *<<L1009>>46844600
* ENTRY:    DB ASSUMED TO BE AT SYSDB                         *<<L1009>>46844700
*                                                             *<<L1009>>46844800
*           PAGESREQUIRED=SIZE OF MEMORY REGION DESIRED       *<<L1009>>46844900
*                         (IN PAGES)                          *<<L1009>>46845000
*                                                             *<<L1009>>46845100
* EXIT:     CONDITION CODE =CCE IF MEMORY REGION FOUND        *<<L1009>>46845200
*                          =CCL IF PART OF THE MEMORY REGION  *<<L1009>>46845300
*                               IS IN AN IN-MOTION-IN STATE   *<<L1009>>46845400
*                          =CCG IF NO MEMORY REGION COULD BE  *<<L1009>>46845500
*                               FOUND OR CREATED              *<<L1009>>46845600
*                                                             *<<L1009>>46845700
*           CREATELOCKSPACE=DOUBLE WORD BANK/BASE ADDRESS OF  *<<L1009>>46845800
*                           MEMORY REGION FOUND (=0D IF NONE  *<<L1009>>46845900
*                           FOUND                             *<<L1009>>46846000
*                                                             *<<L1009>>46846100
**END_IS*******************************************************<<L1009>>46846200
;                                                              <<L1009>>46846300
LOGICAL RAS'FLAG;                                              <<D9267>>46896000
DEF'GET'BIT;                                                   <<01648>>46917000
COMMENT                                                        <<L1009>>46920100
..BEGIN_IS.....................................................<<L1009>>46920200
.                                                             .<<L1009>>46920300
. SUBROUTINE BUMPSEARCHBASE                                   .<<L1009>>46920400
.                                                             .<<L1009>>46920500
. PURPOSE:   BUMPSEARCHBASE IS A LOCAL SUBROUTINE CALLED BY   .<<L1009>>46920600
.            CREATELOCKSPACE TO POSITION THE MEMORY REGION    .<<L1009>>46920700
.            POINTER VARIABLE TO THE NEXT ADJACENT BANK.      .<<L1009>>46920800
.                                                             .<<L1009>>46920900
.            RESET THE VARIABLE THAT IS USED TO KEEP TRACK OF .<<L1009>>46921000
.            THE MEMORY REGION BEING INVESTIGATED.  THEN      .<<L1009>>46921100
.            POSITION THE BANK PORTION OF THE BANK/BASE       .<<L1009>>46921200
.            ADDRESS IN THE POINTER VARIABLE TO THE NEXT      .<<L1009>>46921300
.            BANK.  IF THIS BANK/BASE ADDRESS OF THE MEMORY   .<<L1009>>46921400
.            REGION IS AT THE LAST VALID MEMROY REGION, THEN  .<<L1009>>46921500
.            INDICATE TO QUIT AND THAT THE LAST VALID MEMORY  .<<L1009>>46921600
.            REGION HAS BEEN REACHED.                         .<<L1009>>46921700
.                                                             .<<L1009>>46921800
..END_IS.......................................................<<L1009>>46921900
;                                                              <<L1009>>46922000
                                                               <<L1009>>46931000
!  RESET SIZE OF MEMORY REGION BEING INVESTIGATED              <<L1009>>46932000
!  ----------------------------------------------              <<L1009>>46933000
                                                               <<L1009>>46936000
!  POSITION VARIABLES/POINTER TO NEXT MEMORY REGION HEADER     <<L1009>>46937000
!  -------------------------------------------------------     <<L1009>>46938000
IF CARRY OR (THISREGIONSIZE = MAXHOLESIZE) THEN S1 := S1 + 1;  <<H1328>>46955000
                                                               <<L1009>>46966000
!  CHECK & MAYBE INDICATE NO MORE MEMORY REGION                <<L1009>>46967000
!  --------------------------------------------                <<L1009>>46968000
$EDIT                                                          <<L1009>>47000000
$PAGE                                                          <<L1009>>47001000
COMMENT                                                        <<L1009>>47005100
..BEGIN_IS.....................................................<<L1009>>47005200
.                                                             .<<L1009>>47005300
. SUBROUTINE BUMPSEARCHPOINTER                                .<<L1009>>47005400
.                                                             .<<L1009>>47005500
. PURPOSE:   BUMPSEARCHPOINTER IS A LOCAL SUBROUTINE CALLED   .<<L1009>>47005600
.            BY CREATELOCKSPACE TO ADJUST THE MEMORY REGION   .<<L1009>>47005700
.            POINTER TO THE NEXT REGION WHICH MAYBE IN THIS   .<<L1009>>47005800
.            BANK OR THE NEXT.                                .<<L1009>>47005900
.                                                             .<<L1009>>47006000
.            ADD THE SIZE OF THE REGION POINTED TO BY         .<<L1009>>47006100
.            VARIABLE SEARCH POINTER TO POSITION TO THE NEXT  .<<L1009>>47006200
.            MEMORY REGION.  IF THIS POSITION IS THE END OF   .<<L1009>>47006300
.            THE BANK, THEN POSITION THE POINTER TO THE NEXT  .<<L1009>>47006400
.            ADJACENT BANK.  IF THIS POSITION IS AT THE LAST  .<<L1009>>47006500
.            VALID MEMORY REGION, THEN INDICATE TO QUIT AND   .<<L1009>>47006600
.            THAT THE LAST VALID MEMORY REGION HAS BEEN       .<<L1009>>47006700
.            REACHED.                                         .<<L1009>>47006800
.                                                             .<<L1009>>47006900
..END_IS.......................................................<<L1009>>47007000
;                                                              <<L1009>>47007100
                                                               <<L1009>>47016000
!  POSITION TO NEXT MEMORY REGION                              <<L1009>>47017000
!  ------------------------------                              <<L1009>>47018000
$EDIT                                                          <<L1009>>47020000
IF POTENTIALSIZE >= PAGESREQUIRED THEN RETURN;                 <<L1009>>47026000
TOS := SEARCHPOINTER;                                          <<L1009>>47027000
                                                               <<L1009>>47036000
!  IF AT END OF BANK, POSITION TO NEXT BANK                    <<L1009>>47037000
!  ----------------------------------------                    <<L1009>>47038000
IF CARRY AND (THISREGIONSIZE < MAXHOLESIZE) THEN               <<L1009>>47040000
                                                               <<L1009>>47061000
!  CHECK & MAYBE INDICATE NO MORE MEMORY REGION                <<L1009>>47062000
!  --------------------------------------------                <<L1009>>47063000
$EDIT VOID=47120000                                            <<L1009>>47115000
$PAGE                                                          <<L1009>>47116000
<<*********>>                                                  <<L1009>>47117000
<<MAINLINE >>                                                  <<L1009>>47118000
<<********>>                                                   <<L1009>>47119000
                                                               <<L1009>>47120000
<<********************************************>>               <<L1009>>47120100
<<SEARCH MEMORY FOR SUITABLE, LOCKABLE REGION>>                <<L1009>>47120200
<<*******************************************>>                <<L1009>>47120300
                                                               <<L1009>>47135100
!  GET THIS MEMORY REGION'S SIZE                               <<L1009>>47135200
!  -----------------------------                               <<L1009>>47135300
                                                               <<L1009>>47161000
!  IF THIS REGION IS AVAILABLE, GO CHECK NEXT REGION           <<L1009>>47162000
!  -------------------------------------------------           <<L1009>>47163000
   RAS'FLAG := TOS;  <<SAVE RAS>>                              <<D9267>>47171000
   IF RAS'FLAG.REGAVAILABLEFLAG THEN BUMPSEARCHPOINTER         <<D9267>>47175000
                                                               <<L1009>>47176000
!  IF REGION IS LOCKED, FROZEN OR IOFROZEN, GO TO NEXT BANK    <<L1009>>47177000
!  --------------------------------------------------------    <<L1009>>47178000
   ELSE IF RAS'FLAG.REGLKDFLAG THEN BUMPSEARCHBASE             <<D9267>>47180000
   ELSE IF RAS'FLAG.REGFZFLAG THEN BUMPSEARCHBASE              <<D9267>>47185000
   ELSE IF RAS'FLAG.REGIOFZFLAG THEN                           <<D9267>>47190000
$EDIT VOID=47205000                                            <<L1009>>47200000
                                                               <<L1009>>47216000
!  IF OBJECT IN-MOTION-IN, INDICATE DELAY UNTIL READ COMES IN  <<L1009>>47217000
!  ----------------------------------------------------------  <<L1009>>47218000
      IF RAS'FLAG.REGMAPFLAG THEN MAPSEG:=TRUE ELSE            <<D9267>>47230000
                                  MAPSEG:=FALSE;               <<D9267>>47231000
$EDIT                                                          <<D9267>>47235000
$EDIT VOID=47265000                                            <<L1009>>47255000
$EDIT                                                          <<L1009>>47355000
                                                               <<L1009>>47381000
COMMENT ***********************************************        <<L1009>>47382000
* MAKE SUITABLE REGION AN AVAILABLE OVERLAY CANDIDATE *        <<L1009>>47383000
******************************************************;        <<L1009>>47384000
$EDIT VOID=47400000                                            <<L1009>>47395000
                                                               <<L1009>>47396000
!        SAVE MEMORY PRESSURE VARIABLE CONTENTS IF MAPCST      <<L1009>>47397000
!        ------------------------------------------------      <<L1009>>47398000
!        HAVE REGION MADE INTO OVERLAY CANDIDATE               <<L1009>>47431000
!        ---------------------------------------               <<L1009>>47432000
!        RESTORE MEMORY PRESSURE VARIABLE                      <<L1009>>47441000
!        --------------------------------                      <<L1009>>47442000
   ASMB(DDEL);  <<DELETE BANK & BASE>>                         <<D9267>>47466000
COMMENT **********************************************         <<L1009>>47481000
* PASS BACK START OF LOCKABLE REGION OR ERROR STATUS *         <<L1009>>47482000
*****************************************************;         <<L1009>>47483000
EQUATE MM'REQUEST = %40000,  << Flags word for DRQ >>          <<01648>>47753000
       DRQ'BANK   = (DRQ'DST*4)+2; << DST Bank for DRQ table >><<01648>>47754000
        LDR'ENTRY'INDEX,                                       <<02033>>47821000
     << SWAPPINGIN:=FALSE, >>  << Not used >>                  <<01648>>47920000
        IOFZREQ'DONE:=FALSE,                                   <<*1501>>47936000
        Virgin'Seg := False, <<set to true if Data seg is >>   <<01787>>47951000
                             <<newly created              >>   <<01787>>47952000
LOGICAL REG'BANK    = REGIONBASE,                              <<01648>>47986000
        REG'OFFSET  = REG'BANK + 1;                            <<01648>>47987000
LOGICAL DRQ'DB'FLAGS'INDEX = DB + DRQ'FLAGS'INDEX,             <<01648>>47990100
        DRQ'DB'SEGDISP'INDEX = DB + DRQ'SEGDISP'INDEX,         <<01648>>47990200
        DRQ'DB'BUFADR'INDEX = DB + DRQ'BUFADR'INDEX,           <<01648>>47990300
        DRQ'DB'BUFDST'INDEX = DB + DRQ'BUFDST'INDEX,           <<01648>>47990400
        DRQ'DB'FUNC'INDEX = DB + DRQ'FUNC'INDEX,               <<01648>>47990500
        DRQ'DB'COUNT'INDEX = DB + DRQ'COUNT'INDEX,             <<01648>>47990600
        DRQ'DB'LDEV'INDEX = DB + DRQ'LDEV'INDEX,               <<01648>>47990700
        DRQ'DB'PARM1'INDEX = DB + DRQ'PARM1'INDEX,             <<01648>>47990800
        DRQ'DB'PARM2'INDEX = DB + DRQ'PARM2'INDEX,             <<01648>>47990900
        DRQ'DB'STATUS'INDEX = DB + DRQ'STATUS'INDEX,           <<01648>>47991000
        DRQ'DB'PCB'INDEX = DB + DRQ'PCB'INDEX,                 <<01648>>47991100
        DRQ'DB'QMISC'INDEX = DB + DRQ'QMISC'INDEX,             <<01648>>47991200
        DRQ'DB'SEGID1'INDEX = DB + DRQ'SEGID1'INDEX,           <<01648>>47991300
        DRQ'DB'SEGID2'INDEX = DB + DRQ'SEGID2'INDEX,           <<01648>>47991400
        DRQ'DB'URGCLAS'INDEX = DB + DRQ'URGCLAS'INDEX;         <<01648>>47991500
                                                               <<01648>>47991600
ELSE                                                           << 9539>>49545000
COMMENT**** If the process is running in non-linear queue and  <<Q9367>>49546000
       is holding a SIR then its I/O will be done at the       <<Q9367>>49547000
       priority of CBASE;                                      <<Q9367>>49548000
                                                               <<Q9367>>49549000
   BEGIN  <<THE REQUEST IS NOT AN I/O REQUEST>>                << 9539>>49549100
   PROCPRI := QUEUEINGINFO.PRIFIELD;                           << 9539>>49550000
   IF RESABORTINFO.HASSIRFLAG AND PROCPRI >                    << 9539>>49551000
$EDIT                                                          << 9539>>49551100
   ICS(-ICS'CSCHEDBASECELL) THEN PROCPRI :=                    << 9539>>49552000
   ICS(-ICS'CSCHEDBASECELL);                                   << 9539>>49553000
   END;                                                        << 9539>>49553100
                                                               << 9539>>49554000
   If Dataseg' then                                            <<01787>>50005100
      Begin <<Check if this is a newly created Dataseg>>       <<01787>>50005200
      X := segdescsysbaseinx;                                  <<01787>>50005300
      If segdescfirminfo.(0:3) = 7 then                        <<01787>>50005400
         Begin                                                 <<01787>>50005410
         Segdescfirminfo.(0:3) := 4;<<Set the absent bit only>><<01787>>50005420
         tos := specialflags;                                  <<01787>>50005430
         if = then <<only set Virgin'seg if specialflag=0>>    <<01787>>50005500
         Virgin'seg := true;                                   <<01787>>50005510
         End;                                                  <<01787>>50005520
      End;                                                     <<01787>>50005600
                                                               <<01787>>50005700
      If (Dqh'tot'ent - Dqh'cur'nuse) < 2 and not Virgin'seg   <<01787>>50025000
      Then                                                     <<01787>>50026000
            LDR'ENTRY'INDEX := CDT'ARRAY (CDT'MD'LDR'HEAD);    <<02033>>50267000
      If not Virgin'seg then                                   <<01787>>50750100
      Begin                                                    <<01787>>50750200
           ASMB(LSEA);                                         <<01648>>50795000
           IF = THEN                                           <<01648>>50796000
              BEGIN                                            <<01648>>50797000
              ASMB(DEL);  << Remove Zeroed DRQ >>              <<01648>>50798000
              TOS := GETDISCREQ(2);                            <<01648>>50799000
              END;                                             <<01648>>50800000
           TOS := X := DISCREQINX := TOS;                      <<01648>>50801000
           ASMB(SSEA;DDEL);  << Store back disc request >>     <<01648>>50803000
                                                               <<01648>>50805000
<< Place DB at the DRQ entry for fast addressing >>            <<01648>>50835000
TOS := DST(DRQ'BANK);                << Bank on TOS >>         <<01648>>50836000
TOS := DST(X := X+1);               << Offset on TOS >>        <<01648>>50837000
TOS := TOS + DISCREQINX;            << Point to actual entry >><<01648>>50838000
EXCHDB;                                                        <<01648>>50839000
                                                               <<01648>>50840000
<< Initialize disc request >>                                  <<01648>>50841000
DRQ'DB'FLAGS'INDEX := MM'REQUEST;                              <<01648>>50842000
DRQ'DB'SEGDISP'INDEX := READOFFSET;                            <<01648>>50843000
DRQ'DB'BUFADR'INDEX := logical(READOFFSET) + REG'OFFSET;       <<01648>>50844000
DRQ'DB'BUFDST'INDEX := REG'BANK;                               <<01648>>50845000
DRQ'DB'FUNC'INDEX := READREQ;                                  <<01648>>50846000
DRQ'DB'COUNT'INDEX := XFERCNT;                                 <<01648>>50847000
DRQ'DB'LDEV'INDEX := HODA.(0:8);                               <<01648>>50848000
DRQ'DB'PARM1'INDEX := HODA.(8:8);                              <<01648>>50849000
DRQ'DB'PARM2'INDEX := LODA;                                    <<01648>>50850000
DRQ'DB'STATUS'INDEX := 0;                                      <<01648>>50851000
DRQ'DB'PCB'INDEX := 0;    << Necessary for SIODM (??) >>       <<01648>>50852000
DRQ'DB'QMISC'INDEX := 0;                                       <<01648>>50853000
DRQ'DB'SEGID1'INDEX := OBJIDENTIFIER(OBJIDDESCFIELD);          <<01648>>50854000
DRQ'DB'SEGID2'INDEX := OBJIDENTIFIER(OBJIDNUMFIELD);           <<01648>>50855000
DRQ'DB'URGCLAS'INDEX := PROCPRI;                               <<01648>>50856000
                                                               <<01648>>50857000
<< Put DB back where it was >>                                 <<01648>>50858000
EXCHDB;                                                        <<01648>>50859000
ASMB(DDEL);    << Remove DB pointer >>                         <<01648>>50860000
$edit void=50965000                                            <<01648>>50865000
                                                               <<02033>>50955100
<<THIS IS FOR CACHE READ IOS. SEE THE COMMENT IN          >>   <<02033>>50955200
<<STARTOBJECTWRITE AND IN SIODM OF HARDRES FOR MORE INFO  >>   <<02033>>50955300
IF MAPPEDDOMAIN THEN                                           <<02033>>50955400
BEGIN                                                          <<02033>>50955500
   <<UPDATE MI COUNTERS FOR DISCREAD AND WORDSTRANS >>         <<02033>>50955700
   IF GCLASSENABLEDMASK.CLASS15 THEN                           <<02033>>50955800
   BEGIN                                                       <<02033>>50955900
      TOS := MEASPROCXDSBANK;                                  <<02033>>50956000
      TOS := MEASPROCXDSBASE + (CURPRC / PCBSIZE) *            <<02033>>50956100
             CLASS15'SUB0SIZE + CP'DISCREAD;                   <<02033>>50956200
      ASMB (LSEA);                                             <<02033>>50956300
      TOS := TOS + 1;          <<INCREMENT READ COUNTER>>      <<02033>>50956400
      ASMB (SSEA);                                             <<02033>>50956500
      <<BUMP TRANSFER COUNT>>                                  <<02033>>50956600
      TOS := TOS - CP'DISCREAD + CP'WORDSTRANS;                <<02033>>50956700
      ASMB (LDEA;ZERO);  <<OLD COUNT, ZERO FOR DOUBLE ADD >>   <<02033>>50956800
      TOS := XFERCNT;                                          <<02033>>50956900
      ASMB (DADD;SDEA;DDEL);                                   <<02033>>50957000
   END;                                                        <<02033>>50957100
   <<SET DRQ'BIT IN LDR FLAG FOR A PHYSICAL READ OCCURS>>      <<02033>>50957200
   IF LDR'ENTRY'INDEX <> 0 THEN LDR'DRQ := 1;                  <<p2318>>50957300
   <<If the target DST is absent then the ldr'entry'index is >><<p2318>>50957310
   <<equal to zero, in this case we can not set the flag in>>  <<p2318>>50957320
   <<the LDR entry using this index>>                          <<p2318>>50957330
END;                                                           <<02033>>50957400
      End                                                      <<01787>>50966000
      Else Drq'entry'index := 0; <<Do not need for Virg'seg>>  <<01787>>50967000
                                                               <<01787>>50968000
$EDIT VOID=51265000                                            <<*1218>>51255000
             << Should be DISABLEd when calling LINK-    >>    <<*1218>>51256000
             << CACHEDREGION to prevent timing problems. >>    <<*1218>>51257000
             LINKCACHEDREGION (regionbase);                    <<*1218>>51258000
             << **** Process any pending interupts **** >>     <<*1218>>51259000
             ENABLE;                                           <<*1218>>51261000
             DISABLE;                                          <<*1218>>51262000
         If(Mappeddomain land (Mapd'flags.(Cdt'virgin'Bit:1))) <<01787>>51340000
         or Virgin'seg then tos.initmsgstartcomflag := 1       <<01787>>51341000
         <<Set the initmsgstartcomflags for Virgin Cache   ->> <<01787>>51342000
         <<domain or newly created data segment so that    ->> <<01787>>51345000
         <<PROCESSINITMSG will not issue the I/O read>>        <<01787>>51350000
                                                               <<*1501>>51390020
          <<                                               >>  <<*1501>>51390040
          << THE FOLLOWING CODE FOR SETTING THE I/O FREEZE >>  <<*1501>>51390060
          << INFORMATION IN THE REGION HEADER WAS ADDED    >>  <<*1501>>51390080
          << HERE BECAUSE IT IS POSSIBLE FOR THE I/O TO    >>  <<*1501>>51390100
          << FINISH BEFORE WE RETURN FROM PROCESSINITMSG.  >>  <<*1501>>51390120
          << WHEN THIS HAPPENS SIODM DOES AN IOUNFREEZE    >>  <<*1501>>51390140
          << WHICH DECREMENTS TO IOFREEZE COUNTER AND IF   >>  <<*1501>>51390160
          << THE COUNTER HAD NOT ALREADY BEEN INCREMENTED  >>  <<*1501>>51390180
          << IT GOES NEGATIVE SETTING CCL FROM IOUNFREEZE. >>  <<*1501>>51390200
          << AT THIS POINT SIODM DOES AN SF #299 WHICH CAN >>  <<*1501>>51390220
          << BE AVOIDED BY THIS CHANGE.                    >>  <<*1501>>51390240
          <<                                               >>  <<*1501>>51390260
                                                               <<*1501>>51390280
                                                               <<*1501>>51390300
          <<Perform any Special processing>>                   <<*1501>>51390320
                                                               <<*1501>>51390340
          TOS:=SPECIALFLAGS;                                   <<*1501>>51390360
          DEL;       << DELETE THE SPECIAL FLAGS >>            <<*1501>>51390380
          IF <> AND RETURNVALUE = MMOK THEN                    <<*1501>>51390400
            BEGIN <<UPDATE SPECIAL STATE COUNTERS>>            <<*1501>>51390420
            DISABLE;                                           <<*1501>>51390440
            TOS:=REGIONBASE;                                   <<*1501>>51390460
                                                               <<*1501>>51390480
            IF IOFZREQ THEN                                    <<*1501>>51390500
               BEGIN                                           <<*1501>>51390520
               IF A'DISC THEN                                  <<*1501>>51390540
                  BEGIN    << It's a disc request index >>     <<*1501>>51390560
                  DRQ'ENTRY'INDEX := REQUESTORID.(2:14);       <<*1501>>51390580
                  IF DRQ'DATAFRZN OR DRQ'DONE THEN RETURN;     <<*1501>>51390600
                  DRQ'DATAFRZN := 1;                           <<*1501>>51390620
                  END;                                         <<*1501>>51390640
                                                               <<*1501>>51390660
               IOFZREQ'DONE:=TRUE;   <<SET FOR LATER CHECK>>   <<*1501>>51390680
               TOS:=TOS+RBTOWDIOFZCNTDISP;                     <<*1501>>51390700
               ASMB(LSEA);                                     <<*1501>>51390720
               COUNT:=TOS;                                     <<*1501>>51390740
               COUNT.IOFZCNTFIELD:=COUNT.IOFZCNTFIELD+1;       <<*1501>>51390760
               TOS:=COUNT;                                     <<*1501>>51390780
               ASMB(SSEA);                                     <<*1501>>51390800
               TOS:=TOS+WDIOFZCNTTORASDISP;                    <<*1501>>51390820
               ASMB(LSEA);                                     <<*1501>>51390840
               TOS.REGIOFZFLAG:=1;                             <<*1501>>51390860
               ASMB(SSEA);                                     <<*1501>>51390880
               MMSTAT'(MMSTATSPECREQ,                          <<*1501>>51390900
                      OBJIDENTIFIER(OBJIDDESCFIELD),           <<*1501>>51390920
                      OBJIDENTIFIER(OBJIDNUMFIELD),%100000,    <<*1501>>51390940
                      COUNT.IOFZCNTFIELD,0,0);                 <<*1501>>51390960
               END;    << I/O FREEZE REQUEST >>                <<*1501>>51390980
            DDEL;      << DELETE THE REGION BASE OFFSET >>     <<*1501>>51391000
            END;  <<UPDATE SPECIAL COUNTER >>                  <<*1501>>51391020
                                                               <<*1501>>51391040
   IF IOFZREQ AND NOT IOFZREQ'DONE THEN                        <<*1501>>51500000
      BEGIN   << NOT AN I/O FREEZE REQUEST >>                  <<*1501>>51620000
                                                               <<A9791>>52056000
INTEGER SEGDESCSTINX,                                          <<A9791>>52057000
        SEGDESCSYSBASEINX;                                     <<A9791>>52058000
                                                               <<A9791>>52066000
LOGICAL ARRAY OBJIDENT(*)=OBJIDENTIFIER;                       <<A9791>>52067000
                                                               <<A9791>>52068000
DOUBLE SAVETIME, STARTTIME;                                    <<02034>>52070000
LOGICAL SKIP ;                                                 <<A9791>>52076000
<<SINCE SWAPIN CAN BE CALLED FROM DIC CACHING, IE. ON TOP >>   <<02034>>52145000
<<OF REQUEST'CACHE, WE WANT TO SAVE THE PREEMPTION TIME   >>   <<02034>>52145100
<<ACCUMULATED SO FAR BEFORE WE RESET DOUBLE WORD PREEMPT- >>   <<02034>>52145200
<<STOPTIME TO ZERO FOR SWAPIN TIMING. LATER, AFTER WE'RE  >>   <<02034>>52145300
<<DONE WITH SWAPIN MEASUREMENT, WE WANT TO ADD THIS VALUE >>   <<02034>>52145400
<<TO THE DOUBLE WORD CELL FOR REQUEST'CACHE TIMING. ALSO  >>   <<02034>>52145500
<<NOTICE THAT TOGETHER WITH TAKING THE TIMER, WE WANT TO  >>   <<02034>>52145600
<<ZERO THAT CELL BOTH IN ONE CRITICAL REGION FOR TIMING   >>   <<02034>>52145700
<<INTEGRITY. THE ONLY WAY FOR DOING THIS IS BY USING      >>   <<02034>>52145800
<<PDISABLE, PENABLE AND I DO NOT WANT TO CAUSE MORE OVER- >>   <<02034>>52145900
<<HEAD TO THE SYSTEM.  HN.                                >>   <<02034>>52146000
IF GCLASSENABLEDMASK.CLASS0 THEN                               <<02034>>52146100
BEGIN                                                          <<02034>>52146200
   STARTTIME := TIMER;                                         <<02034>>52146300
<<FOR DISP CALLING SWAPIN, IT IS POSSIBLE THAT>>               <<P2137>>52146310
<<USER'S STACK IS NOT RESIDE IN MEMORY.       >>               <<P2137>>52146320
<<BECAUSE OF THE ABOVE REASON, WE DON'T HANDLE>>               <<P2137>>52146330
<<PREEMPTION CASE FOR DISP--SWAPIN.           >>               <<P2137>>52146340
   IF CURPRC <> 0 THEN                                         <<P2137>>52146350
   BEGIN                                                       <<P2137>>52146360
   TOS := ICS (-ICS'STKBANKCELL);                              <<02034>>52146400
   TOS := ICS (-ICS'STKBASECELL) + SBTOPREEMPTSTOPTIME;        <<02034>>52146500
   ASMB (LDEA);                                                <<02034>>52146600
   SAVETIME := TOS;    <<SAVE PREVIOUS PREEMPTION TIME>>       <<02034>>52146700
   ASMB (DZRO;SDEA;DDEL);                                      <<02034>>52146800
   END; <<CURPRC <> 0>>                                        <<P2137>>52146810
END;                                                           <<02034>>52146900
   ELSE                                                        <<A9791>>52450000
   Comment *** This is to fix the SF617 for the Network Service<<A9791>>52450010
   when a segment in process SLL has been release by some other<<A9791>>52450020
   process. Will check to make sure that DATA seg. exists      <<A9791>>52450030
   before calling FETCHOBJECT ***** ;                          <<A9791>>52450040
      BEGIN                                                    <<A9791>>52450100
      SKIP := FALSE;                                           <<A9791>>52450101
      IF OBJIDENT(OBJIDTYPEFIELD) <> OBJIDCDTYPE THEN          <<A9791>>52450110
         BEGIN  <<Check for nonexistent segments>>             <<A9791>>52450120
         IF OBJIDENT(OBJIDTYPEFIELD) = OBJIDDATATYPE THEN      <<A9791>>52450200
         SEGDESCSTINX := OBJIDENT(OBJIDNUMFIELD) & LSL(2)      <<A9791>>52450300
         ELSE SEGDESCSTINX := CONVSEGIDTOSTINX(OBJIDENTIFIER); <<A9791>>52450400
         X := DSTSYSBASEINX + SEGDESCSTINX;                    <<A9791>>52451400
         IF SEGDESCFIRMINFO = %100000 <<nonexistent segment>>  <<A9791>>52452400
         THEN SKIP  := TRUE   <<Don't call Fechobject>>        <<A9791>>52453000
         END;                                                  <<A9791>>52455000
      IF SKIP  THEN SWAPIN := MMOK                             <<A9791>>52456000
      ELSE SWAPIN := FETCHOBJECT(OBJIDENTIFIER,SWAPINPROCINX,  <<A9791>>52457000
                     SPECIALREQFLAGS,SLLINX,HARDREQUEST);      <<A9791>>52458000
      END;                                                     <<A9791>>52459000
   END; <<MMOK>>                                               <<P2137>>52623000
IF TOS.SLLIOCOMPTOAWAKEMSG=0                                   <<02137>>52625000
AND SWAPINSTRUCTIONS.SWAPWAKEUP THEN                           <<02137>>52630000
   BEGIN <<PROCESS IS READY TO BE LAUNCHED>>                   <<02137>>52635000
$EDIT VOID = 52640000                                          <<P2137>>52640000
                                                               <<02034>>52640010
      <<UPDATE MEMORY ALLOCATION TIME WHEN CALLED FROM DISP>>  <<02034>>52640100
      <<THERE SHOULD BE NO STOPPREEMPTION OVERHEAD IN THIS >>  <<02034>>52640110
      <<CASE BECAUSE IT'S CALLED FROM DISPATCHER.          >>  <<02034>>52640120
      <<NO MATTER MMOK OR NOT, NEED TO UPDATE CPUMEMORYALLOC>> <<P2137>>52640130
      IF GCLASSENABLEDMASK.CLASS0 THEN                         <<02034>>52640200
      BEGIN                                                    <<02034>>52640300
         TOS := MEASSTATXDSBANK;                               <<02034>>52640400
         TOS := MEASSTATXDSBASE + C0SUB0'SEGRELOFF +           <<02034>>52640500
                C'CPUMEMORYALLOC;                              <<02034>>52640600
         ASMB (LDEA);                                          <<02034>>52640700
         TOS := TIMER - STARTTIME;                             <<02034>>52640800
         ASMB (DADD;SDEA;DDEL);                                <<02034>>52640900
      END;                                                     <<02034>>52641200
   IF RETURNVALUE = MMOK THEN                                  <<P2137>>52642100
      BEGIN                                                    <<P2137>>52643000
      SWAPIN:=MMPREEMPT; <<SIGNAL DISP TO START OVER>>         <<P2137>>52644000
IF CURPRC <> 0 AND GCLASSENABLEDMASK.CLASS0 THEN               <<P2137>>52690000
   BEGIN  <<MEASURE SWAP-IN EVENT AND DURATION FOR DISC CACHING--PREEM>>52695000
   TOS := TOS + C0SUB0'SEGRELOFF + C'CPUMEMORYALLOC;           <<02034>>52710000
   ASMB (LDEA);                                                <<02034>>52715000
   TOS := TIMER - STARTTIME;                                   <<02034>>52715100
   TOS := ICS (-ICS'STKBANKCELL);                              <<02034>>52715200
   TOS := ICS (-ICS'STKBASECELL) + SBTOPREEMPTSTOPTIME;        <<02034>>52715300
   ASMB (LDEA;DXCH;LDEA);                                      <<02034>>52715400
   TOS := TOS + SAVETIME;   <<ADD BACK SAVETIME>>              <<02034>>52715500
   ASMB (SDEA;DDEL;DSUB);                                      <<02034>>52715600
   <<TOS NOW HAS THE ACTUAL TIME WE SPENT IN SWAPIN>>          <<02034>>52715700
   ASMB (DDUP);                                                <<02034>>52715800
   SAVETIME := TOS;                                            <<02034>>52715900
   ASMB (DADD;SDEA);   <<UPDATE SWAPIN TIME>>                  <<02034>>52716000
   <<IF SWAPIN IS CALLED FROM DISC CACHING, WE WANT TO      >> <<02034>>52716100
   <<SUBSTRACT SWAPIN TIME FROM C'CACHEONPROCESS BECAUSE IT >> <<02034>>52716200
   <<WILL BE INCLUDED IN C'CACHEONPROCESS BY REQUEST'CACHE. >> <<02034>>52716300
$EDIT VOID = 52716500                                          <<P2137>>52716400
      TOS := TOS - C'CPUMEMORYALLOC + C'CACHEONPROCESS;        <<02034>>52716600
      ASMB (LDEA);                                             <<02034>>52716700
      TOS := SAVETIME;   <<SWAPIN TIME>>                       <<02034>>52716800
      ASMB (DSUB;SDEA);                                        <<02034>>52716900
$EDIT VOID = 52717000                                          <<P2137>>52717000
   ASMB (DDEL);     <<DEL BANK, ADDR>>                         <<02034>>52717100
   END;                                                        <<02034>>52717200
$EDIT VOID = 52800000                                          <<02034>>52720000
LOGICAL TOS'REL'STOP'REASON = S-6;                             <<02034>>58182000
DOUBLE  TOSRELCURSTOPTIME = S-5;                               <<02034>>58186000
INTEGER SAVE'X    = Q + 52;                                    <<*9384>>58191000
IF PMBCFIRMWARE                                                <<*9384>>58615000
    THEN UPDATE'PCBXBNDS'FLAG;                                 <<*9384>>58620000
IF PMBCFIRMWARE                                                <<*9384>>60400000
   THEN GET'PCBXBNDS'FLAG;                                     <<*9384>>60405000
      SAVE'X := X;                                             <<*9384>>60521000
      IF PMBCFIRMWARE THEN                                     <<*9384>>60525000
         BEGIN                                                 <<*9384>>60530000
         X := SAVE'X;                                          <<*9384>>60531000
         GET'XDSEG'LIMITS;                                     <<*9384>>60532000
         END;                                                  <<*9384>>60533000
      X := SAVE'X;                                             <<*9384>>60534000
BEGIN    <<UPDATE STOPTIME FOR VARIOUS REASONS>>               <<02034>>60580000
   BEGIN                                                       <<02034>>60605000
      <<TOS NOW HAS STOP REASON, STKBANK, STKBASE, AND      >> <<02034>>60675000
      <<CURRENT STOPTIME. NOW ADD TO APPROPRIATED COUNTER   >> <<02034>>60680000
      <<IN PROCESS LEVEL XDS                                >> <<02034>>60685000
      TOS := MEASPROCXDSBANK;                                  <<02034>>60690000
      TOS := MEASPROCXDSBASE + CURPRC / PCBSIZE *              <<02034>>60695000
             CLASS15'SUB0SIZE;                                 <<02034>>60700000
      TOS := TOS + CP'PAUSESWAPTIME - 2 +                      <<02034>>60705000
             TOS'REL'STOP'REASON * 2;                          <<02034>>60710000
      ASMB (LDEA);   <<OLD CUMMULATIVE TIME STOPPED>>          <<02034>>60715000
      TOS := TOSRELLASTSTOPTIME;    <<FROM S-5>>               <<02034>>60720000
      ASMB (DADD;SDEA;DDEL); <<STUFF NEW TIME, DEL BANK, BASE>><<02034>>60725000
      <<IF STOPREASON IS PREEMPTION, QUANTUM TIMEOUT, OR STOP>><<02034>>60726000
      <<FOR DISC, THEN ADD STOPTIME INTO PREEMPTSTOPTIME DBL >><<02034>>60727000
      <<WD IN PXGLOBAREA. THIS DOUBLE WORD IS USED TO EXCLUDE>><<02034>>60728000
      <<OVERHEAD TIME IN CALCULATING TIME SPENDING ON CERTAIN>><<02034>>60729000
      <<STATE, EG. CACHEONPROCESS, MEMORYALLOC.              >><<02034>>60730000
      IF (TOSRELSTOPREASON = STOPACTIVE) OR                    <<02034>>60731000
         (TOSRELSTOPREASON = STOPDISCWAIT) THEN                <<02034>>60731100
      BEGIN  <<STOP BY PREEMPTION, QUANTUM TIMEOUT, DISC WAIT>><<02034>>60731200
         ASMB (DXCH);  <<EXCHANGE STOPTIME, BANK, ADR>>        <<02034>>60731400
         TOS := TOS - SBTOMEASSTOPTIME + SBTOPREEMPTSTOPTIME;  <<02034>>60731500
         ASMB (LDEA);                                          <<02034>>60731600
         TOS := TOSRELCURSTOPTIME;    <<FROM S-5>>             <<02034>>60731700
         ASMB (DADD;SDEA);                                     <<02034>>60731800
      END;                                                     <<02034>>60735000
      ASMB (DDEL);                                             <<02034>>60738000
   END;                                                        <<02034>>60740000
   ASMB (DDEL;DEL);                                            <<02034>>60745000
END;                                                           <<02034>>60750000
<<UPDATE LAUNCH COUNTERS>>                                     <<02034>>61330100
IF GCLASSENABLEDMASK.CLASS0 THEN                               <<02034>>61330200
BEGIN                                                          <<02034>>61330300
   TOS := MEASSTATXDSBANK;                                     <<02034>>61330400
   TOS := MEASSTATXDSBASE + C0SUB0'SEGRELOFF + C'LAUNCH;       <<02034>>61330500
   ASMB (LSEA;INCA;SSEA;DDEL);                                 <<02034>>61330600
END;                                                           <<02034>>61330700
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<02034>>61330800
BEGIN                                                          <<02034>>61330900
   TOS := MEASPROCXDSBANK;                                     <<02034>>61331000
   TOS := MEASPROCXDSBASE;                                     <<02034>>61331100
   TOS := TOS + (LAUNCHPROCINX / PCBSIZE) *                    <<02034>>61331110
          CLASS15'SUB0SIZE + CP'LAUNCH;                        <<02034>>61331200
   ASMB (LSEA;INCA;SSEA;DDEL);                                 <<02034>>61331300
END;                                                           <<02034>>61331400
                                                               <<02034>>61331500
ASMB(ADDS 52);  << FOR DISPATCHER LOCAL VARIABLES >>           <<*9384>>61515000
IF CACHE'DST <> 0 AND NBANKS >= 15 THEN                        <<01648>>61536000
MEMORYPRESSURE := FALSE <<GO CHEAP IF CACHE ENABLE>>           <<01648>>61537000
ELSE BEGIN <<SET MEMORY ACCORDINGLY TO CLOCK CYCLE>>           <<01648>>61538000
END;                                                           <<01648>>61609000
$EDIT VOID = 61615000                                          <<01648>>61610000
$EDIT VOID = 61920000                                          <<02034>>61905000
         TOS := TOS + C0SUB0'SEGRELOFF + C'CPUPROCESS;         <<02034>>61925000
                CLASS15'SUB0SIZE + CP'CPUTIME;                 <<02034>>61980000
$EDIT VOID = 62000000                                          <<02034>>61985000
                                                               <<02034>>62760100
            IF GCLASSENABLEDMASK.CLASS0 THEN                   <<02034>>62760200
            BEGIN                                              <<02034>>62760300
               TOS := MEASSTATXDSBANK;                         <<02034>>62760400
               TOS := MEASSTATXDSBASE;                         <<02034>>62760500
               TOS := TOS + C0SUB0'SEGRELOFF + C'SWAPIN;       <<02034>>62760600
               ASMB (LSEA;INCA;SSEA;DDEL);                     <<02034>>62760700
            END;                                               <<02034>>62760800
                                                               <<02034>>62760900
            IF GCLASSENABLEDMASK.CLASS15 THEN                  <<02034>>62761000
            BEGIN                                              <<02034>>62761100
               TOS := MEASPROCXDSBANK;                         <<02034>>62761200
               TOS := MEASPROCXDSBASE;                         <<02034>>62761300
               TOS := TOS + (SWAPINPROCINX / PCBSIZE) *        <<02034>>62761400
                      CLASS15'SUB0SIZE + CP'SWAPIN;            <<02034>>62761500
               ASMB (LSEA;INCA;SSEA;DDEL);                     <<02034>>62761600
            END;                                               <<02034>>62761700
                                                               <<02034>>62761800
                                                               <<02034>>62770100
               IF GCLASSENABLEDMASK.CLASS0 THEN                <<02034>>62770200
               BEGIN                                           <<02034>>62770300
                  TOS := MEASSTATXDSBANK;                      <<02034>>62770400
                  TOS := MEASSTATXDSBASE;                      <<02034>>62770500
                  TOS := TOS + C0SUB0'SEGRELOFF +              <<02034>>62770600
                         C'SWAPQSUCCESS;                       <<02034>>62770610
                  ASMB (LSEA;INCA;SSEA;DDEL);                  <<02034>>62770700
               END;                                            <<02034>>62770800
                                                               <<02034>>62770900
