$CONTROL MAP,CODE,USLINIT                                               00010000
<<KERNELD - MODULE 93>>                                        <<01636>>00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00016000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00018000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00020000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00022000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00024000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00026000
BEGIN                                                                   00028000
<<THE FOLLOWING EQUATES WHOSE IDENTIFIER END WITH THE>>                 00030000
<<CHARACTER "N" OR "B" ARE THE SYSGLOB-RELATIVE ADDRESS>>               00032000
<<OF THE IDENTIFIERS>>                                                  00034000
$THIRTY                                                                 00036000
$CONTROL MAIN=KERNELD                                                   00038000
$CONTROL SEGMENT=KERNELD                                                00040000
EQUATE   CSTB      =1,                                                  00042000
         DSTB      =2,                                                  00044000
         PCBB      =3,                                                  00046000
         QI        =5,                                                  00048000
         ICSIX=7,                                              <<01636>>00050000
         LPDTN     =%10,                                                00052000
         DFCN      =%32,                                                00054000
         DFSN      =%33,                                                00056000
         NBANKSN   =%47,                                                00058000
         CSTBLKN   =%51,                                                00060000
         PRESSN    =%53,                                                00062000
         MAXDSEGN  =%111,                                               00064000
         DFC'      =DFCN+%1000,                                         00066000
         DFS'      =DFSN+%1000,                                         00068000
         MAXDSEG'  =MAXDSEGN+%1000,                                     00070000
         CCG       =0,                                                  00072000
         CCL       =1,                                                  00074000
         CCE       =2,                                                  00076000
         CPCB      =4,                                                  00078000
         PCBSIZE   =16,                                                 00080000
         STACK'LIMIT =31223,                                            00082000
         LASTN     =0;                                                  00084000
                                                               <<03044>>00086000
DEFINE  ABS      = ABSOLUTE#;                                  <<03044>>00088000
                                                               <<03044>>00090000
INTEGER POINTER                                                         00092000
         DSTI      =DB+DSTB,           <<DST TABLE>>                    00094000
         DSTI'     =DSTB,                                               00096000
         PCBI      =DB+PCBB,           <<PCB TABLE>>                    00098000
         PCBI'     =PCBB,                                               00100000
         PCB       = PCBB,                                     <<03044>>00102000
         ICS=ICSIX,                                            <<01636>>00104000
         CSTI      =DB+CSTB,           <<CST TABLE>>                    00106000
         CSTI'     =CSTB,                                               00108000
         CSTBLK    =DB+CSTBLKN,                                         00110000
         CSTBLK'   =CSTBLKN,                                            00112000
         LPDT      =DB+LPDTN;                                           00114000
LOGICAL POINTER                                                         00116000
         PCBL'     =PCBB,                                               00118000
         DSTL      =DB+DSTB,           <<DST TABLE>>                    00120000
         DSTL'     =DSTB;                                               00122000
LOGICAL  STATUS    =Q-1;                                                00124000
ARRAY Q0ARRAY(*)=Q+0;                                          <<03044>>00126000
INTEGER  DFCX      =DB+DFCN,           <<@CST-@DST>>                    00128000
         DFSX      =DB+DFSN;                                            00130000
                                                                        00132000
EQUATE DSTIX=2,                                                         00134000
       VDSMTABIX=%26,                                                   00136000
       SYSVDSMTAB=%1026;                                                00138000
                                                                        00140000
<<TABLE POINTERS FOR LST ACCESS>>                                       00142000
                                                                        00144000
INTEGER POINTER DST=DSTIX;                                              00146000
LOGICAL POINTER VDSMTAB=VDSMTABIX;                                      00148000
                                                                        00150000
LOGICAL LS0=S-0,                                                        00152000
        LS1=S-1;                                                        00154000
INTEGER S0=S-0;                                                         00156000
EQUATE PXMAXSTACK=23;                                          <<01636>>00158000
                                                               <<03044>>00160000
<<SOFT INTERRUPT EQUATES>>                                     <<03044>>00162000
                                                               <<03044>>00164000
EQUATE   USERMSGPORT     = 1,                                  <<03044>>00166000
         SYSTEMSGPORT    = 2,                                  <<03044>>00168000
         DELETEMSG       = 0;                                  <<03044>>00170000
                                                               <<03044>>00172000
$INCLUDE INCLVMLD                                                       00174000
INTEGER  X         =X;                 <<THE X-REGISTER>>               00176000
DEFINE   F         =ABSOLUTE#,                                          00178000
         ASMB      =ASSEMBLE#,                                          00180000
         FORCESTKO =ASMB(ADDS 100;SUBS 100)#,                           00182000
         DUPLICATE =ASMB(DUP)#,                                         00184000
         TRIPLICATE=ASMB(DUP,DUP)#,                                     00186000
         EXCHANGE  =ASMB(XCH)#,                                         00188000
         PDISABLE  =ASMB(PSDB)#,                                        00190000
         PENABLE   =ASMB(PSEB)#,                                        00192000
         DISABLE   =ASMB(SED 0)#,                                       00194000
         ENABLE    =ASMB(SED 1)#,                                       00196000
         TRAPSOFF  =PUSH(STATUS);TOS.(2:1) := 0; SET(STATUS)#,          00198000
         PIX       =(F(CPCB)-F(PCBB))#,                                 00200000
         PIN       =(PIX/PCBSIZE)#,                                     00202000
         PSM1      =INTEGER(VMPAGESIZE-1)#,                             00204000
         SECTOR    =(VMPAGESIZE/128)#,                                  00206000
         LMEM      =ASMB(LSEA)#,                                        00208000
         SMEM      =ASMB(SSEA)#,                                        00210000
         LMEMD     =ASMB(LDEA)#,                                        00212000
         SMEMD     =ASMB(SDEA)#,                                        00214000
         MFDSEG    =ASMB(MFDS 4)#,                                      00216000
         MTDSEG    =ASMB(MTDS 4)#,                                      00218000
         CCFLD     =( 6: 2)#,                                           00220000
         ABIT      =( 0: 1)#,          <<ABSENCE BIT>>                  00222000
         RBIT      =( 2: 1)#,          <<REFERENCE BIT>>                00224000
         INDEXFLD  =( 3:13)#,          <<SEGMENT INDEX FIELD>>          00226000
         DSFLD     =( 3:13)#,          <<DATA SEG SIZE FIELD>>          00228000
         CSFLD     =( 4:12)#,          <<CODE SEG SIZE FIELD>>          00230000
         PRIVF     =( 0: 1)#,          <<PRIV MODE BIT>>                00232000
         SHARF     =( 1: 1)#,          <<SHARED SEG BIT>>               00234000
         DSEGF     =( 6:10)#,          <<DSEG FIELD>>                   00236000
         NPFLD     =(8:8)#,  <<# VM PAGES ALLOCATED>>                   00238000
         DFC       =F(DFC')#,                                           00240000
         DFS       =F(DFS')#,                                           00242000
         ICS'GLOBAL'Z = F(F(QI)-8)#,                                    00244000
         WSIZE     =( 8: 8)#;                                           00246000
                                                                        00248000
                                                                        00250000
$INCLUDE INCLMEAS                                                       00252000
                                                                        00254000
$INCLUDE INCLMIFT                                              <<04110>>00256000
<<ICS GLOBALS>>                                                         00258000
                                                                        00260000
EQUATE ICSCURRACTPRICELL=20,                                            00262000
       ICSPDISABLECNTCELL=18,                                           00264000
       ICSSTKDSTCELL=16,                                                00266000
       ICSSTKBANKCELL=5,                                                00268000
       ICSSTKBASECELL=9,                                       <<01813>>00270000
       ICSSTKDBCELL=4;                                                  00272000
                                                                        00274000
<<STANDARD SYSTEM TABLES ENTRY ALLOCATION  >>                           00276000
                                                                        00278000
INTEGER ARRAY SYSTABENTRY00(*)=DB+0,                                    00280000
              SYSTABENTRY01(*)=DB+1,                                    00282000
              SYSTABENTRY02(*)=DB+2,                                    00284000
              SYSTABENTRY03(*)=DB+3,                                    00286000
              SYSTABENTRY04(*)=DB+4;                                    00288000
                                                                        00290000
DEFINE ENTRYWORD00=SYSTABENTRY00(X)#,                                   00292000
       ENTRYWORD01=SYSTABENTRY01(X)#,                                   00294000
       ENTRYWORD02=SYSTABENTRY02(X)#,                                   00296000
       ENTRYWORD03=SYSTABENTRY03(X)#,                                   00298000
       ENTRYWORD04=SYSTABENTRY04(X)#;                                   00300000
                                                                        00302000
INTEGER ARRAY SYSTABFREECOUNT(*)=DB+2,                                  00304000
              SYSTABCONFCOUNT(*)=DB+0,                                  00306000
              SYSTABFREEHEAD(*)=DB+3,                                   00308000
              SYSTABSIZE(*)=DB+1,                                       00310000
              SYSTABFREEWORD(*)=DB+0,                                   00312000
              SYSTABNEXT(*)=DB+1;                                       00314000
                                                                        00316000
DEFINE SYSTABFREECNT=SYSTABFREECOUNT(X)#,                               00318000
       SYSTABENTRYSIZE=SYSTABSIZE(X)#,                                  00320000
       SYSTABENTRYCOUNT=SYSTABCONFCOUNT(X)#,                            00322000
       SYSTABFIRSTFREEINX=SYSTABFREEHEAD(X)#,                           00324000
       SYSTABFREEINDICATOR=SYSTABFREEWORD(X)#,                          00326000
       SYSTABENTRYNEXTINX=SYSTABNEXT(X)#;                               00328000
                                                                        00330000
$INCLUDE INCLST                                                         00332000
$INCLUDE INCLSLL                                                        00334000
$INCLUDE INCLPCB                                                        00336000
                                                                        00338000
                                                                        00340000
<<SEGMENT IDENTIFIER FORMAT>>                                           00342000
                                                                        00344000
EQUATE SEGIDDATATYPE=0,                                                 00346000
       SEGIDSLTYPE=1;  <<PROGRAM TYPE =2 OR 3>>                         00348000
DEFINE SEGIDTYPEFIELD=(0:2)#,                                           00350000
       SEGIDPBXFLAG=(0:1)#,                                             00352000
       SEGIDPBXFIELD=(1:7)#,                                            00354000
       SEGIDLOGSEGFIELD=(8:8)#;                                         00356000
                                                                        00358000
                                                                        00360000
                                                                        00362000
INTEGER ARRAY MEM(*)=DB+0;                                              00364000
                                                                        00366000
$INCLUDE INCLMSG                                                        00368000
                                                                        00370000
                                                               <<04662>>00372000
<< THE FOLLOWING DEFINES ARE USED TO SUPPORT PRIVILEGED    >>  <<04662>>00374000
<< MODE BOUNDS CHECKING. GET'XDSEG'LIMITS TRANSFERS THE    >>  <<04662>>00376000
<< BANK, BASE ADDRESS, AND LIMIT ADDRESS TO ICS QI MINUS   >>  <<04662>>00378000
<< AREA. THE INDEX REGISTER IS EXPECTED TO BE POINTING TO  >>  <<04662>>00380000
<< DST ENTRY, WORD 0.                                      >>  <<04662>>00382000
                                                               <<04662>>00384000
DEFINE  GET'XDSEG'LIMITS=                                      <<04662>>00386000
                                                               <<04662>>00388000
  BEGIN                                                        <<04662>>00390000
  TOS:= X;                    << SAVE INDEX REG >>             <<04662>>00392000
  TOS:= DST(X:= X+2);         << GET XDSEG BANK NUM >>         <<04662>>00394000
  TOS:= DST(X:= X+1);         << GET XDSEG BASE ADDR >>        <<04662>>00396000
  ASMB(DUP);                  << COPY XDSEG BASE ADDR >>       <<04662>>00398000
  TOS:= (DST(X:= X-3).(3:13) & LSL(2)) + TOS;                  <<04662>>00400000
  ICS(- ICS'XDSEGLIMCELL):= TOS;    << ICS GETS XDSEG LIMT >>  <<04662>>00402000
  ICS(- ICS'XDSEGBASECELL):= TOS;   << ICS GETS XDSEG BASE >>  <<04662>>00404000
  ICS(- ICS'XDSEGBNKCELL):= TOS;    << ICS GETS XDSEG BANK >>  <<04662>>00406000
  X:= TOS;                          << RESTORE INDEX REG. >>   <<04662>>00408000
  END#;                                                        <<04662>>00410000
                                                               <<04662>>00412000
DEFINE XFER'XDSEG'LIMITS=                                      <<04662>>00414000
                                                               <<04662>>00416000
  TOS:= 2;                                                     <<04662>>00418000
  ASMB(SBL)#;                                                  <<04662>>00420000
                                                               <<04662>>00422000
DEFINE   CPUNUM= ASMB(PCN)#,         << GET CPU NUMBER >>      <<04662>>00424000
         SBL   = CON %20104, %12#;                             <<04662>>00426000
                                                               <<04662>>00428000
EQUATE SERIES64    = 4,                                        <<04662>>00430000
       ICS'XDSEGLIMCELL = 29,                                  <<04662>>00432000
       ICS'XDSEGBASECELL  = 30,                                <<04662>>00434000
       ICS'XDSEGBNKCELL  = 31;                                 <<04662>>00436000
<<PCBX>>                                                                00438000
                                                                        00440000
EQUATE PXGLOBSIZE=%10,  <<FOR ACCESS THRU EXTENDED ADDRESSING>>         00442000
       SBTOSTKDBDISP=1,                                                 00444000
       SBTODBRELSDISP=PXGLOBSIZE+1,                                     00446000
       SBTODBRELZDISP=PXGLOBSIZE+2,                                     00448000
       SBTOINITQDISP=PXGLOBSIZE+3,                                      00450000
       SBTODBRELDLDISP=PXGLOBSIZE+4,                                    00452000
       SBTOMAXDATADISP=PXGLOBSIZE+%15,                                  00454000
       SBTOSTKDLDISP=0,                                                 00456000
       STKDLTOSBDISP=0,                                                 00458000
       STKDLTOPXFIXEDDISP=8,                                            00460000
       STKDBTOSTKDLDISP=-1,                                             00462000
       STKDLTOSTKDBDISP=1,                                              00464000
       SBTOTSSWAPINDISP=PXGLOBSIZE+%54,                                 00466000
       SBTOTSLADISP=PXGLOBSIZE+%55,                                     00468000
       SBTOTSLDDISP=PXGLOBSIZE+%56;                                     00470000
                                                                        00472000
EQUATE TSLRTOTSTBDISP=1,                                                00474000
       TSLRTOQCNTDISP=5,                                                00476000
       STKDBTODBRELDLDISP=%13,                                          00478000
       STKDBTOSBDISP=-1,                                                00480000
       DBRELDLTODBRELZDISP=-2,DBRELDLTOSTKDLDISP=-12,                   00482000
       DBRELZTODBRELSDISP=-1,                                           00484000
       PROCTIMETOJCIDISP=-%31,                                          00486000
       JCITOFROLSDISP=%40,                                              00488000
       JCITOTSSWAPINDISP=%55,                                           00490000
       FROLSTOJCIDISP=-%40,                                             00492000
       JCITOSBDISP=-%7,                                                 00494000
       TSLDTOTSLADISP=-1,                                               00496000
       TSLSWAPINTOTSLRDISP=-2,                                          00498000
       JCITOJROLSDISP=%40,                                              00500000
       TSLRTOQCNTDISIP=5,                                               00502000
       TSTBTOQCNTDISP=4,                                                00504000
       TSLATOTSLDDISP=1;                                                00506000
DEFINE                                                         <<03044>>00508000
   PXCONTROLYLABEL= Q0ARRAY(PCBXLOC+18)#,                      <<03044>>00510000
   PXDELAYCONTROLY= Q0ARRAY(PCBXLOC+60).(1:1)#,                <<03044>>00512000
   PXOLDSISTATE   = Q0ARRAY(PCBXLOC+60).(3:1)#,                <<03044>>00514000
   PXTIMEOUTRLX   = Q0ARRAY(PCBXLOC+61)#;                      <<03044>>00516000
                                                               <<03044>>00518000
DEFINE                                                         <<03044>>00520000
   PXFIXED  = PUSH(Q,DL); ASSEMBLE(XCH,SUB); <<CALCS Q+0 TO PCB<<03044>>00522000
              PCBXLOC:=TOS-Q0ARRAY(S0-2)#;   <<FIXED>>         <<03044>>00524000
                                                                        00526000
                                                                        00528000
<<MEMORY REGION HEADERS AND TRAILERS>>                                  00530000
                                                                        00532000
EQUATE RBTOPTSSDISP=-22,                                                00534000
       RBTOPTRASDISP=-21,                                               00536000
       RBTOPTRSDISP=-20,                                                00538000
       RBTORASDISP=-19,                                                 00540000
       RBTORSDISP=-18,                                                  00542000
       RBTOIOCNTDISP=-17,                                               00544000
       RBTOINITMSGDISP=-16,                                             00546000
       RBTOINITINFODISP=-15,                                            00548000
       RBTOPLDISP=-15,                                                  00550000
       RBTOCOMPMSGDISP=-14,                                             00552000
       RBTOMPDQLINKDISP=-13,                                            00554000
       RBTONLDISP=-13,                                                  00556000
       RBTORPAGECNTDISP=-12,                                            00558000
       RBTOSSDISP=-10,                                                  00560000
       RBTOSDDISP=-9,                                                   00562000
       RBTOWREQPDISP=-8,                                                00564000
       RBTOSEGIDENTDISP=-7,                                             00566000
       RBTOLKFZCNTDISP=-6,                                              00568000
       RBTOWDIOFZCNTDISP=-5,                                            00570000
       RBTOHODADISP=-4,                                                 00572000
       RBTOLODADISP=-3,                                                 00574000
       RBTODSKREQHEADPDISP=-2,                                          00576000
       RBTODSKREQTAILPDISP=-1,                                          00578000
       PTSSTORBDISP=22,                                                 00580000
       PTRASTORBDISP=21,                                                00582000
       PTRSTORBDISP=20,                                                 00584000
       RASTORBDISP=19,                                                  00586000
       RSTORBDISP=18,                                                   00588000
       IOCNTTORBDISP=17,                                                00590000
       INITMSGTORBDISP=16,                                              00592000
       INITINFOTORBDISP=15,                                             00594000
       PLTORBDISP=15,                                                   00596000
       COMPMSGTORBDISP=14,                                              00598000
       MPDQLINKTORBDISP=13,                                             00600000
       NLTORBDISP=13,                                                   00602000
       RPAGECNTTORBDISP=12,                                             00604000
       SSTORBDISP=10,                                                   00606000
       SSTORSDISP=-8,                                                   00608000
       RSTOSSDISP=8,                                                    00610000
       SDTORBDISP=9,                                                    00612000
       WREQPTORBDISP=8,                                                 00614000
       SEGIDENTTORBDISP=7,                                              00616000
       LKFZCNTTORBDISP=6,                                               00618000
       WDIOFZCNTTORBDISP=5,                                             00620000
       HODATORBDISP=4,                                                  00622000
       LODATORBDISP=3,                                                  00624000
       DSKREQHEADPTORBDISP=2,                                           00626000
       DSKREQTAILPTORBDISP=1,                                           00628000
       RASTORSDISP=1,                                                   00630000
       RASTOIOCNTDISP=2,                                                00632000
       RASTOINITMSGDISP=3,                                              00634000
       RASTOINITINFODISP=4,                                             00636000
       RASTOCOMPMSGDISP=5,                                              00638000
       RASTOMPDQLINKDISP=6,                                             00640000
       RASTORPAGECNTDISP=7,                                             00642000
       RASTOSSDISP=9,                                                   00644000
       RASTOSDDISP=10,                                                  00646000
       RASTOWREQPDISP=11,                                               00648000
       RASTOSEGIDENTDISP=12,                                            00650000
       RASTOLKFZCNTDISP=13,                                             00652000
       RASTOWDIOFZCNTDISP=14,                                           00654000
       RASTOHODADISP=15,                                                00656000
       RASTOLODADISP=16,                                                00658000
       RASTODSKREQHEADPDISP=17,                                         00660000
       RASTODSKREQTAILPDISP=18,                                         00662000
       RSTORASDISP=-1,                                                  00664000
       IOCNTTORASDISP=-2,                                               00666000
       INITMSGTORASDISP=-3,                                             00668000
       INITINFOTORASDISP=-4,                                            00670000
       COMPMSGTORASDISP=-5,                                             00672000
       MPDQLINKTORASDISP=-6,                                            00674000
       RPAGECNTTORASDISP=-7,                                            00676000
       SSTORASDISP=-9,                                                  00678000
       SDTORASDISP=-10,                                                 00680000
       WREQPTORASDISP=-11,                                              00682000
       SEGIDENTTORASDISP=-12,                                           00684000
       LKFZCNTTORASDISP=-13,                                            00686000
       WDIOFZCNTTORASDISP=-14,                                          00688000
       HODATORASDISP=-15,                                               00690000
       LODATORASDISP=-16,                                               00692000
       DSKREQHEADPTORASDISP=-17,                                        00694000
       DSKREQTAILPTORASDISP=-18,                                        00696000
       DSKREQHEADPTOWDIOFZCNTDISP=-3,                                   00698000
       WDIOFZCNTTODSKREQHEADP=3,                                        00700000
       WDIOFZCNTTOLKFZCNTDISP=-1,                                       00702000
       COMPMSGTOWDIOFZCNTDISP=9,                                        00704000
       HODATOCOMPMSGDISP=-10,                                           00706000
       HODATOSEGIDENTDISP=-3,                                           00708000
       HODATOWREQPDISP=-4,                                              00710000
       PTRASTORSDISP=3,                                                 00712000
       PTSSTORSDISP=4,                                                  00714000
       RSTOPTSSDISP=-4,                                                 00716000
       RSTOPTRASDISP=-3,                                                00718000
       TRASTOTRSDISP=1,                                                 00720000
       TRASTOTSSDISP=-1,                                                00722000
       TRSTOTRASDISP=-1,                                                00724000
       TSSTORSDISP=2,                                                   00726000
       TRSTOTSSDISP=-2,                                                 00728000
       TSSTOTRASDISP=1,                                                 00730000
       RASTOPTRASDISP=-2,                                               00732000
       PTRASTORASDISP=2,                                                00734000
       RASTOPTSSDISP=-3,                                                00736000
       PTSSTORASDISP=3,                                                 00738000
       PLTONLDISP=2,                                                    00740000
       NLTOPLDISP=-2,                                                   00742000
       RSTOPTRSDISP=-2,                                                 00744000
       PTRSTORSDISP=2,                                                  00746000
       SEGIDENTTOPTRSDISP=-13,SEGIDENTTOPTRASDISP=-14,                  00748000
       SEGIDENTTOINITMSGDISP=-9,                                        00750000
       SEGIDENTTOINITINFODISP=-8,                                       00752000
       MPDQLINKTOCOMPMSGDISP=-1,                                        00754000
       COMPMSGTOINITINFODISP=-1,                                        00756000
       INITMSGTOCOMPMSGDISP=2,                                          00758000
       COMPMSGTOINITMSGDISP=-2,                                         00760000
       INITMSGTOINITINFODISP=1,                                         00762000
       INITMSGTORPAGECNTDISP=4,                                         00764000
       INITMSGTOMPDQLINKDISP=3,                                         00766000
       INITMSGTOWREQPDISP=8,                                            00768000
       INITINFOTOSEGIDENTDISP=8,                                        00770000
       RPAGECNTTORSDISP=-6,                                             00772000
       WREQPTOSDDISP=-1,                                                00774000
       INITINFOTOHODADISP=11,                                           00776000
       SSTOSEGIDENTDISP=3,                                              00778000
       SSTOSDDISP=1,                                                    00780000
       SDTOSSDISP=-1,                                                   00782000
       SDTOIOCNTDISP=-8,                                                00784000
       IOCNTTOINITMSGDISP=1,                                            00786000
       RSTOSEGIDENTDISP=11,                                             00788000
       NLTORBTORBDISP=13,                                               00790000
       PLTORBTORBDISP=15,                                               00792000
       RASTOPTRSDISP=-1,                                                00794000
       PTRSTORASDISP=1;                                                 00796000
                                                                        00798000
DEFINE REGASSIGNEDFLAG=(0:1)#,                                          00800000
       REGRESERVEDFLAG=(1:1)#,                                          00802000
       REGAVAILABLEFLAG=(2:1)#,                                         00804000
       REGCLEAREDFLAG=(3:1)#,  SIZECHANGEPNDGFLAG=(4:1)#,               00806000
       REGLKDFLAG=(5:1)#,                                               00808000
       BLKDLKMIGIPFLAG=(15:1)#,                                         00810000
       REGFZFLAG=(6:1)#,                                                00812000
       REGIOFZFLAG=(7:1)#,                                              00814000
       INITMSGTOGGLESWITCH=(0:1)#,                                      00816000
       MSGEXTDISABLEDFLAG=(1:1)#,                                       00818000
       MSGONGOINGIODISABLED=(2:1)#,                                     00820000
       QUEUEREADREQFLAG=(3:1)#,                                         00822000
       INCMOVEREQFLAG=(4:1)#,                                           00824000
       EXPREQFLAG=(5:1)#,                                               00826000
       GARBCOLLFLAG=(6:1)#,                                             00828000
       UPDDISCCOPYFLAG=(7:1)#,                                          00830000
       COMPMSGTOGGLESWITCH=(0:1)#,                                      00832000
       COMPMSGMOVEFLAG=(1:1)#,                                          00834000
       COMPMSGBLKDLKFLAG=(2:1)#,                                        00836000
       COMPMSGIOWAKEFLAG=(4:1)#,                                        00838000
       COMPMSGLDEVFIELD=(8:8)#,                                         00840000
       MSGVALIDYETFLAG=(15:1)#,                                         00842000
       MSGGARBCOLLFLAG=(6:1)#,                                          00844000
       INITMSGABORTEDFLAG=(6:1)#,                                       00846000
       COMPMSGABORTEDFLAG=(5:1)#,                                       00848000
       FZCNTFIELD=(0:8)#,                                               00850000
       LKCNTFIELD=(8:8)#,                                               00852000
       SDVALIDFLAG=(0:1)#,                                              00854000
       IOFZCNTFIELD=(8:8)#,                                             00856000
       WRITDCNTFIELD=(0:8)#;                                            00858000
                                                                        00860000
EQUATE REGIOFZBIT=7,                                                    00862000
       REGLKDBIT=5,                                                     00864000
       REGFZBIT=6,                                                      00866000
       MSGVALIDBIT=15,                                                  00868000
       INITMSGTOGGLEBIT=0,                                              00870000
       COMPMSGTOGGLEBIT=0,                                              00872000
       COMPMSGIOWAKEBIT=4,                                              00874000
       SDVALIDBIT=0,                                                    00876000
       MSGGARBCOLLBIT=6;                                                00878000
                                                                        00880000
EQUATE COMPLETEDFLAG=6,                                                 00882000
       CURRENTFLAG=10;                                                  00884000
                                                                        00886000
EQUATE REGAVAILABLECODE=%20000,                                         00888000
       REGRESERVEDCODE=%40000,                                          00890000
       REGASSIGNEDCODE=%100000,                                         00892000
       LASTTRASADDR=%177776;                                            00894000
                                                                        00896000
                                                                        00898000
<<MISC>>                                                                00900000
                                                                        00902000
EQUATE PAGEPOWER=7,                                                     00904000
       MMPAGESIZE=128,                                                  00906000
       HEADERLENGTH=19,                                                 00908000
       TRAILERLENGTH=4,                                                 00910000
       OVERHEAD=HEADERLENGTH+TRAILERLENGTH,                             00912000
       MAXHOLESIZE=512,                                                 00914000
       ARSBMLENGTH=MAXHOLESIZE/16+1,                                    00916000
       ARLDLENGTH=MAXHOLESIZE*2+2,                                      00918000
       SIRTABENTRYLENGTH=2,                                             00920000
       CSTXBMWRDCNT=4,                                                  00922000
       BLOCKED=1,                                              <<01558>>00924000
       ZEROFILL=5;                                             <<01558>>00926000
                                                                        00928000
<<SCHEDULER MESSAGE PORT ASSIGNMENTS>>                                  00930000
                                                                        00932000
EQUATE SYSBASE=%1000;                                                   00934000
EQUATE MEMORYWAITCODE=%10000,                                           00936000
       MEMTRAP=%4000;                                                   00938000
                                                                        00940000
PROCEDURE ABORT(P1,P2,P3);                                              00942000
   VALUE      P1,P2,P3;                                                 00944000
   INTEGER    P1,P2,P3;                                                 00946000
   OPTION     EXTERNAL;                                                 00948000
PROCEDURE AWAKE(PINX,N1,N2);                                            00950000
   VALUE      PINX,N1,N2;                                               00952000
   INTEGER    PINX,N1,N2;                                               00954000
   OPTION     EXTERNAL;                                                 00956000
PROCEDURE DELAY(DTIME);                                                 00958000
   VALUE      DTIME;                                                    00960000
   DOUBLE     DTIME;                                                    00962000
   OPTION     EXTERNAL;                                                 00964000
PROCEDURE ERRORON;                                                      00966000
   OPTION     EXTERNAL;                                                 00968000
PROCEDURE ERROREXIT(ENUM,N1,N2);                                        00970000
   VALUE      ENUM,N1,N2;                                               00972000
   INTEGER    ENUM,N1,N2;                                               00974000
   OPTION     EXTERNAL;                                                 00976000
DOUBLE PROCEDURE CHEK(INT,FL,PARM,CAPM,OVM);                            00978000
   VALUE      INT,FL,PARM,CAPM,OVM;                                     00980000
   LOGICAL    INT,FL,OVM;                                               00982000
   DOUBLE     PARM,CAPM;                                                00984000
   OPTION     EXTERNAL,VARIABLE;                                        00986000
PROCEDURE IMPEDE(PINX);                                                 00988000
   VALUE      PINX;                                                     00990000
   INTEGER    PINX;                                                     00992000
   OPTION     EXTERNAL;                                                 00994000
PROCEDURE UNIMPEDE(PINX);                                               00996000
   VALUE      PINX;                                                     00998000
   INTEGER    PINX;                                                     01000000
   OPTION     EXTERNAL;                                                 01002000
PROCEDURE AWAKEIO(DIT,MASK);                                            01004000
   VALUE      DIT,MASK;                                                 01006000
   INTEGER    POINTER DIT;                                              01008000
   INTEGER    MASK;                                                     01010000
   OPTION     EXTERNAL;                                                 01012000
PROCEDURE HANG(INTRINEXIT,CODECLASS,PARAM);                             01014000
   VALUE      INTRINEXIT,CODECLASS,PARAM;                               01016000
   INTEGER    INTRINEXIT,CODECLASS,PARAM;                               01018000
   OPTION     EXTERNAL;                                                 01020000
INTEGER PROCEDURE XJDT(FUNC,ID,DSTX);                                   01022000
   VALUE      FUNC,ID,DSTX;                                             01024000
   INTEGER    FUNC,ID,DSTX;                                             01026000
   OPTION     EXTERNAL;                                                 01028000
LOGICAL PROCEDURE EXCHANGEDB(INX);                                      01030000
   VALUE      INX;                                                      01032000
   INTEGER    INX;                                                      01034000
   OPTION     EXTERNAL;                                                 01036000
LOGICAL PROCEDURE SETCRITICAL;                                          01038000
   OPTION     EXTERNAL;                                                 01040000
PROCEDURE RESETCRITICAL(CRIT);                                          01042000
   VALUE      CRIT;                                                     01044000
   INTEGER    CRIT;                                                     01046000
   OPTION     EXTERNAL;                                                 01048000
PROCEDURE HELP;                                                         01050000
   OPTION     EXTERNAL;                                                 01052000
PROCEDURE REQUCOP(X,Y,Z);                                               01054000
   VALUE      X,Y,Z;                                                    01056000
   INTEGER    X,Y,Z;                                                    01058000
   OPTION     EXTERNAL;                                                 01060000
PROCEDURE SUDDENDEATH(ENUM);                                            01062000
   VALUE      ENUM;                                                     01064000
   INTEGER    ENUM;                                                     01066000
   OPTION     EXTERNAL;                                                 01068000
                                                                        01070000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,  <<01558>>01072000
  FLAGS);                                                      <<01558>>01074000
VALUE LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                <<01558>>01076000
INTEGER LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;              <<01558>>01078000
OPTION EXTERNAL;                                               <<01558>>01080000
                                                                        01082000
                                                                        01084000
INTEGER PROCEDURE GETSYSTABENTRY(SYSTABINX);                            01086000
VALUE SYSTABINX;                                                        01088000
INTEGER SYSTABINX;                                                      01090000
OPTION EXTERNAL;                                                        01092000
                                                                        01094000
PROCEDURE RELSYSTABENTRY(SYSTABINX,ENTRYSYSBASEINX);                    01096000
VALUE SYSTABINX,ENTRYSYSBASEINX;                                        01098000
INTEGER SYSTABINX,ENTRYSYSBASEINX;                                      01100000
OPTION EXTERNAL;                                                        01102000
                                                                        01104000
PROCEDURE SENDMSG(DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS);                 01106000
VALUE DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS;                              01108000
INTEGER DESTPIN,DESTPORTNUM,MSGLENGTH;                                  01110000
LOGICAL FLAGS;                                                          01112000
OPTION EXTERNAL;                                                        01114000
                                                                        01116000
PROCEDURE PSEUDOINT;                                           <<03044>>01120000
OPTION EXTERNAL;                                               <<03044>>01122000
                                                               <<03044>>01124000
PROCEDURE RECEIVEMSG(PORTNUM,MSGLENGTH,FLAGS);                 <<03044>>01126000
VALUE PORTNUM,MSGLENGTH,FLAGS;                                 <<03044>>01128000
INTEGER PORTNUM,MSGLENGTH,FLAGS;                               <<03044>>01130000
OPTION EXTERNAL;                                               <<03044>>01132000
                                                               <<03044>>01134000
PROCEDURE ABORTTIMEREQ(TRLX);                                  <<03044>>01136000
VALUE TRLX;                                                    <<03044>>01138000
INTEGER TRLX;                                                  <<03044>>01140000
OPTION EXTERNAL;                                               <<03044>>01142000
                                                               <<03044>>01144000
LOGICAL PROCEDURE PORTSTATUS(PORTNUM);                         <<03044>>01146000
VALUE PORTNUM;                                                 <<03044>>01148000
INTEGER PORTNUM;                                               <<03044>>01150000
OPTION EXTERNAL;                                               <<03044>>01152000
                                                               <<03044>>01154000
                                                                        01156000
PROCEDURE DEQUEUEDISCREQ(REQP,DITP);                                    01158000
VALUE REQP,DITP;                                                        01160000
INTEGER REQP,DITP;                                                      01162000
OPTION EXTERNAL;                                                        01164000
                                                                        01166000
PROCEDURE ADJUSTLOCALITY(SLLINX,SEGIDENT,FLAGS);                        01168000
VALUE SLLINX,SEGIDENT,FLAGS;                                            01170000
LOGICAL SLLINX,SEGIDENT,FLAGS;                                          01172000
OPTION EXTERNAL;                                                        01174000
                                                                        01176000
PROCEDURE ADDTOLOCALITY(SLLINX,SEGIDENT,WHY);                           01178000
VALUE SLLINX,SEGIDENT,WHY;                                              01180000
INTEGER SLLINX,SEGIDENT,WHY;                                            01182000
OPTION EXTERNAL;                                                        01184000
                                                                        01186000
PROCEDURE WAIT(EVENTTYPE,SPECIALINFO);                                  01188000
VALUE EVENTTYPE,SPECIALINFO;                                            01190000
INTEGER EVENTTYPE,SPECIALINFO;                                          01192000
OPTION EXTERNAL;                                                        01194000
                                                                        01196000
PROCEDURE QUEUEONSEGMENT(SEGIDENT);                                     01198000
VALUE SEGIDENT;                                                         01200000
INTEGER SEGIDENT;                                                       01202000
OPTION EXTERNAL;                                                        01204000
                                                                        01206000
PROCEDURE UPDATEDISCCOPY(SEGIDENT);                                     01208000
VALUE SEGIDENT;                                                         01210000
INTEGER SEGIDENT;                                                       01212000
OPTION EXTERNAL;                                                        01214000
                                                                        01216000
PROCEDURE MMSTAT(P1,P2,P3,P4);                                          01218000
VALUE P1,P2,P3,P4;                                                      01220000
INTEGER P1,P2,P3,P4;                                                    01222000
OPTION EXTERNAL;                                                        01224000
                                                                        01226000
PROCEDURE GETDATASEGCHANGESTATE(SEGNUM);                                01228000
VALUE SEGNUM;                                                           01230000
INTEGER SEGNUM;                                                         01232000
OPTION EXTERNAL;                                                        01234000
                                                                        01236000
PROCEDURE GENSPECREQ(DSTNUM,NEWSIZE,READDISP,MOVELENGTH);               01238000
VALUE DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                               01240000
INTEGER DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                             01242000
OPTION EXTERNAL;                                                        01244000
                                                                        01246000
                                                                        01248000
INTEGER PROCEDURE REMOVESTOP(PROC,EN,PLOC,COND,PLABEL);        <<MM.IV>>01250000
VALUE PROC,EN,PLOC;                                                     01252000
INTEGER PROC,EN,PLOC,PLABEL;                                            01254000
INTEGER ARRAY COND;                                            <<MM.IV>>01256000
OPTION VARIABLE,EXTERNAL;                                               01258000
                                                                        01260000
                                                                        01262000
$INCLUDE INCLVMC                                                        01264000
                                                                        01266000
$PAGE " "                                                               01268000
COMMENT                                                                 01270000
                                                                        01272000
SETDBTOSTACK REPLACES THE CONTENTS OF THE DB REGISTER WITH              01274000
THE ABSOLUTE ADDRESS OF THE STACK BASE, AND RETURNS THE OLD             01276000
DB REGISTER CONTENTS                                                    01278000
                                                                        01280000
;                                                                       01282000
                                                                        01284000
                                                                        01286000
                                                                        01288000
DOUBLE PROCEDURE SETDBTOSTACK;                                          01290000
OPTION UNCALLABLE, PRIVILEGED, INTERNAL;                                01292000
                                                                        01294000
                                                                        01296000
BEGIN                                                                   01298000
                                                                        01300000
X:=ABSOLUTE(QI);  <<ICS' QI>>                                           01302000
TOS:=ABSOLUTE(X:=X-5);               <<STACK BANK>>                     01304000
TOS:=ABSOLUTE(X:=X+1);                <<STACK DB>>                      01306000
ASSEMBLE(XCHD);                                                         01308000
SETDBTOSTACK := TOS;                                                    01310000
END <<SETDBTOSTACK>> ;                                                  01312000
                                                                        01314000
PROCEDURE MMLOG(PXFIX,PCBI,N,INC);                                      01316000
   VALUE      PXFIX,PCBI,N,INC;                                         01318000
   INTEGER    POINTER PXFIX;                                            01320000
   INTEGER    PCBI,N,INC;                                               01322000
   OPTION     UNCALLABLE,PRIVILEGED;                                    01324000
   BEGIN                                                                01326000
     EQUATE   TVIRT     =27;                                            01328000
     DEFINE   SYSPROCESS=PCBL'(PCBI+9).(6:1)#;                          01330000
         IF SYSPROCESS THEN RETURN;    <<IGNORE>>                       01332000
         TOS _ PXFIX(TVIRT);           <<TOTAL VDS CURRENTLY ASSIGNED>> 01334000
         IF >= THEN                                                     01336000
          BEGIN                        <<SUM>>                          01338000
           TOS _ TOS+INC;                                               01340000
           IF < THEN                                                    01342000
            BEGIN                      <<OVERFLOW>>                     01344000
             DEL;                                                       01346000
             TOS _ -1;                                                  01348000
            END;                                                        01350000
          END;                                                          01352000
         PXFIX(X) _ TOS;               <<UPDATE>>                       01354000
         IF N > PXFIX(X_X-1) THEN                                       01356000
          PXFIX(X) _ N;                <<NEW MAX DATA SEG SIZE>>        01358000
   END <<MMLOG>> ;                                                      01360000
                                                                        01362000
COMMENT  ALLOCATE ONE ENTRY FROM THE TABLE(TYPE), WHERE                 01364000
         TYPE = CSTB     FROM CST TABLE (SL AREA ONLY)                  01366000
                DSTB     FROM DST TABLE                                 01368000
                PCBB     FROM PCB TABLE                                 01370000
                                                                        01372000
         RETURNS A VALUE > 0 IF SUCCESSFUL, OTHERWISE A                 01374000
         ZERO IS RETURNED.                                              01376000
         NOTE* THE ENTRY WILL BE ZEROED.                                01378000
         ;                                                              01380000
INTEGER PROCEDURE GETENTRY(TYPE);                                       01382000
VALUE      TYPE;                                                        01384000
INTEGER    TYPE;                                                        01386000
OPTION     UNCALLABLE,PRIVILEGED;                                       01388000
                                                                        01390000
BEGIN                                                                   01392000
                                                                        01394000
INTEGER ENTRYINDEX;                                                     01396000
PDISABLE;                                                               01398000
TOS:=%1000D;                                                            01400000
ASMB(XCHD);                                                             01402000
TOS:=GETSYSTABENTRY(ABSOLUTE(X:=%1000+TYPE));                           01404000
ASMB(TEST);                                                             01406000
IF = THEN GETENTRY:=TOS ELSE                                            01408000
   BEGIN <<AN ENTRY IS AVAILABLE>>                                      01410000
   ENTRYINDEX:=TOS-ABSOLUTE(X);                                         01412000
   TOS:=ABSOLUTE(X);                                                    01414000
   X:=TOS;<<SYSBASE INX OF TABLE>>                                      01416000
   GETENTRY:=ENTRYINDEX/SYSTABENTRYSIZE;                                01418000
   ENABLE;  <<LEFT US DISABLED>>                               <<01561>>01420000
   END;                                                                 01422000
ASMB(XCHD);                                                             01424000
PENABLE;                                                                01426000
END <<GETENTRY>> ;                                                      01428000
                                                                        01430000
                                                                        01432000
COMMENT  ALLOCATE N LOCATIONS IN THE TABLE(TYPE), WHERE                 01434000
       TYPE=CSTB   CST ENTRIES IN THE SL AREA\                          01436000
           =DSTB   DST ENTRIES\                                         01438000
           =PCBB   PCB ENTRIES\                                         01440000
                                                                        01442000
         CC=CCE    O.K.                                                 01444000
            CCG    N > CURRENT AVAILABLE NUMBER OF FREE ENTRIES         01446000
         NOTE*     ALLOCATED ENTRIES WILL BE ZEROED.                    01448000
         ;                                                              01450000
                                                                        01452000
PROCEDURE GETENTRYS(ITAB,N,TYPE);                                       01454000
VALUE      ITAB,N,TYPE;                                                 01456000
INTEGER    POINTER ITAB;                                                01458000
INTEGER    N,TYPE;                                                      01460000
OPTION     UNCALLABLE,PRIVILEGED;                                       01462000
BEGIN                                                                   01464000
                                                                        01466000
INTEGER  K:=-1,CC:=CCE;                                                 01468000
PDISABLE;                                                               01470000
IF ABSOLUTE(ABSOLUTE(TYPE+%1000)+%1002) >= N THEN                       01472000
   BEGIN                        <<OK TO ALLOCATE>>                      01474000
   WHILE (K:=K+1) < N DO                                                01476000
   ITAB(K) := GETENTRY(TYPE);                                           01478000
   END                                                                  01480000
ELSE CC:=CCG;                                                           01482000
STATUS.CCFLD := CC;                                                     01484000
PENABLE;                                                                01486000
END <<GETENTRYS>> ;                                                     01488000
                                                                        01490000
                                                                        01492000
COMMENT  RETURN ONE ENTRY TO THE TABLE(TYPE), WHERE                     01494000
         TYPE = CSTB INTO THE CST TABLE (SL AREA ONLY)                  01496000
                DSTB INTO DST TABLE                                     01498000
                PCBB INTO PCB TABLE                                     01500000
;                                                                       01502000
                                                                        01504000
PROCEDURE RETURNENTRY(TYPE,EN);                                         01506000
VALUE      TYPE,EN;                                                     01508000
INTEGER    TYPE,EN;                                                     01510000
OPTION     UNCALLABLE,PRIVILEGED;                                       01512000
BEGIN                                                                   01514000
                                                                        01516000
POINTER PCB = DB+3;                                            <<01909>>01518000
PDISABLE;                                                               01520000
TOS:=%1000D;                                                            01522000
ASMB(XCHD);                                                             01524000
TOS:=ABSOLUTE(%1000+TYPE);                                              01526000
ASSEMBLE(DUP); <<TABLE SYSBASEINX>>                                     01528000
X:=TOS+%1001;                                                           01530000
TOS:=ABSOLUTE(X)*EN; <<ENTRY TABLE INDEX>>                              01532000
<< IF ENTRY IN PCB, SET LAST WORD IN THE ENTRY TO -1 FOR >>    <<01909>>01534000
<< THE BENEFIT OF CHECKALIVE (KERNELC):                  >>    <<01909>>01536000
IF TYPE = PCBB THEN PCB(S0+PQPTRWORDNUM) := -1;                <<01909>>01538000
TOS:=ABSOLUTE(X:=%1000+TYPE);  <<ENTRY SYSBASEINX>>                     01540000
ASSEMBLE(ADD);                                                          01542000
RELSYSTABENTRY(*,*);                                                    01544000
ENABLE; <<LEFT US DISABLED>>                                   <<01561>>01546000
ASMB(XCHD);                                                             01548000
PENABLE;                                                                01550000
END <<RETURNENTRY>> ;                                                   01552000
                                                                        01554000
$PAGE "PROGRAM BLOCK ALLOCATION : ALCSTBLOCK"                           01556000
                                                                        01558000
COMMENT  THIS FUNCTION IS CALLED TO ALLOCATE A BLOCK OF N CONTI         01560000
         CST ENTRIES FROM THE CST EXTENSION BLOCK;                      01562000
                                                                        01564000
INTEGER PROCEDURE ALCSTBLOCK(N);                                        01566000
VALUE      N;                                                           01568000
INTEGER    N;                                                           01570000
OPTION     UNCALLABLE,PRIVILEGED;                                       01572000
                                                                        01574000
BEGIN                                                                   01576000
INTEGER  EIX=ALCSTBLOCK,CSTX,MAX,CC:=CCE;                               01578000
PDISABLE;                                                               01580000
EIX := 0;                                                               01582000
MAX := CSTBLK'(0);     <<TABLE SIZE>>                          <<04150>>01584000
WHILE (EIX:=EIX+1) <= MAX DO                                   <<04150>>01586000
   IF CSTBLK'(EIX) = -1 THEN                                   <<04150>>01588000
   GOTO FOUNDL;             <<ALLOCATE ENTRY>>                 <<04150>>01590000
CC := CCL;         <<NO MORE ENTRIES>>                         <<04150>>01592000
GO QUIT;                                                       <<04150>>01594000
                                                               <<04150>>01596000
FOUNDL:                                                        <<04150>>01598000
                                                               <<04150>>01600000
X := (CSTX:=DFS)+2;                                                     01602000
IF (N:=N+1) > DST(X) THEN                                      <<01636>>01604000
   BEGIN                        <<INSUFFICIENT ENTRIES>>                01606000
   CC := CCL;                                                           01608000
   GO QUIT;                                                             01610000
   END;                                                                 01612000
DSTI'(X) := DSTI'(X)-N;        <<DEC FREE COUNT>>                       01614000
CSTX := CSTX+DSTI'(X:=X+1);     <<INDEX TO NEXT FREE>>                  01616000
DSTI'(X) := DSTI'(X)+N&LSL(2); <<NEW NEXT FREE>>                        01618000
CSTBLK'(EIX) := CSTX;      <<SAVE INDEX>>                      <<04150>>01622000
<<ZERO OUT THE BITMAP>>                                                 01624000
DSTI'(CSTX):=(N:=N-1);                                         <<01636>>01626000
DSTI'(X:=X+1) := %125252;       <<CHECK WORD>>                          01628000
DSTI'(X:=X+1) := 0;             <<# SHARING BLOCK>>                     01630000
DSTI'(X:=X+1) := 0;                                                     01632000
WHILE (N:=N-1) >= 0 DO                                                  01634000
   BEGIN                        <<CLEAR ENTRIES>>                       01636000
   DSTI'(X:=X+1) := %100000;                                            01638000
   DSTI'(X:=X+1) := 0;                                                  01640000
   DSTI'(X:=X+1) := 0;                                                  01642000
   DSTI'(X:=X+1) := 0;                                                  01644000
   END;                                                                 01646000
MMSTAT(-20,EIX,CSTX,N);                                                 01648000
QUIT   : STATUS.CCFLD := CC;                                            01650000
PENABLE;                                                                01652000
END <<ALCSTBLOCK>> ;                                                    01654000
                                                                        01656000
$PAGE "PROGRAM BLOCK ALLOCATION : DEALCSTBLOCK"                         01658000
                                                                        01660000
PROCEDURE DEALCSTBLOCK(EIX);                                            01662000
VALUE      EIX;                                                         01664000
INTEGER    EIX;                                                         01666000
OPTION     UNCALLABLE,PRIVILEGED;                                       01668000
                                                                        01670000
BEGIN                                                                   01672000
INTEGER  CSTX,MAX,MCNT,N,M,I,K,LCSW,CC:=CCE;                            01674000
INTEGER SEGIDENT;                                                       01676000
TRAPSOFF;                                                               01678000
DISABLE;                                                                01680000
CSTX := CSTBLK'(EIX);                                                   01682000
IF DSTI'(CSTX+1) <> %125252 THEN                                        01684000
   BEGIN                        <<INVALID BLOCK INDEX>>                 01686000
   CC := CCL;                                                           01688000
   GO QUIT;                                                             01690000
   END;                                                                 01692000
N := DSTI'(X:=X-1)+1;           <<NUMBER TO RETURN>>                    01694000
I := 0; M := CSTX+4;                                                    01696000
<<CHECK AND RETURN MEMORY IF NECESSARY>>                                01698000
WHILE (I:=I+1) < N DO                                                   01700000
   BEGIN                                                                01702000
   ENABLE;                                                              01704000
   DISABLE;                                                             01706000
                                                               <<01558>>01708000
   CHECKAGAIN:                                                 <<01558>>01710000
                                                               <<01558>>01712000
   CSTX:=CSTBLK'(EIX); <<MAY HAVE CHANGED>>                    <<01558>>01714000
   TOS:=(M-CSTX)&LSR(2);                                                01716000
   TOS.SEGIDPBXFIELD:=EIX;                                              01718000
   TOS.SEGIDPBXFLAG:=1;                                                 01720000
   SEGIDENT:=TOS;                                                       01722000
   IF DSTI'(M) < 0 THEN                                                 01724000
      BEGIN <<SEGMENT IS ABSENT>>                                       01726000
      X:=X+1;                                                           01728000
      IF LOGICAL(DSTI'(X)).IMIFLAG OR                                   01730000
      LOGICAL(DSTI'(X)).ROCFLAG THEN                                    01732000
         BEGIN <<DAMN THING IS COMING IN>>                              01734000
         QUEUEONSEGMENT(SEGIDENT);                                      01736000
         GO CHECKAGAIN;                                        <<01558>>01738000
         END;                                                           01740000
      END                                                               01742000
   ELSE                                                                 01744000
      BEGIN <<SEG IS PRESENT>>                                          01746000
      DSTI'(X:=M):=%100000;                                             01748000
      TOS:=DSTI'(X:=X+2);                                               01750000
      TOS:=DSTI'(X:=X+1);                                               01752000
      TOS:=TOS+RBTOSEGIDENTDISP;                                        01754000
      ASMB(LSEA);                                                       01756000
      SEGIDENT:=TOS;                                                    01758000
      TOS:=0;                                                           01760000
      ASMB(SSEA);                                                       01762000
      TOS:=TOS+SEGIDENTTORBDISP;                                        01764000
      SENDMSG(SCHEDPIN,RELREGREQPORT,2,0);                              01766000
      END;                                                              01768000
   M := M+4;                                                            01770000
   END;                                                                 01772000
CSTBLK'(EIX):=-1;                                                       01774000
DSTI'(CSTX):=%100000;                                                   01776000
X := DFS+2;                                                             01778000
DSTI'(X) := DSTI'(X)+N;        <<INC FREE COUNT>>                       01780000
TOS := DSTI'(X:=X+1);           <<INDEX TO NEXT FREE>>                  01782000
DSTI'(X) := DSTI'(X)-(N:=N&LSL(2));     <<NEW INDEX>>                   01784000
IF (MCNT:=TOS+DFS-(CSTX+N)) = 0 THEN                                    01786000
GOTO SKIPL;                  <<MOVE COUNT = 0>>                         01788000
TOS := 0;                                                               01790000
TOS := ABSOLUTE(DSTB)+CSTX;           <<DESTINATION ADDRESS>>           01792000
ASMB(DDUP);                                                             01794000
TOS := TOS+N;                  <<SOURCE ADDRESS>>                       01796000
TOS := MCNT;                   <<COUNT>>                                01798000
ASMB(MABS 5);                 <<MOVE ABSOLUTE>>                         01800000
SKIPL  : MMSTAT(-21,EIX,CSTX,MCNT);                                     01802000
EIX := 0;                                                               01804000
MAX := CSTBLK'(0);             <<TABLE SIZE>>                           01806000
WHILE (EIX:=EIX+1) <= MAX DO                                            01808000
IF CSTBLK'(EIX) > CSTX THEN                                             01810000
CSTBLK'(X) := CSTBLK'(X)-N;  <<ADJUST INDEX>>                           01812000
QUIT   : STATUS.CCFLD := CC;                                            01814000
END <<DEALCSTBLOCK>> ;                                                  01816000
                                                                        01818000
$PAGE "PROGRAM BLOCK ALLOCATION : PUTCSTBLOCK"                          01820000
                                                                        01822000
COMMENT  THIS PROCEDURE IS CALLED TO INITIALIZE A CST EXTENSION         01824000
         ENTRY.                                                         01826000
         ;                                                              01828000
                                                                        01830000
PROCEDURE PUTCSTBLOCK(EIX,LSEGNUM,SIZE,LDEV,DISKADR,SYSFLAG);  <<03775>>01832000
VALUE      EIX,LSEGNUM,SIZE,LDEV,DISKADR,SYSFLAG;              <<03775>>01834000
INTEGER    EIX,LSEGNUM,SIZE,LDEV;                                       01836000
DOUBLE     DISKADR;                                                     01838000
LOGICAL    SYSFLAG;                                            <<03775>>01840000
OPTION     UNCALLABLE,PRIVILEGED;                                       01842000
                                                                        01844000
                                                                        01846000
BEGIN                                                                   01848000
DEFINE HODISKADR=(8:8)#;                                       <<03775>>01850000
INTEGER  CSTX,CC:=CCE,HODA=DISKADR,LODA=HODA+1;                         01852000
PDISABLE;                                                               01854000
CSTX := CSTBLK'(EIX);          <<CST BLOCK INDEX>>                      01856000
IF CSTX=-1 THEN                                                         01858000
   BEGIN                                                                01860000
   CC:=CCL;                                                             01862000
   GO QUIT;                                                             01864000
   END;                                                                 01866000
IF (LSEGNUM<0) OR (LSEGNUM>=DSTI'(CSTX)) THEN                           01868000
   BEGIN                        <<OUT OF RANGE>>                        01870000
   CC := CCG;                                                           01872000
   GO QUIT;                                                             01874000
   END;                                                                 01876000
IF DSTI'(X:=X+1) <> %125252 THEN                                        01878000
   BEGIN                        <<INVALID CST BLOCK>>                   01880000
   CC := CCL;                                                           01882000
   GO QUIT;                                                             01884000
   END;                                                                 01886000
X := CSTX+LSEGNUM&LSL(2)+4;    <<ACTUAL INDEX>>                         01888000
TOS := SIZE;                                                            01890000
TOS.ABIT := 1;                 <<MARK ABSENT>>                          01892000
DSTI'(X) := TOS;               <<STORE DESC>>                           01894000
TOS:=0;                                                                 01896000
IF SYSFLAG THEN TOS.SYSTEMFLAG := 1;                           <<03775>>01898000
DSTI'(X:=X+1):=TOS;                                                     01900000
DSTI'(X:=X+1):=LDEV&LSL(8)+HODA.HODISKADR;                     <<03775>>01904000
DSTI'(X:=X+1) := LODA;                                                  01906000
                                                                        01908000
QUIT:                                                                   01910000
                                                                        01912000
STATUS.CCFLD := CC;                                                     01914000
PENABLE;                                                                01916000
END <<PUTCSTBLOCK>> ;                                                   01918000
                                                                        01920000
$PAGE "DATA SEGMENT ALLOCATION : RELDATASEG"                            01922000
                                                                        01924000
                                                                        01926000
COMMENT  THIS FUNCTION IS CALLED TO RETURN RESOURCES FOR                01928000
         A STACK OR EXTRA DATA SEGMENT;                                 01930000
                                                                        01932000
PROCEDURE RELDATASEG(EN);                                               01934000
VALUE      EN;                                                          01936000
INTEGER    EN;                                                          01938000
OPTION     UNCALLABLE,PRIVILEGED;                                       01940000
                                                                        01942000
BEGIN                                                                   01944000
INTEGER  K,LCSW,TYPE:=DSTB;                                             01946000
INTEGER SEGIDENT,DESCSTINX;                                             01948000
LOGICAL IT'SASTACK,SEGPRESENT:=TRUE;                                    01950000
ENTRY    RELCODESEG;                                                    01952000
DESCSTINX:=EN&LSL(2);                                                   01954000
IF LOGICAL(DST(DESCSTINX+1)).STKFLAG                                    01956000
THEN IT'SASTACK:=TRUE                                                   01958000
ELSE IT'SASTACK:=FALSE;                                                 01960000
IF EN <= 60 THEN SUDDENDEATH(124);<<TRYING TO REL SYS DST>>             01962000
GO START;                                                               01964000
RELCODESEG:                                                             01966000
REMOVESTOP(%100000,EN,-1);    <<SYS B.P.>>                     <<MM.IV>>01968000
REMOVESTOP(-1,EN,-1);         <<USER B.P.>>                             01970000
IT'SASTACK:=FALSE;                                                      01972000
DESCSTINX := EN&LSL(2)+DFC;                                             01974000
TYPE := CSTB;                                                           01976000
START  : PDISABLE;                                                      01978000
DISABLE;                                                                01980000
TOS:=EN;                                                                01982000
IF TYPE <> DSTB THEN TOS.SEGIDTYPEFIELD:=SEGIDSLTYPE;                   01984000
SEGIDENT:=TOS;                                                          01986000
TRAPSOFF;                                                               01988000
                                                               <<01558>>01990000
CHECKAGAIN:                                                    <<01558>>01992000
                                                               <<01558>>01994000
DSTI'(DESCSTINX).ABIT := 1;          <<MARK ABSENT>>                    01996000
IF <> THEN                                                              01998000
    BEGIN <<ABSENT>>                                                    02000000
    X:=X+1;                                                             02002000
    IF LOGICAL(DSTI'(X)).IMIFLAG OR                                     02004000
    LOGICAL(DSTI'(X)).FWIPFLAG <<PART OF CLEANED REGION>> OR   <<01561>>02006000
    LOGICAL(DSTI'(X)).ROCFLAG THEN                                      02008000
       BEGIN                                                            02010000
       QUEUEONSEGMENT(SEGIDENT);                                        02012000
       PDISABLE;                                                        02014000
      GO CHECKAGAIN;                                           <<01558>>02016000
       END                                                              02018000
    ELSE                                                                02020000
       BEGIN <<STAYS ABSENT>>                                           02022000
       SEGPRESENT:=FALSE;                                               02024000
       END;                                                             02026000
    END;                                                                02028000
IF SEGPRESENT THEN                                                      02030000
    BEGIN <<RELEASE MAIN MEMORY REGION>>                                02032000
    DSTI'(DESCSTINX).ABIT:=1;                                           02034000
    IF DST(X:=X+1).SEGRESIDENTFLAG=1 THEN SUDDENDEATH(630);    <<01636>>02036000
    TOS:=DSTI'(X:=X+1);                                                 02038000
    TOS:=DSTI'(X:=X+1);                                                 02040000
    TOS:=TOS+RBTORASDISP;                                               02042000
    ASSEMBLE(LSEA);                                                     02044000
    ASMB(TBC REGIOFZBIT);                                               02046000
    IF <> THEN SUDDENDEATH(631); <<REL I/O FZN SEG?>>          <<01636>>02048000
    ASMB(DEL);                                                          02050000
    TOS:=TOS+RASTOHODADISP;                                             02052000
    ASSEMBLE(LDEA);                                                     02054000
    DSTI'(X):=TOS;                                                      02056000
    DSTI'(X:=X-1):=TOS; <<PUT DISC ADDRESS IN DESCRIPTOR>>              02058000
    TOS:=TOS+HODATOSEGIDENTDISP;                                        02060000
    TOS:=0;                                                             02062000
    ASMB(SSEA); <<SO REGION WILL BE CLEANED PROPERLY>>                  02064000
    TOS:=TOS+SEGIDENTTORBDISP;                                          02066000
    SENDMSG(SCHEDPIN,RELREGREQPORT,2,0);                                02068000
    END;                                                                02070000
IF TYPE = DSTB THEN                                                     02074000
    BEGIN  <<RELEASE SWAP REGION>>                                      02076000
    RELEASESWAPREGION(EN);                                              02078000
   IF <> THEN SUDDENDEATH(632);                                <<01636>>02080000
    END;                                                                02082000
RETURNENTRY(TYPE,EN);         <<RETURN ENTRY>>                          02084000
PENABLE;                                                       <<04608>>02086000
MMSTAT(-23,EN,TYPE,0);                                                  02088000
IF ICS(-ICSPDISABLECNTCELL) > 0 THEN                           <<02092>>02090000
                                                               <<02092>>02092000
   COMMENT:  The purpose of the following code is to cover up  <<02092>>02094000
             a pdisable problem in which an interrupt handler  <<02092>>02096000
             appears to execute a pdisable without a           <<02092>>02098000
             corresponding penable.  This strange problem      <<02092>>02100000
             always appears to leave the pdisable count at 1.  <<02092>>02102000
             If this condition is met, we shall execute a      <<02092>>02104000
             penable on behalf of the defective software       <<02092>>02106000
             [a small prayer is in order here] and continue    <<02092>>02108000
             execution.  Otherwise we shall HALT the machine.  <<02092>>02110000
             Previously, the software crashed the machine      <<02092>>02112000
             with a SUDDENDEATH(634).  When this problem is    <<02092>>02114000
             corrected the SUDDENDEATH should be implemented;  <<02092>>02116000
                                                               <<02092>>02118000
   IF ICS(-ICSPDISABLECNTCELL) = 1 THEN                        <<02092>>02120000
      PENABLE   <<It's a miracle>>                             <<02092>>02122000
   ELSE                                                        <<02092>>02124000
      IF TRUE THEN                                             <<02092>>02126000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02092>>02128000
      ELSE                                                     <<02092>>02130000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02092>>02132000
END <<RELDATASEG>> ;                                                    02134000
                                                                        02136000
$PAGE "DATA SEGMENT ALLOCATION : GETDATASEG"                            02138000
                                                                        02140000
COMMENT  THIS FUNCTION IS CALLED TO CREATE AN EXTRA DATA SEGMEN         02142000
         OR STACK. A DST ENTRY AND VDS ARE ALLOCATED AND                02144000
         THE DST ENTRY IS INITIALIZED TO AN ABSENT STATE.               02146000
         THE ENTRY POINT FOR STACK ALLOCATION IS CALLED                 02148000
         GETSTACK;                                                      02150000
                                                                        02152000
INTEGER PROCEDURE GETDATASEG(MEMSIZE,VDSIZE);                           02154000
VALUE      MEMSIZE,VDSIZE;                                              02156000
INTEGER    MEMSIZE,VDSIZE;                                              02158000
OPTION     UNCALLABLE,PRIVILEGED;                                       02160000
                                                                        02162000
BEGIN                                                                   02164000
ENTRY    GETSTACK,GETDATASEGC;                                          02166000
INTEGER  POINTER PXFIX;           <<POINTER TO PXFIXED>>                02168000
DOUBLE   DA;                                                            02170000
INTEGER  EN,CRIT,DA1=DA,DA2=DA+1,EXTRA:=0,CC:=CCE;                      02172000
LOGICAL  STACK:=FALSE;                                                  02174000
LOGICAL CLEAR:=FALSE;                                                   02176000
GO START;                                                               02178000
                                                                        02180000
GETSTACK:   STACK:=TRUE;                                                02182000
            EXTRA := 1536;                 <<1152+384>>                 02184000
                                                                        02186000
GETDATASEGC: CLEAR:=TRUE;                                               02188000
START  : TRAPSOFF;                                                      02190000
Comment                                                        <<04641>>02192000
The memory size has to be a multiple of 4 with a maximum       <<04641>>02194000
value of 32764. All requests up to 32764 will be rounded up    <<04641>>02196000
and requests over that will end up getting 32764 words.        <<04641>>02198000
;                                                              <<04641>>02200000
TOS := IF MEMSIZE <= 32764 THEN                                <<04641>>02202000
          ((MEMSIZE + 7)/4)*4                                  <<04641>>02204000
       ELSE                                                    <<04641>>02206000
          32764;                                               <<04641>>02208000
DUPLICATE;                                                              02210000
IF TOS > VDSIZE THEN                                                    02212000
    BEGIN                        <<USE MEMORY SIZE>>                    02214000
    DUPLICATE;                                                          02216000
    VDSIZE := TOS;                                                      02218000
    END;                                                                02220000
MEMSIZE := TOS;                                                         02222000
CRIT := SETCRITICAL;                                                    02224000
                                                                        02226000
<<GET A SEGMENT TABLE ENTRY FOR THE DATA SEGMENT>>                      02228000
                                                                        02230000
TOS := GETENTRY(DSTB);         <<ALLOCATE DST ENTRY>>                   02232000
ASMB(TEST);                                                             02234000
IF = THEN                                                               02236000
    BEGIN                        <<NONE AVAILABLE>>                     02238000
    CC := CCG;                                                          02240000
    GO QUIT;                                                            02242000
    END;                                                                02244000
EN := TOS;                                                              02246000
<<GET A SWAP REGION FOR THE DATA SEGMENT>>                              02248000
                                                                        02250000
TOS := GETSWAPREGION(EN,VDSIZE+EXTRA,0);                                02252000
ASMB(DTST);                                                             02254000
IF = THEN                                                               02256000
    BEGIN                        <<NONE AVAILABLE>>                     02258000
    CC := CCL;                                                          02260000
    RETURNENTRY(DSTB,EN);       <<RELEASE DST ENTRY>>                   02262000
    GO QUIT;                                                            02264000
    END;                                                                02266000
DA := TOS;                                                              02268000
                                                                        02270000
<<FILL IN THE SEGMENT TABLE ENTRY FOR THE DATA SEGMENT>>                02272000
                                                                        02274000
X := EN&LSL(2);                                                         02276000
DSTI'(X) := LOGICAL(MEMSIZE&LSR(2)) LOR %100000;                        02278000
TOS:=DA1; <<HODA>>                                                      02280000
DSTI'(X:=X+2):=TOS;                                                     02282000
DSTI'(X:=X+1):=DA2;                                                     02284000
DST(EN&LSL(2)+1).DISCCOPYVALIDFLAG:=1;                                  02286000
GETDATASEG := EN;                                                       02288000
IF STACK THEN                                                           02290000
    BEGIN                        <<IGNORE LOGGING>>                     02292000
    DST  (EN&LSL(2)+1).STKFLAG:=1;                                      02294000
    GO QUIT;                                                            02296000
   END;                                                                 02298000
PDISABLE;                                                               02300000
TOS := SETDBTOSTACK;                                                    02302000
PUSH(DL);                                                               02304000
@PXFIX := TOS;                                                          02306000
TOS := @PXFIX(-PXFIX(-2));     <<POINTER TO PXFIXED>>                   02308000
TOS := PIX;                    <<PCB-RELATIVE INDEX>>                   02310000
TOS := (VDSIZE+PSM1)/128;      <<PAGE COUNT>>                           02312000
DUPLICATE;                                                              02314000
MMLOG(*,*,*,*);               <<LOG ALLOCATION>>                        02316000
ASSEMBLE( XCHD; DDEL);                                                  02318000
PENABLE;                                                                02320000
<<ZERO OUT SWAP REGION ON DISC IF REQUIRED>>                   <<01558>>02322000
IF CLEAR THEN                                                  <<01558>>02324000
   BEGIN <<ZAP ON DISC>>                                       <<01558>>02326000
   TOS:=ATTACHIO(DA1.LDEVNFIELD,0,0,0,ZEROFILL,                <<01558>>02328000
   LOGICAL(DSTI'(EN&LSL(2)+1)).VMALLOC*VMPAGESIZE,DA1.HODAFIELD<<01558>>02330000
   ,DA2,BLOCKED);                                              <<01558>>02332000
   ASMB(DEL);                                                  <<01558>>02334000
   IF TOS.(13:3)<>1 THEN SUDDENDEATH(680);                     <<01558>>02336000
   <<I/O ERROR ON ATTEMPT TO ZERO OUT SWAP REGION>>            <<01558>>02338000
   END;                                                        <<01558>>02340000
QUIT   : STATUS.CCFLD := CC;                                            02342000
RESETCRITICAL(CRIT);                                                    02344000
END <<GETDATASEG:GETSTACK>> ;                                           02346000
                                                                        02348000
$PAGE "SL SEGMENT ALLOCATION : PUTCST"                                  02350000
                                                                        02352000
                                                                        02354000
COMMENT  THIS PROCEDURE IS CALLED TO INITIALIZE A CST ENTRY             02356000
         WHICH WAS ALLOCATED BY CALLING THE FUNCTION GET-               02358000
         ENTRY OR GETENTRYS. AN ERROR WILL BE RETURNED IF               02360000
         THE CST ENTRY NUMBER EN IS OUT OF RANGE OR THE                 02362000
         ENTRY HAS ALREADY BEEN INITIALIZED.                            02364000
         ;                                                              02366000
                                                                        02368000
PROCEDURE PUTCST(EN,MASK,LDEV,DISKADR,SYSFLAG);                <<03775>>02370000
VALUE      EN,MASK,LDEV,DISKADR,SYSFLAG;                       <<03775>>02372000
INTEGER    EN,MASK,LDEV;                                                02374000
DOUBLE     DISKADR;                                                     02376000
LOGICAL    SYSFLAG;                                            <<03775>>02378000
OPTION     UNCALLABLE,PRIVILEGED;                                       02380000
BEGIN                                                                   02382000
DEFINE HODISKADR=(8:8)#;                                       <<03775>>02384000
INTEGER  CC:=CCE,HODA=DISKADR,LODA=DISKADR+1;                           02386000
IF (EN<=0) OR (EN>%277) THEN                                            02388000
   BEGIN                        <<OUT OF RANGE>>                        02390000
   CC := CCL;                                                           02392000
   GO QUIT;                                                             02394000
   END;                                                                 02396000
TOS:=EN&LSL(2)+DFC;                                                     02398000
IF DSTI'(TOS) <> 0 THEN                                                 02400000
   BEGIN                        <<ALREADY INITIALIZED>>                 02402000
   CC := CCG;                                                           02404000
   GO QUIT;                                                             02406000
   END;                                                                 02408000
DISABLE;                                                                02410000
TOS := MASK;                                                            02412000
TOS.ABIT := 1;                                                          02414000
DSTI'(X) := TOS;                                                        02416000
TOS:=0;                                                                 02418000
IF SYSFLAG THEN TOS.SYSTEMFLAG := 1;                           <<03775>>02420000
DSTI'(X:=X+1):=TOS;                                                     02422000
DSTI'(X:=X+1):=LDEV&LSL(8)+HODA.HODISKADR;                     <<03775>>02424000
DSTI'(X:=X+1) := LODA;                                                  02426000
QUIT   : STATUS.CCFLD := CC;                                            02428000
END <<PUTCST>> ;                                                        02430000
                                                                        02432000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : RELEASE INTERNAL REGION"       02434000
                                                                        02436000
PROCEDURE RELINTERNALREGION(RELPAGECNT,RBRELSOURCE);                    02438000
VALUE RELPAGECNT,RBRELSOURCE;                                           02440000
INTEGER RELPAGECNT,RBRELSOURCE;                                         02442000
OPTION PRIVILEGED,UNCALLABLE,INTERNAL;                                  02444000
                                                                        02446000
COMMENT                                                                 02448000
                                                                        02450000
RELINTERNALREGION IS CALLED WHEN A PCBX OR DL CONTRACTION OF AT         02452000
LEAST ONE MAIN MEMORY PAGE IS TO TAKE PLACE IN THE CALLER'S STA         02454000
                                                                        02456000
IT IS ASSUMED THAT DB IS AT THE OLDREGIONBASE, AND THAT A PDIAB         02458000
IS IN EFFECT.                                                           02460000
                                                                        02462000
THE REGION HEADER AND STACK PCBX UP TO THE SOURCE ARE MOVED UP          02464000
BY THE SPECIFIED NUMBER OF PAGES. THE REGION BELOW THE STACK IS         02466000
PLACED IN A RESERVED STATE AND A MSG IS SENT FOR IT TO BE RELEA         02468000
                                                                        02470000
AFTER THE MOVE IS COMPLETE, THE STACK'S NEW ADDRESS IS PLACED           02472000
IN THE DESCRIPTOR, AS IS THE NEW SIZE, AND THE STACK IS FLAGGED         02474000
PRESENT.                                                                02476000
                                                                        02478000
;                                                                       02480000
                                                                        02482000
BEGIN                                                                   02484000
                                                                        02486000
DOUBLE OLDREGIONBASE,SAVEDB,                                            02488000
       NEWREGIONBASE;                                                   02490000
INTEGER OLDREGIONSIZE,                                                  02492000
        STACKDST,                                                       02494000
        NEWREGIONSIZE,                                                  02496000
        RELWORDCOUNT;                                                   02498000
                                                                        02500000
                                                                        02502000
<<GET OLD STACK BASE FROM DESCRIPTOR,PUT IN NEW BASE>>                  02504000
                                                                        02506000
STACKDST:=ABSOLUTE(ABSOLUTE(QI)-ICSSTKDSTCELL);                         02508000
TOS:=DST(X:=STACKDST&LSL(2)+2); <<BANK>>                                02510000
TOS:=DST(X:=X+1); <<ADDRESS>>                                           02512000
ASMB(DDUP);                                                             02514000
OLDREGIONBASE:=TOS;                                                     02516000
TOS:=RELPAGECNT&LSL(PAGEPOWER);                                         02518000
RELWORDCOUNT:=S0;                                                       02520000
ASMB(LADD,DDUP;DDUP);                                                   02522000
NEWREGIONBASE:=TOS;                                                     02524000
DISABLE;                                                       <<04773>>02526000
DST(X):=TOS;                                                            02528000
DST(X:=X-1):=TOS;                                                       02530000
F(F(QI)-9):=S0;   <<ABS STACK ADDR>>                                    02532000
ENABLE;                                                        <<04773>>02534000
<<MOVE THE HEADER AND PART OF THE PCBX TO NEW POSITIONS>>               02536000
                                                                        02538000
TOS:=RBRELSOURCE+RELWORDCOUNT; <<MOVE DESTINATION>>                     02540000
TOS:=RBRELSOURCE;   <<MOVE SOURCE>>                                     02542000
TOS:=-(RBRELSOURCE+HEADERLENGTH); <<MOVE COUNT>>                        02544000
TOS:=OLDREGIONBASE;                                                     02546000
ASMB(XCHD);                                                             02548000
SAVEDB:=TOS;                                                            02550000
ASMB(MOVE);                                                             02552000
TOS:=SAVEDB;                                                            02554000
ASMB(XCHD;DDEL);                                                        02556000
                                                                        02558000
                                                                        02560000
<<FIX UP HEADER & TRAILER IN REGION BELOW-SEND RELEASE MSG>>            02562000
                                                                        02564000
TOS:=OLDREGIONBASE;                                                     02566000
TOS:=TOS+RBTORASDISP;                                                   02568000
TOS:=REGRESERVEDCODE;                                                   02570000
ASMB(SSEA);                                                             02572000
TOS:=TOS+RASTORSDISP;                                                   02574000
ASMB(LSEA);                                                             02576000
OLDREGIONSIZE:=TOS;                                                     02578000
NEWREGIONSIZE:=OLDREGIONSIZE-RELPAGECNT;                                02580000
TOS:=RELPAGECNT;                                                        02582000
ASMB(SSEA);                                                             02584000
TOS:=TOS+RSTOSSDISP;                                                    02586000
TOS:=RELPAGECNT;                                                        02588000
ASMB(SSEA);                                                             02590000
TOS:=TOS+SSTOSEGIDENTDISP;                                              02592000
TOS:=0;                                                                 02594000
ASMB(SSEA);                                                             02596000
TOS:=TOS+SEGIDENTTOPTRASDISP+RELWORDCOUNT;                              02598000
TOS:=REGRESERVEDCODE;                                                   02600000
ASMB(SSEA);                                                             02602000
TOS:=TOS+TRASTOTRSDISP;                                                 02604000
TOS:=RELPAGECNT;                                                        02606000
ASMB(SSEA);                                                             02608000
TOS:=TOS+TRSTOTSSDISP;                                                  02610000
TOS:=RELPAGECNT;                                                        02612000
ASMB(SSEA);                                                             02614000
TOS:=OLDREGIONBASE;                                                     02616000
SENDMSG(SCHEDPIN,RELREGREQPORT,2,0);                                    02618000
                                                                        02620000
<<UPDATE HEADER/TRAILER SIZE CELLS OF STACK'S NEW REGION>>              02622000
                                                                        02624000
TOS:=NEWREGIONBASE;                                                     02626000
TOS:=TOS+RBTORSDISP;                                                    02628000
TOS:=NEWREGIONSIZE;                                                     02630000
ASMB(SSEA);                                                             02632000
TOS:=TOS+RSTOSSDISP;                                                    02634000
TOS:=NEWREGIONSIZE;                                                     02636000
ASMB(SSEA);                                                             02638000
TOS:=TOS+SSTORASDISP;                                                   02640000
TOS:=REGASSIGNEDCODE;                                                   02642000
ASMB(SSEA);                                                             02644000
TOS:=TOS+RASTOPTRSDISP+NEWREGIONSIZE&LSL(PAGEPOWER);                    02646000
TOS:=NEWREGIONSIZE;                                                     02648000
ASMB(SSEA);                                                             02650000
TOS:=TOS+TRSTOTSSDISP;                                                  02652000
TOS:=NEWREGIONSIZE;                                                     02654000
ASMB(SSEA);                                                             02656000
TOS:=TOS+TSSTOTRASDISP;                                                 02658000
TOS:=REGASSIGNEDCODE;                                                   02660000
ASMB(SSEA);                                                             02662000
END  <<RELINTERNALREGION>>;                                             02664000
                                                                        02666000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : ALTDSEGSIZE"                   02668000
                                                                        02670000
COMMENT                                                                 02672000
                                                                        02674000
ALTDSEGSIZE IS CALLED TO MODIFY (EXPAND OR CONTRACT) THE SPACE          02676000
ALLOCATED TO A DATA SEGMENT.  THE NEW SEGMENT SIZE IS RETURNED.         02678000
                                                                        02680000
;                                                                       02682000
                                                                        02684000
                                                                        02686000
INTEGER PROCEDURE ALTDSEGSIZE(EN,SIZE);                                 02688000
VALUE      EN,SIZE;                                                     02690000
INTEGER    EN,SIZE;                                                     02692000
OPTION     UNCALLABLE,PRIVILEGED;                                       02694000
                                                                        02696000
                                                                        02698000
BEGIN                                                                   02700000
INTEGER  INX,REF,CRIT,CC:=CCE,NS=ALTDSEGSIZE;                           02702000
EQUATE   ALTCODE   =5;                                                  02704000
INTEGER PAGESREQUIRED,OLDSIZE,NEWSIZE;                                  02706000
IF ICS(-ICSPDISABLECNTCELL) > 0 THEN                           <<02092>>02708000
                                                               <<02092>>02710000
   COMMENT:  The purpose of the following code is to cover up  <<02092>>02712000
             a pdisable problem in which an interrupt handler  <<02092>>02714000
             appears to execute a pdisable without a           <<02092>>02716000
             corresponding penable.  This strange problem      <<02092>>02718000
             always appears to leave the pdisable count at 1.  <<02092>>02720000
             If this condition is met, we shall execute a      <<02092>>02722000
             penable on behalf of the defective software       <<02092>>02724000
             [a small prayer is in order here] and continue    <<02092>>02726000
             execution.  Otherwise we shall HALT the machine.  <<02092>>02728000
             Previously, the software crashed the machine      <<02092>>02730000
             with a SUDDENDEATH(634).  When this problem is    <<02092>>02732000
             corrected the SUDDENDEATH should be implemented;  <<02092>>02734000
                                                               <<02092>>02736000
   IF ICS(-ICSPDISABLECNTCELL) = 1 THEN                        <<02092>>02738000
      PENABLE   <<It's a miracle>>                             <<02092>>02740000
   ELSE                                                        <<02092>>02742000
      IF TRUE THEN                                             <<02092>>02744000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02092>>02746000
      ELSE                                                     <<02092>>02748000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02092>>02750000
SIZE := LOGICAL(SIZE+3) LAND -4; <<ROUND UP>>                           02752000
TRAPSOFF;                                                               02754000
FORCESTKO;                                                              02756000
CRIT := SETCRITICAL;                                                    02758000
INX := EN&LSL(2);              <<DST-RELATIVE INDEX>>                   02760000
OLDSIZE:=(DSTI'(INX).DSFLD)&LSL(2);                                     02762000
IF (OLDSIZE+PSM1)/INTEGER(VMPAGESIZE)>DST(EN&LSL(2)+1).NPFLD            02764000
THEN                                                           <<01636>>02766000
   BEGIN <<EXCEEDS VM ALLOCATION>>                             <<01636>>02768000
   CC:=CCG;ALTDSEGSIZE:=OLDSIZE;                               <<01636>>02770000
   GO OUT;                                                     <<01636>>02772000
   END;                                                        <<01636>>02774000
TOS:=NEWSIZE:=OLDSIZE+SIZE;                                             02776000
PAGESREQUIRED:=(TOS+OVERHEAD-1)&LSR(PAGEPOWER)+1;                       02778000
ALTDSEGSIZE:=NEWSIZE;                                                   02780000
IF <= THEN                                                              02782000
   BEGIN <<EXCEEDS 32KW>>                                               02784000
   CC := CCG;ALTDSEGSIZE:=OLDSIZE;                                      02786000
   GO OUT;                                                              02788000
   END;                                                                 02790000
IF SIZE > 0 THEN                                                        02792000
   BEGIN                      <<EXPANSION>>                             02794000
   TOS := (NS+PSM1)/INTEGER(VMPAGESIZE);                                02796000
   IF TOS > DST(EN&LSL(2)+1).NPFLD THEN                                 02798000
      BEGIN                   <<EXCEEDS MAXVDS>>                        02800000
      CC:=CCG;ALTDSEGSIZE:=OLDSIZE;                                     02802000
      GO OUT;                                                           02804000
      END;                                                              02806000
   END;                                                                 02808000
                                                                        02810000
AGAIN:                                                                  02812000
                                                                        02814000
DISABLE;                                                                02816000
IF DSTI'(X:=EN&LSL(2)) < 0 THEN                                         02818000
   BEGIN <<SEG IS ABSENT>>                                              02820000
   X:=X+1;                                                              02822000
   IF LOGICAL(DSTI'(X)).IMIFLAG OR LOGICAL(DSTI'(X)).ROCFLAG            02824000
   THEN QUEUEONSEGMENT(EN) ELSE                                         02826000
       BEGIN  <<OK, THAT'S EASY>>                                       02828000
       DSTI'(X:=EN&LSL(2)).DSFLD:=NS&LSR(2);                            02830000
       GO OUT;                                                          02832000
       END;                                                             02834000
   END;                                                                 02836000
GETDATASEGCHANGESTATE(EN);                                              02838000
IF < THEN                                                               02840000
   BEGIN <<CORE RESIDENT,LOCKED OR FROZEN>>                             02842000
   CC:=CCL;ALTDSEGSIZE:=OLDSIZE;                                        02844000
   GO OUT;                                                              02846000
   END;                                                                 02848000
IF > THEN GO AGAIN;                                                     02850000
DISABLE;                                                                02852000
TOS:=DSTI'(EN&LSL(2)+2); <<BANK>>                                       02854000
TOS:=DSTI'(X:=X+1); <<BASE>>                                            02856000
TOS:=TOS+RBTORSDISP;                                                    02858000
ASMB(LSEA);                                                             02860000
IF PAGESREQUIRED <= S0 OR SIZE < 0 THEN                                 02862000
   BEGIN  <<OK-DONE>>                                                   02864000
   MMSTAT(2,EN,12,SIZE);  <<XDS CONTRACTION>>                  <<01572>>02866000
   DISABLE;                                                             02868000
   DSTI'(X:=EN&LSL(2)).DSFLD:=NS&LSR(2);                                02870000
   DSTI'(X).ABIT:=0;                                                    02872000
   IF GCLASSENABLEDMASK.CLASS0 AND SIZE < 0 THEN                        02874000
      BEGIN  <<MEASURE DATA SEG CONTRACTION>>                           02876000
      TOS:=MEASSTATXDSBANK;                                             02878000
      TOS:=MEASSTATXDSBASE;                                             02880000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'DSEGCONTRACT;                <<RAY.V>>02882000
      ASMB(LSEA);                                                       02884000
      TOS:=TOS+1;                                                       02886000
      ASMB(SSEA;DDEL);                                                  02888000
      END;                                                              02890000
    IF GCLASSENABLEDMASK.CLASS15 THEN                          <<01813>>02892000
       BEGIN <<PROCESS LEVEL SEG CONTRACTION>>                 <<01813>>02894000
       TOS:=MEASPROCXDSBANK;                                   <<01813>>02896000
       TOS:=MEASPROCXDSBASE;                                   <<01813>>02898000
       TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                   <<01813>>02900000
            CLASS15'SUB0SIZE+CP'SEGCONTRACT;                   <<01813>>02902000
       ASMB(LSEA);                                             <<01813>>02904000
       TOS:=TOS+1;                                             <<01813>>02906000
       ASMB(SSEA;DDEL);                                        <<01813>>02908000
       END;                                                    <<01813>>02910000
   GO QUIT;                                                             02912000
   END;                                                                 02914000
DISABLE;                                                                02916000
TOS:=EN; <<SEGIDENT>>                                                   02918000
TOS:=ABSOLUTE(CPCB)-SYSBASE;                                            02920000
SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                                   02922000
<<STORE AWAY THE INFO FOR THE EXPANSION>>                               02924000
GENSPECREQ(INX&LSR(2),NS&LSR(2),0,0);                                   02926000
IF GCLASSENABLEDMASK.CLASS0 THEN                                        02928000
   BEGIN  <<MEASURE EXPANSION OF DATA SEG>>                             02930000
   TOS:=MEASSTATXDSBANK;                                                02932000
   TOS:=MEASSTATXDSBASE;                                                02934000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPXDSEXPAND;                  <<RAY.V>>02936000
   ASMB(LSEA);                                                          02938000
   TOS:=TOS+1;                                                          02940000
   ASMB(SSEA;DDEL);                                                     02942000
   END;                                                                 02944000
IF GCLASSENABLEDMASK.CLASS15 AND SIZE < 0 THEN                 <<01813>>02946000
   BEGIN <<PROCESS LEVEL SEG EXPANSION>>                       <<01813>>02948000
   TOS:=MEASPROCXDSBANK;                                       <<01813>>02950000
   TOS:=MEASPROCXDSBASE;                                       <<01813>>02952000
   TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                       <<01813>>02954000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPAND;                     <<01813>>02956000
   ASMB(LSEA);                                                 <<01813>>02958000
   TOS:=TOS+1;                                                 <<01813>>02960000
   ASMB(SSEA;DDEL);                                            <<01813>>02962000
   END;                                                        <<01813>>02964000
<<STUFF AWAY REASON STOPPED IN PCBX OF PROCESS>>               <<01813>>02966000
<<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>        <<01813>>02968000
TOS:=ICS(-ICSSTKBANKCELL);                                     <<01813>>02970000
TOS:=ICS(-ICSSTKBASECELL)+PXGLOBSIZE+MEASSTOPREASON'IDX;       <<01813>>02972000
TOS:=STOPSEGFAULT;                                             <<01813>>02974000
ASMB(SSEA;DDEL);                                               <<01813>>02976000
MMSTAT(2,EN,11,SIZE);     <<XDS EXPANSION>>                    <<01572>>02978000
QUEUEONSEGMENT(EN);                                                     02980000
GO OUT;                                                                 02982000
QUIT   : PENABLE;                                                       02984000
OUT   : STATUS.CCFLD := CC;                                             02986000
CPUNUM;                    << GET CPU NUMBER >>                <<04662>>02988000
IF TOS= SERIES64 THEN                                          <<04662>>02990000
                                                               <<04662>>02992000
  BEGIN                                                        <<04662>>02994000
  ASMB (PSHR %100);        << TOS-1:= DB BNK TOS:= DB >>       <<04662>>02996000
  IF TOS= ICS(-ICS'XDSEGBASECELL) AND                          <<04662>>02998000
    TOS= ICS(-ICS'XDSEGBNKCELL) THEN                           <<04662>>03000000
                                                               <<04662>>03002000
    BEGIN                  << DB ON EXTRA DATA SEGMENT >>      <<04662>>03004000
    X:= EN & LSL(2);       << X:= DST ENTRY * 4 >>             <<04662>>03006000
    GET'XDSEG'LIMITS;      << UPDATE XDSEG LIMITS ON >>        <<04662>>03008000
    XFER'XDSEG'LIMITS;     << UPDATE CPU REGISTERS >>          <<04662>>03010000
    END;                                                       <<04662>>03012000
                                                               <<04662>>03014000
  END;                                                         <<04662>>03016000
                                                               <<04662>>03018000
RESETCRITICAL(CRIT);                                                    03020000
END <<ALTDSEGSIZE>> ;                                                   03022000
                                                                        03024000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : STACKSIZE"                     03026000
                                                                        03028000
COMMENT  THIS FUNCTION IS CALLED TO DETERMINE THE MAXIMUM               03030000
         STACK SEGMENT SIZE (Z-DL). CALLABLE-CAPABILITY 0-              03032000
         STACK SEGMENT;                                                 03034000
                                                                        03036000
INTEGER PROCEDURE STACKSIZE(SIZE);                                      03038000
VALUE      SIZE;                                                        03040000
INTEGER    SIZE;                                                        03042000
OPTION     PRIVILEGED;                                                  03044000
BEGIN                                                                   03046000
EQUATE   ERRN      =134,                                                03048000
         EXITN     =1,                                                  03050000
         ERREX     =[10/ERRN,6/EXITN],                                  03052000
         PXSTAK    =13;                                                 03054000
INTEGER  POINTER P,                                                     03056000
         PXFIX=P;                                                       03058000
INTEGER  CC:=CCE;                                                       03060000
ERRORON;                                                                03062000
CHEK(ERREX,1);                                                          03064000
PUSH(DL);                                                               03066000
@P := TOS;                                                              03068000
@PXFIX := @P(-P(-2));                                                   03070000
IF SIZE > PXFIX(PXSTAK) THEN                                            03072000
CC := CCG;                                                              03074000
STACKSIZE := PXFIX(X);                                                  03076000
STATUS.CCFLD := CC;                                                     03078000
ERROREXIT(ERREX,0,0);                                                   03080000
END <<STACKSIZE>> ;                                                     03082000
                                                                        03084000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : DLSIZE"                        03086000
                                                                        03088000
COMMENT  THIS FUNCTION IS CALLED TO EXPAND OR CONTRACT DL TO DB.        03090000
         THE NEW VALUE OF DL TO DB IS RETURNED.                         03092000
         SIZE      =REQUESTED (DL-DB) SIZE                              03094000
         DLSIZE    =GRANTED (DL-DB) SIZE.                               03096000
         CODE :    CC=0 O.K. DLSIZE <= SIZE.                            03098000
                   CC>0 O.K. DLSIZE := MAX(DL-DB) > SIZE.               03100000
                   CC<0 FAILS. ILLEGAL SIZE(>0).                        03102000
                        DLSIZE := ORIGINAL(DL-DB).                      03104000
         ;                                                              03106000
                                                                        03108000
INTEGER PROCEDURE DLSIZE(SIZE);                                         03110000
VALUE      SIZE;                                                        03112000
INTEGER    SIZE;                                                        03114000
OPTION     PRIVILEGED;                                                  03116000
                                                                        03118000
BEGIN                                                                   03120000
INTEGER  DLVAL,INX,INC,SZ,TOTAL,MAXINC,CRIT,LCSW,CC:=CCE;               03122000
INTEGER RELPAGECNT,RELWORDCNT,WORDSREQUIRED,PAGESREQUIRED,              03124000
REQUESTEDINC,NEWSZ,RBRELSOURCE,LENGTH;                                  03126000
LOGICAL  REF,PINX;                                                      03128000
INTEGER STACKDST;   <<FOR MMSTAT>>                             <<01572>>03130000
DOUBLE   CDB;                                                           03132000
INTEGER  POINTER PDL,             <<POINTER TO DL AREA BASE>>           03134000
                 PXFIX,           <<POINTER TO PXFIXED>>                03136000
                 PCBX;            <<POINTER TO PCBX BASE>>              03138000
EQUATE   ERRN      =135,                                                03140000
         EXITN     =1,                                                  03142000
         ERREX     =[10/ERRN,6/EXITN],                                  03144000
         PXDL      =1,                                                  03146000
         PXDB=2,                                                        03148000
         PXSTAK    =13,                                                 03150000
         INITDL    =4,                                                  03152000
         PXVIRT    =20,                                                 03154000
         EXTRA     =1152,                                               03156000
         DLCODE    =3;                                                  03158000
DEFINE   SYSPROCESS=PCBL'(PINX+9).(6:1)#;                               03160000
                                                                        03162000
IF ICS(-ICSPDISABLECNTCELL) > 0 THEN                           <<02092>>03164000
                                                               <<02092>>03166000
   COMMENT:  The purpose of the following code is to cover up  <<02092>>03168000
             a pdisable problem in which an interrupt handler  <<02092>>03170000
             appears to execute a pdisable without a           <<02092>>03172000
             corresponding penable.  This strange problem      <<02092>>03174000
             always appears to leave the pdisable count at 1.  <<02092>>03176000
             If this condition is met, we shall execute a      <<02092>>03178000
             penable on behalf of the defective software       <<02092>>03180000
             [a small prayer is in order here] and continue    <<02092>>03182000
             execution.  Otherwise we shall HALT the machine.  <<02092>>03184000
             Previously, the software crashed the machine      <<02092>>03186000
             with a SUDDENDEATH(634).  When this problem is    <<02092>>03188000
             corrected the SUDDENDEATH should be implemented;  <<02092>>03190000
                                                               <<02092>>03192000
   IF ICS(-ICSPDISABLECNTCELL) = 1 THEN                        <<02092>>03194000
      PENABLE   <<It's a miracle>>                             <<02092>>03196000
   ELSE                                                        <<02092>>03198000
      IF TRUE THEN                                             <<02092>>03200000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02092>>03202000
      ELSE                                                     <<02092>>03204000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02092>>03206000
FORCESTKO;                                                              03208000
CRIT := SETCRITICAL;                                                    03210000
ERRORON;                                                                03212000
CHEK(ERREX,1);                                                          03214000
TRAPSOFF;                                                               03216000
PINX := PIX;                                                            03218000
                                                                        03220000
AGAIN:                                                                  03222000
                                                                        03224000
PUSH(DL);                                                               03226000
DLVAL := TOS;                                                           03228000
INX := PCBI'(PINX+3).(1:10)&LSL(2);                                     03230000
TOS:=ABSOLUTE(ABSOLUTE(QI)-ICSSTKDSTCELL);                              03232000
STACKDST := S0;     <<LOAD SEGIDENT FOR MMSTAT>>               <<01572>>03234000
DISABLE;                                                       <<02061>>03236000
GETDATASEGCHANGESTATE(*);                                               03238000
ENABLE;                                                        <<02061>>03240000
IF < THEN                                                               03242000
   BEGIN       <<CORE RES,LOCKED OR FROZEN>>                            03244000
   CC := CCL;                                                           03246000
   TOS := DLVAL;                                                        03248000
   GOTO DONE;                                                           03250000
   END;                                                                 03252000
IF > THEN GO AGAIN;           <<IT WAS IMPEDED>>                        03254000
<<THERE IS A PDISABLE IN EFFECT AT THIS POINT>>                         03256000
CDB := SETDBTOSTACK;                                                    03258000
@PDL := DLVAL;                                                          03260000
@PCBX := @PDL(-PDL(-1));                                                03262000
@PXFIX := @PDL(-PDL(-2));                                               03264000
IF (SIZE >= 0) OR                                              <<04511>>03266000
    ((SIZE < 0) LAND (-SIZE < PXFIX(INITDL))) THEN             <<04511>>03268000
   BEGIN                        <<RESET TO INITIAL DL>>                 03270000
   CC := CCL;                                                  <<04511>>03272000
   SIZE := -PXFIX(INITDL);                                              03274000
   END;                                                                 03276000
SZ := DSTI'(INX).DSFLD&LSL(2); <<SEGMENT SIZE>>                         03278000
TOS := DLVAL-SIZE;                                                      03280000
IF <= THEN                                                              03282000
   BEGIN                        <<DECREASE DL AREA SIZE>>               03284000
   TOS:=-S0;                                                            03286000
   TOS:=TOS&LSR(PAGEPOWER);                                             03288000
   IF = THEN                                                            03290000
       BEGIN <<NOT AT LEAST A PAGE RELEASE>>                            03292000
       TOS:=DLVAL;                                                      03294000
       GO TO DEFRL;                                                     03296000
       END                                                              03298000
   ELSE                                                                 03300000
       BEGIN <<WILL CONTRACT NOW>>                                      03302000
       IF GCLASSENABLEDMASK.CLASS0 THEN                                 03304000
          BEGIN  <<MEASURE DB TO DL CONTRACTION>>                       03306000
          TOS:=MEASSTATXDSBANK;                                         03308000
          TOS:=MEASSTATXDSBASE;                                         03310000
          TOS:=TOS+C0SUB0'SEGRELOFF+C'DLCONTRACT;              <<RAY.V>>03312000
          ASMB(LSEA);                                                   03314000
          TOS:=TOS+1;                                                   03316000
          ASMB(SSEA;DDEL);                                              03318000
          END;                                                          03320000
       IF GCLASSENABLEDMASK.CLASS15 THEN                       <<01813>>03322000
          BEGIN <<PROCESS LEVEL SEG (DL) CONTRACTION>>         <<01813>>03324000
          TOS:=MEASPROCXDSBANK;                                <<01813>>03326000
          TOS:=MEASPROCXDSBASE;                                <<01813>>03328000
          TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                <<01813>>03330000
               CLASS15'SUB0SIZE+CP'SEGCONTRACT;                <<01813>>03332000
          ASMB(LSEA);                                          <<01813>>03334000
          TOS:=TOS+1;                                          <<01813>>03336000
          ASMB(SSEA;DDEL);                                     <<01813>>03338000
          END;                                                 <<01813>>03340000
       RELPAGECNT:=S0;                                                  03342000
       RELWORDCNT:=S0&LSL(PAGEPOWER);                                   03344000
       DSTI'(INX).DSFLD:=(SZ-RELWORDCNT)&LSR(2);                        03346000
       TOS:=DST(INX+2); <<BANK>>                                        03348000
       TOS:=DST(X:=X+1);                                                03350000
       TOS:=TOS+SBTOSTKDBDISP;                                          03352000
       ASMB(LSEA);                                                      03354000
       TOS:=TOS-RELWORDCNT;                                             03356000
       ASMB(SSEA); <<NEW STACK BASE RELATIVE DB>>                       03358000
       TOS:=TOS+STKDBTOSTKDLDISP;                                       03360000
       ASMB(LSEA); <<SOURCE FOR MOVE>>                                  03362000
       RBRELSOURCE := TOS - 1;                                 <<02809>>03364000
       RELINTERNALREGION(RELPAGECNT,RBRELSOURCE);                       03366000
       TOS:=DLVAL+RELWORDCNT;                                           03368000
       DUPLICATE;                                                       03370000
       F(F(QI)-7):=S0;                                                  03372000
       SET(DL);                                                         03374000
       MMSTAT(2,STACKDST,7,SIZE);  <<DLSIZE CONTRACTION>>      <<01572>>03376000
       END;                                                             03378000
DEFRL:                                                                  03380000
    DISABLE;                                                            03382000
    DSTI'(INX).ABIT := 0;         <<MARK PRESENT>>                      03384000
    ENABLE;                                                             03386000
    GOTO DONE0;                                                         03388000
    END;                                                                03390000
                                                                        03392000
<<EXPAND AREA IF WE GET HERE>>                                          03394000
                                                                        03396000
<<ROUND UP REQUEST SO THAT RESULTANT STACK WILL FIT WELL>>              03398000
<<IN A NEW REGION-I.E. MINIMAL INTERNAL FRAGMENTATION>>                 03400000
                                                                        03402000
REQUESTEDINC:=TOS;                                                      03404000
INC:=LOGICAL (REQUESTEDINC+127) LAND -128;                              03406000
NEWSZ:=SZ+INC;                                                          03408000
IF NEWSZ > PXFIX(PXSTAK) THEN                                           03410000
   BEGIN                                                                03412000
   CC:=CCG;                                                             03414000
   INC:=LOGICAL(PXFIX(PXSTAK)-SZ) LAND -128;                            03416000
   IF INC > 0 THEN NEWSZ:=SZ+INC ELSE                                   03418000
      BEGIN                                                             03420000
      CC:=CCG;                                                          03422000
      TOS:=DLVAL;                                                       03424000
      GOTO DEFRL;                                                       03426000
      END;                                                              03428000
   END;                                                                 03430000
TOS := LOGICAL(SZ+INC+127) LAND -128;                                   03432000
DUPLICATE;                                                              03434000
TOTAL := TOS;                                                           03436000
IF TOS >= LOGICAL(PXFIX(PXVIRT)) THEN                                   03438000
   BEGIN   <<NO VDS>>                                                   03440000
   CC := CCL;                                                           03442000
   TOS := DLVAL;                                                        03444000
   GOTO DEFRL;                                                          03446000
   END;                                                                 03448000
IF GCLASSENABLEDMASK.CLASS0 THEN                                        03450000
   BEGIN  <<MEASURE DB-DL EXPANSION>>                                   03452000
   TOS:=MEASSTATXDSBANK;                                                03454000
   TOS:=MEASSTATXDSBASE;                                                03456000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPDLEXPAND;                   <<RAY.V>>03458000
   ASMB(LSEA);                                                          03460000
   TOS:=TOS+1;                                                          03462000
   ASMB(SSEA;DDEL);                                                     03464000
   END;                                                                 03466000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01813>>03468000
   BEGIN <<PROCESS LEVEL SEG (DB-DL) EXPANSION>>               <<01813>>03470000
   TOS:=MEASPROCXDSBANK;                                       <<01813>>03472000
   TOS:=MEASPROCXDSBASE;                                       <<01813>>03474000
   TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                       <<01813>>03476000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPANSION;                  <<01813>>03478000
   ASMB(LSEA);                                                 <<01813>>03480000
   TOS:=TOS+1;                                                 <<01813>>03482000
   ASMB(SSEA;DDEL);                                            <<01813>>03484000
   END;                                                        <<01813>>03486000
<<STUFF AWAY REASON STOPPED IN PCBX OF PROCESS>>               <<01813>>03488000
<<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>        <<01813>>03490000
TOS:=ICS(-ICSSTKBANKCELL);                                     <<01813>>03492000
TOS:=ICS(-ICSSTKBASECELL)+PXGLOBSIZE+MEASSTOPREASON'IDX;       <<01813>>03494000
TOS:=STOPSEGFAULT;                                             <<01813>>03496000
ASMB(SSEA;DDEL);                                               <<01813>>03498000
TOS:=INX&LSR(2); <<SEGIDENT>>                                           03500000
TOS:=ABSOLUTE(CPCB)-SYSBASE;                                            03502000
SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                                   03504000
                                                                        03506000
<<FIX PCBX PTRS>>                                                       03508000
                                                                        03510000
TOS:=DST(X:=INX+2);                                                     03512000
TOS:=DST(X:=X+1);                                                       03514000
TOS:=TOS+SBTOSTKDLDISP;                                                 03516000
ASMB(LSEA);                                                             03518000
LENGTH:=TOS; <<SOURCE FOR MOVE>>                                        03520000
<<STORE AWAY THE INFO FOR THE EXPANSION>>                               03522000
GENSPECREQ(INX&LSR(2),NEWSZ&LSR(2),INC,LENGTH);                         03524000
TOS:=TOS+STKDLTOSTKDBDISP;                                              03526000
ASMB(LSEA);                                                             03528000
TOS:=TOS+INC;                                                           03530000
ASMB(SSEA); <<NEW STACK BASE RELATIVE DB>>                              03532000
<<COMPUTE NEW-ZDL AND STORE IN PXFIXED IF > PREV MAX>>         <<01777>>03534000
PUSH(Z,DL);                                                    <<01777>>03536000
ASMB(SUB);                                                     <<01777>>03538000
TOS:=TOS+INC;                                                  <<01777>>03540000
IF S0 > PXFIX(PXMAXSTACK) THEN PXFIX(PXMAXSTACK):=             <<01777>>03542000
   TOS ELSE ASMB(DEL);                                         <<01777>>03544000
TOS:=CDB;                                                               03546000
ASMB(XCHD;DDEL);                                                        03548000
MMSTAT(2,STACKDST,6,SIZE);         <<DLSIZE EXPANSION>>        <<01572>>03550000
WAIT(MEMORYWAITCODE,MEMTRAP);                                           03552000
PUSH(DL);                                                               03554000
GOTO DONE;                                                              03556000
                                                                        03558000
DONE0:                                                                  03560000
                                                                        03562000
TOS := CDB;                                                             03564000
ASMB(XCHD); DDEL;                                                       03566000
PENABLE;                                                                03568000
                                                                        03570000
DONE:                                                                   03572000
                                                                        03574000
DLSIZE := TOS;                 <<RETURN VALUE>>                         03576000
RESETCRITICAL(CRIT);                                                    03578000
STATUS.CCFLD := CC;                                                     03580000
ERROREXIT(ERREX,0,0);                                                   03582000
END <<DLSIZE>> ;                                                        03584000
                                                                        03586000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : ZSIZE"                         03588000
COMMENT  THIS FUNCTION IS CALLED TO EXPAND OR CONTRACT (Z-DB)           03590000
         SIZE      =REQUESTED (Z-DB) SIZE.                              03592000
         ZSIZE     =GRANTED (Z-DB) SIZE.                                03594000
         CODE :    CC=0 O.K. ZSIZE >= SIZE.                             03596000
                   CC>0 O.K. ZSIZE := MAX(Z-DB) < SIZE.                 03598000
                   CC<0 FAILED. ILLEGAL SIZE(SIZE<(S-DB)+128.  <<04609>>03600000
                        ZSIZE := AT LEAST ABOVE MIN VALUE.              03602000
         ;                                                              03604000
                                                                        03606000
INTEGER PROCEDURE ZSIZE(SIZE);                                          03608000
VALUE      SIZE;                                                        03610000
INTEGER    SIZE;                                                        03612000
OPTION     PRIVILEGED;                                                  03614000
                                                                        03616000
BEGIN                                                                   03618000
EQUATE   ERRN      =136,                                                03620000
         EXITN     =1,                                                  03622000
         ERREX     =[10/ERRN,6/EXITN],                                  03624000
         PXSTAK    =13,                                                 03626000
         PXVIRT    =20,                                                 03628000
         EXTRA     =1152,                                               03630000
         PXZ       =2,                                                  03632000
         ZCODE     =4;                                                  03634000
INTEGER  POINTER   PCBX,          <<POINTER TO PCBX BASE>>              03636000
                   P,             <<POINTER TO DL>>                     03638000
                   PXFIX;         <<POINTER TO PXFIXED>>                03640000
INTEGER  INX,MINZ,ZVAL,SZ,INC,MAXINC,TOTAL,CRIT,LCSW,CC:=CCE;           03642000
DOUBLE   CDB;                                                           03644000
LOGICAL  REF;                                                           03646000
INTEGER  NEW'Z;                                                         03648000
INTEGER PAGESREQUIRED,PAGESALLOCATED;                                   03650000
IF ICS(-ICSPDISABLECNTCELL) > 0 THEN                           <<02092>>03652000
                                                               <<02092>>03654000
   COMMENT:  The purpose of the following code is to cover up  <<02092>>03656000
             a pdisable problem in which an interrupt handler  <<02092>>03658000
             appears to execute a pdisable without a           <<02092>>03660000
             corresponding penable.  This strange problem      <<02092>>03662000
             always appears to leave the pdisable count at 1.  <<02092>>03664000
             If this condition is met, we shall execute a      <<02092>>03666000
             penable on behalf of the defective software       <<02092>>03668000
             [a small prayer is in order here] and continue    <<02092>>03670000
             execution.  Otherwise we shall HALT the machine.  <<02092>>03672000
             Previously, the software crashed the machine      <<02092>>03674000
             with a SUDDENDEATH(634).  When this problem is    <<02092>>03676000
             corrected the SUDDENDEATH should be implemented;  <<02092>>03678000
                                                               <<02092>>03680000
   IF ICS(-ICSPDISABLECNTCELL) = 1 THEN                        <<02092>>03682000
      PENABLE   <<It's a miracle>>                             <<02092>>03684000
   ELSE                                                        <<02092>>03686000
      IF TRUE THEN                                             <<02092>>03688000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02092>>03690000
      ELSE                                                     <<02092>>03692000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02092>>03694000
FORCESTKO;                                                              03696000
CRIT := SETCRITICAL;                                                    03698000
ERRORON;                                                                03700000
CHEK(ERREX,1);                                                          03702000
TRAPSOFF;                                                               03704000
                                                                        03706000
AGAIN:                                                                  03708000
                                                                        03710000
PUSH(DL);                                                               03712000
@P := TOS;                                                              03714000
INX := PCBI'(PIX+3).(1:10)&LSL(2);                                      03716000
DISABLE;                                                       <<02061>>03718000
GETDATASEGCHANGESTATE(INX&LSR(2));                                      03720000
ENABLE;                                                        <<02061>>03722000
IF < THEN                                                               03724000
   BEGIN                        <<CORE RES,LOCKED OR FROZEN>>           03726000
   CC := CCL;                                                           03728000
   PUSH(Z);                                                             03730000
   GOTO DONE;                                                           03732000
   END;                                                                 03734000
IF > THEN GO AGAIN;           <<IT WAS IMPEDED>>                        03736000
<<THERE IS A PDISABLE IN EFFECT AT THIS POINT>>                         03738000
CDB := SETDBTOSTACK;                                                    03740000
@PCBX := @P(-P(-1));                                                    03742000
@PXFIX := @P(-P(-2));                                                   03744000
PUSH(S,Q,Z);                                                            03746000
ZVAL := TOS;                                                            03748000
<<BELOW: MINZ := (IF S>Q THEN S ELSE Q)+128>>                           03750000
ASMB(DDUP,LCMP);                                                        03752000
IF > THEN EXCHANGE;                                                     03754000
MINZ := TOS+128;                                                        03756000
DEL;                                                                    03758000
IF SIZE < MINZ THEN                                                     03760000
    BEGIN                        <<SELECT MIN ALLOWED>>                 03762000
    SIZE := MINZ;                                                       03764000
    CC := CCL;                                                          03766000
    END;                                                                03768000
SZ := DSTI'(INX).DSFLD&LSL(2); <<SEGMENT SIZE>>                         03770000
INC:=LOGICAL(SIZE-ZVAL+127) LAND -128;                         <<01695>>03772000
PAGESREQUIRED:=(INC+SZ+OVERHEAD-1)&LSR(PAGEPOWER)+1;           <<01746>>03774000
DISABLE;                                                                03776000
TOS:=DSTI'(INX+2); <<BANK>>                                             03778000
TOS:=DSTI'(X:=X+1);                                                     03780000
TOS:=TOS+RBTORSDISP;                                                    03782000
ASMB(LSEA);                                                             03784000
PAGESALLOCATED:=TOS;                                                    03786000
TOS := SIZE-ZVAL;                                                       03788000
IF INC <= 0 OR PAGESREQUIRED <= PAGESALLOCATED THEN            <<01695>>03790000
   BEGIN <<CONTRACT OR CURRENT REGION BIG ENOUGH>>                      03792000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  03794000
         BEGIN  <<MEASURE DB-Z CONTRACTION>>                            03796000
         TOS:=MEASSTATXDSBANK;                                          03798000
         TOS:=MEASSTATXDSBASE;                                          03800000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'DBZCONTRACT;              <<RAY.V>>03802000
         ASMB(LSEA);                                                    03804000
         TOS:=TOS+1;                                                    03806000
         ASMB(SSEA;DDEL);                                               03808000
         END;                                                           03810000
      IF GCLASSENABLEDMASK.CLASS15 THEN                        <<01813>>03812000
         BEGIN <<PROCESS LEVEL SEG (DB-Z) CONTRACTION>>        <<01813>>03814000
         TOS:=MEASPROCXDSBANK;                                 <<01813>>03816000
         TOS:=MEASPROCXDSBASE;                                 <<01813>>03818000
         TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                 <<01813>>03820000
              CLASS15'SUB0SIZE+CP'SEGCONTRACT;                 <<01813>>03822000
         ASMB(LSEA);                                           <<01813>>03824000
         TOS:=TOS+1;                                           <<01813>>03826000
         ASMB(SSEA;DDEL);                                      <<01813>>03828000
         END;                                                  <<01813>>03830000
   IF SIZE-ZVAL < 0 AND SIZE-ZVAL > -128 THEN                  <<01716>>03832000
         BEGIN                      <<IGNORE>>                          03834000
         TOS := ZVAL;                                                   03836000
         GO TO DONE0;                                                   03838000
         END;                                                           03840000
   PXFIX(X) := PXFIX(PXZ)+INC;                                          03842000
   TOS := DSTI'(INX);                                                   03844000
   TOS := (SZ+INC)&LSR(2);                                              03846000
   TOS.DSFLD := TOS;            <<NEW SIZE IN DESC>>                    03848000
   DSTI'(X) := TOS;             <<UPDATE DESC>>                         03850000
   TOS := ZVAL+INC; DUPLICATE;                                          03852000
   F(X) := F(F(QI)-8)+INC;      <<Z>>                                   03854000
   SET(Z);                                                              03856000
   MMSTAT(2,INX&LSR(2),14,SIZE);   <<ZSIZE CONTRACTION>>       <<01572>>03858000
   GOTO DONE0;                                                          03860000
   END;                                                                 03862000
<<WE MUST EXPAND THE (Z-DB) AREA IF WE ARRIVE HERE>>                    03864000
TOS := PXFIX(PXSTAK)-SZ;                                                03868000
TOS:=TOS LAND -128;                                            <<01695>>03870000
IF <= THEN                                                              03872000
   BEGIN                        <<EXCEPTIONAL CASE>>                    03874000
   DEL;                                                                 03876000
   CC := CCG;                                                           03878000
   TOS := ZVAL;                                                         03880000
   GO TO DONE0;                                                         03882000
   END;                                                                 03884000
IF S0 >= INC THEN ASSEMBLE(DEL) ELSE                                    03886000
   BEGIN                                                                03888000
   CC:=CCG;                                                             03890000
   INC:=TOS;                                                            03892000
   END;                                                                 03894000
IF (LOGICAL(127+SZ+INC) LAND -128)>=LOGICAL(PXFIX(PXVIRT)) THEN<<01695>>03896000
   BEGIN                        <<EXPAND VDS>>                          03898000
   CC:=CCL;                                                             03900000
   TOS:=ZVAL;                                                           03902000
   GO TO DONE0;                                                         03904000
   END;                                                                 03906000
IF GCLASSENABLEDMASK.CLASS0 THEN                                        03908000
   BEGIN  <<MEASURE DB-Z EXPANSION>>                                    03910000
   TOS:=MEASSTATXDSBANK;                                                03912000
   TOS:=MEASSTATXDSBASE;                                                03914000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPDBZEXPAND;                  <<RAY.V>>03916000
   ASMB(LSEA);                                                          03918000
   TOS:=TOS+1;                                                          03920000
   ASMB(SSEA;DDEL);                                                     03922000
   END;                                                                 03924000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01813>>03926000
   BEGIN <<PROCESS LEVEL SEG (DB-Z) EXPANSION>>                <<01813>>03928000
   TOS:=MEASPROCXDSBANK;                                       <<01813>>03930000
   TOS:=MEASPROCXDSBASE;                                       <<01813>>03932000
   TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                       <<01813>>03934000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPANSION;                  <<01813>>03936000
   ASMB(LSEA);                                                 <<01813>>03938000
   TOS:=TOS+1;                                                 <<01813>>03940000
   ASMB(SSEA;DDEL);                                            <<01813>>03942000
   END;                                                        <<01813>>03944000
<<STUFF AWAY REASON STOPPED IN PCBX OF PROCESS>>               <<01813>>03946000
<<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>        <<01813>>03948000
TOS:=ICS(-ICSSTKBANKCELL);                                     <<01813>>03950000
TOS:=ICS(-ICSSTKBASECELL)+PXGLOBSIZE+MEASSTOPREASON'IDX;       <<01813>>03952000
TOS:=STOPSEGFAULT;                                             <<01813>>03954000
ASMB(SSEA;DDEL);                                               <<01813>>03956000
NEW'Z := PXFIX(PXZ)+INC;                                                03958000
TOS:=CDB;                                                               03960000
ASMB(XCHD;DDEL);                                                        03962000
<<STORE AWAY THE INFO FOR THE EXPANSION>>                               03964000
                                                                        03966000
GENSPECREQ(INX&LSR(2),(SZ+INC)&LSR(2),0,0);                    <<01695>>03968000
                                                                        03970000
TOS:=INX&LSR(2); <<SEGIDENT>>                                           03972000
TOS:=ABSOLUTE(CPCB)-SYSBASE;                                            03974000
SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                                   03976000
MMSTAT(2,INX&LSR(2),13,SIZE);  <<ZSIZE EXPANSION>>             <<01572>>03978000
WAIT(MEMORYWAITCODE,MEMTRAP);                                           03980000
<< REQUEST GRANTED; ADJUST Z TO NEW Z VALUE >>                          03982000
PDISABLE;                                                               03984000
CDB:= SETDBTOSTACK;                                                     03986000
TOS:=NEW'Z;                                                             03988000
ASSEMBLE(DUP,DUP;                                                       03990000
         DUP   );                                                       03992000
PXFIX(PXZ):=TOS;                                                        03994000
ICS'GLOBAL'Z:=TOS;                                                      03996000
SET(Z);                                                                 03998000
<<COMPUTE NEW Z-DL AND STORE IN PXFIXED IF > PREV MAX>>        <<01777>>04000000
PUSH(Z,DL);                                                    <<01777>>04002000
ASMB(SUB);                                                     <<01777>>04004000
IF S0 > PXFIX(PXMAXSTACK) THEN PXFIX(PXMAXSTACK):=             <<01777>>04006000
   TOS ELSE ASMB(DEL);                                         <<01777>>04008000
<< NOTE, THERE IS STILL ONE NEW'Z ON TOS >>                             04010000
                                                                        04012000
DONE0:                                                                  04014000
                                                                        04016000
TOS := CDB;                                                             04018000
ASMB(XCHD); DDEL;                                                       04020000
DSTI'(INX).ABSENTFLAG:=0;                                               04022000
PENABLE;                                                                04024000
                                                                        04026000
DONE:                                                                   04028000
                                                                        04030000
ZSIZE := TOS;                  <<RETURN SIZE TO CALLER>>                04032000
RESETCRITICAL(CRIT);                                                    04034000
STATUS.CCFLD := CC;                                                     04036000
ERROREXIT(ERREX,0,0);                                                   04038000
END <<ZSIZE>> ;                                                         04040000
                                                                        04042000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : ALT PX FILE SIZE"              04044000
                                                                        04046000
COMMENT  THIS PROCEDURE IS CALLED BY THE FILE SYSTEM TO EXPAND          04048000
         CONTRACT THE PXFILE AREA IN THE PCBX. INC IS THE CHANG         04050000
         IN SIZE REQUIRED. INC WILL BE ROUNDED UP TO AN INTEGRA         04052000
         MULTIPLE OF 128 WORDS. FOR EXAMPLE, IF THE REQUEST IS          04054000
         TO EXPAND THE AREA BY LESS THAN 128 WORDS, THE AREA            04056000
         WILL BE INCREASED BY 128 WORDS. IF THE REQUEST WAS TO          04058000
         REDUCE THE AREA BY LESS THAN 128 WORDS, THE AREA SIZE          04060000
         WILL REMAIN THE SAME.                                          04062000
         ;                                                              04064000
                                                                        04066000
INTEGER PROCEDURE ALTPXFILESIZE(INC);                                   04068000
VALUE      INC;                                                         04070000
INTEGER    INC;                                                         04072000
OPTION     UNCALLABLE,PRIVILEGED;                                       04074000
                                                                        04076000
BEGIN                                                                   04078000
INTEGER  POINTER   PDL,           <<POINTER TO DL BASE>>                04080000
                   PCBX,          <<POINTER TO PCBX BASE>>              04082000
                   PXFIX,         <<POINTER TO PXFIXED BASE>>           04084000
                   PXFILE;        <<POINTER TO PXFILE BASE>>            04086000
INTEGER RELPAGECNT,RELWORDCNT,WORDSREQUIRED,PAGESREQUIRED,              04088000
        REQUESTEDINC,NEWSZ,RBRELSOURCE,OLDSTKDL,                        04090000
        OLDDLTOPXFILEDISP,SOURCE;                                       04092000
INTEGER  INX,SZ,TOTAL,MAXINC,ML,CRIT,LCSW;                              04094000
DOUBLE   CDB;                                                           04096000
LOGICAL  REF;                                                           04098000
EQUATE   PXFILECODE=8,                                                  04100000
         PXSTAK    =13,                                                 04102000
         PXVIRT    =20,                                                 04104000
         EXTRA     =1152;                                               04106000
                                                                        04108000
SUBROUTINE SETPOINTERS;                                                 04110000
                                                                        04112000
BEGIN                                                                   04114000
CDB := SETDBTOSTACK;                                                    04116000
@PCBX := @PDL(-PDL(-1));                                                04118000
@PXFIX := @PDL(-PDL(-2));                                               04120000
@PXFILE := @PDL(-PDL(-3));                                              04122000
END <<SETPOINTERS>> ;                                                   04124000
                                                                        04126000
SUBROUTINE CHANGEALL;                                                   04128000
                                                                        04130000
BEGIN                                                                   04132000
TOS := INC; DUPLICATE;                                                  04134000
PXFILE := TOS+PXFILE;          <<D-C>>                                  04136000
DUPLICATE;                                                              04138000
PCBX := TOS+PCBX;              <<DL-A>>                                 04140000
DUPLICATE;                                                              04142000
PDL(X) := TOS+PDL(-1);         <<DL-A>>                                 04144000
DUPLICATE;                                                              04146000
PDL(X) := TOS+PDL(-2);         <<DL-B>>                                 04148000
DUPLICATE;                                                              04150000
PDL(X) := TOS+PDL(-3);         <<DL-C>>                                 04152000
<< CHECK TO INSURE RESULTANT MAXDATA NOT TOO BIG >>                     04154000
TOS := TOS+PXFIX(PXSTAK);                                               04156000
TOS := STACK'LIMIT;                                                     04158000
ASMB(DDUP,CMP);                                                         04160000
IF > THEN ASMB(XCH);                                                    04162000
DEL;                                                                    04164000
PXFIX(X) := TOS;                                                        04166000
END <<CHANGEALL>> ;                                                     04168000
                                                                        04170000
                                                                        04172000
IF ICS(-ICSPDISABLECNTCELL) > 0 THEN                           <<02092>>04174000
                                                               <<02092>>04176000
   COMMENT:  The purpose of the following code is to cover up  <<02092>>04178000
             a pdisable problem in which an interrupt handler  <<02092>>04180000
             appears to execute a pdisable without a           <<02092>>04182000
             corresponding penable.  This strange problem      <<02092>>04184000
             always appears to leave the pdisable count at 1.  <<02092>>04186000
             If this condition is met, we shall execute a      <<02092>>04188000
             penable on behalf of the defective software       <<02092>>04190000
             [a small prayer is in order here] and continue    <<02092>>04192000
             execution.  Otherwise we shall HALT the machine.  <<02092>>04194000
             Previously, the software crashed the machine      <<02092>>04196000
             with a SUDDENDEATH(634).  When this problem is    <<02092>>04198000
             corrected the SUDDENDEATH should be implemented;  <<02092>>04200000
                                                               <<02092>>04202000
   IF ICS(-ICSPDISABLECNTCELL) = 1 THEN                        <<02092>>04204000
      PENABLE   <<It's a miracle>>                             <<02092>>04206000
   ELSE                                                        <<02092>>04208000
      IF TRUE THEN                                             <<02092>>04210000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02092>>04212000
      ELSE                                                     <<02092>>04214000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02092>>04216000
ALTPXFILESIZE := 0;                                                     04218000
FORCESTKO;                                                              04220000
TRAPSOFF;                                                               04222000
CRIT := SETCRITICAL;                                                    04224000
                                                                        04226000
AGAIN:                                                                  04228000
                                                                        04230000
PUSH(DL);                                                               04232000
@PDL := TOS;                                                            04234000
INX := PCBI'(PIX+3).(1:10)&LSL(2);                                      04236000
TOS:=ABSOLUTE(ABSOLUTE(QI)-ICSSTKDSTCELL);                              04238000
DISABLE;                                                       <<02061>>04240000
GETDATASEGCHANGESTATE(*);                                               04242000
ENABLE;                                                        <<02061>>04244000
IF < THEN                                                               04246000
   BEGIN                        <<CORE RES,LOCKED OR FROZEN>>           04248000
                                                                        04250000
   ERRORL:                                                              04252000
                                                                        04254000
   ALTPXFILESIZE := 1;                                                  04256000
   GOTO FIN;                                                            04258000
   END;                                                                 04260000
IF > THEN GO AGAIN;           <<IT WAS IMPEDED>>                        04262000
<<THERE IS A PDISABLE IN EFFECT AT THIS POINT>>                         04264000
SETPOINTERS;                                                            04266000
SZ := DSTI'(INX).DSFLD&LSL(2); <<SEGMENT SIZE>>                         04268000
TOS := INC;                    <<CHANGE VALUE>>                         04270000
IF <= THEN                                                              04272000
   BEGIN                        <<CONTRACT PXFILE AREA>>                04274000
   TOS:=-S0;                                                            04276000
   TOS:=TOS&LSR(PAGEPOWER);                                             04278000
   IF = THEN                                                            04280000
      BEGIN <<NOT AT LEAST A PAGE RELEASE>>                             04282000
      GO TO DEFRL;                                                      04284000
      END                                                               04286000
   ELSE                                                                 04288000
      BEGIN <<WILL CONTRACT NOW>>                                       04290000
      MMSTAT(2,INX&LSR(2),10,INC); <<PXFILE CONTRACTION>>      <<01572>>04292000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  04294000
         BEGIN  <<MEASURE PXFILE CONTRACTION EVENT>>                    04296000
         TOS:=MEASSTATXDSBANK;                                          04298000
         TOS:=MEASSTATXDSBASE;                                          04300000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'PXFILECONTRACT;           <<RAY.V>>04302000
         ASMB(LSEA);                                                    04304000
         TOS:=TOS+1;                                                    04306000
         ASMB(SSEA;DDEL);                                               04308000
         END;                                                           04310000
      IF GCLASSENABLEDMASK.CLASS15 THEN                        <<01813>>04312000
         BEGIN <<PROCESS LEVEL SEG (PXFILE) CONTRACTION>>      <<01813>>04314000
         TOS:=MEASPROCXDSBANK;                                 <<01813>>04316000
         TOS:=MEASPROCXDSBASE;                                 <<01813>>04318000
         TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                 <<01813>>04320000
              CLASS15'SUB0SIZE+CP'SEGCONTRACT;                 <<01813>>04322000
         ASMB(LSEA);                                           <<01813>>04324000
         TOS:=TOS+1;                                           <<01813>>04326000
         ASMB(SSEA;DDEL);                                      <<01813>>04328000
         END;                                                  <<01813>>04330000
      RELPAGECNT:=S0;                                                   04332000
      RELWORDCNT:=S0&LSL(PAGEPOWER);                                    04334000
      INC:=-RELWORDCNT;                                                 04336000
      IF (PXFILE+INC) < 0 THEN                                          04338000
         BEGIN                                                          04340000
         ALTPXFILESIZE := 1;                                            04342000
         GOTO DEFRL;                                                    04344000
         END;                                                           04346000
      TOS:=DST(INX+2); <<BANK>>                                         04348000
      TOS:=DST(X:=X+1);                                                 04350000
      TOS:=TOS+SBTOSTKDBDISP;                                           04352000
      ASMB(LSEA);                                                       04354000
      TOS:=TOS-RELWORDCNT;                                              04356000
      ASMB(SSEA); <<NEW STACK BASE RELATIVE DB>>                        04358000
      TOS:=TOS+STKDBTOSTKDLDISP;                                        04360000
      OLDSTKDL:=S0;                                                     04362000
      ASMB(LSEA);                                                       04364000
      TOS:=TOS-RELWORDCNT;                                              04366000
      ASMB(SSEA);  <<NEW STK REL DL>>                                   04368000
      TOS:=TOS+STKDLTOSBDISP+OLDSTKDL-1;                                04370000
      ASMB(LSEA); <<DL-A>>                                              04372000
      TOS:=TOS-RELWORDCNT;                                              04374000
      ASMB(SSEA);                                                       04376000
      TOS:=TOS-1;                                                       04378000
      ASMB(LSEA);                                                       04380000
      TOS:=TOS-RELWORDCNT;                                              04382000
      ASMB(SSEA);                                                       04384000
      TOS:=TOS-1;                                                       04386000
      ASMB(LSEA);                                                       04388000
      OLDDLTOPXFILEDISP:=S0;                                            04390000
      TOS:=TOS-RELWORDCNT;                                              04392000
      ASMB(SSEA);                                                       04394000
      TOS:=TOS+3;                                                       04396000
      TOS:=TOS+3-OLDDLTOPXFILEDISP;                                     04398000
      ASMB(LSEA);                                                       04400000
      TOS:=TOS-RELWORDCNT; <<NEW PXFILE LENGTH>>                        04402000
      IF < THEN SUDDENDEATH(633);                              <<01636>>04404000
      RBRELSOURCE:=OLDSTKDL-OLDDLTOPXFILEDISP+S0;                       04406000
      RELINTERNALREGION(RELPAGECNT,RBRELSOURCE);                        04408000
                                                                        04410000
      DEFRL :                                                           04412000
                                                                        04414000
      DISABLE;                                                          04416000
      DSTI'(INX).ABIT := 0;        <<MARK PRESENT>>                     04418000
      ENABLE;                                                           04420000
      GO QUIT;                                                          04422000
      END;                                                              04424000
   END;                                                                 04426000
                                                                        04428000
<<EXPAND PXFILE AREA>>                                                  04430000
<<ROUND UP REQUEST SO THAT RESULTANT STACK WILL FIT WELL>>              04432000
<<IN A NEW REGION-I.E. MINIMAL INTERNAL FRAGMENTATION>>                 04434000
                                                                        04436000
REQUESTEDINC:=TOS;                                                      04438000
NEWSZ:=SZ+INC;                                                          04440000
IF NEWSZ > STACK'LIMIT THEN                                             04442000
   BEGIN                                                                04444000
   ALTPXFILESIZE:=2;                                                    04446000
   GO TO DEFRL;                                                         04448000
   END;                                                                 04450000
TOS:=LOGICAL(SZ+INC+127) LAND -128;                                     04452000
IF TOS >= LOGICAL(PXFIX(PXVIRT)) THEN                                   04454000
   BEGIN                        <<MUST EXPAND VDS>>                     04456000
   ALTPXFILESIZE := 3;                                                  04458000
   GOTO DEFRL;                                                          04460000
   END;                                                                 04462000
IF GCLASSENABLEDMASK.CLASS0 THEN                                        04464000
   BEGIN  <<MEASURE PXFILE EXP EVENT>>                                  04466000
   TOS:=MEASSTATXDSBANK;                                                04468000
   TOS:=MEASSTATXDSBASE;                                                04470000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPPXFILEEXPAND;               <<RAY.V>>04472000
   ASMB(LSEA);                                                          04474000
   TOS:=TOS+1;                                                          04476000
   ASMB(SSEA;DDEL);                                                     04478000
   END;                                                                 04480000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01813>>04482000
   BEGIN <<PROCESS LEVEL SEG (PXFILE) EXPANSION>>              <<01813>>04484000
   TOS:=MEASPROCXDSBANK;                                       <<01813>>04486000
   TOS:=MEASPROCXDSBASE;                                       <<01813>>04488000
   TOS:=TOS+((F(CPCB)-F(PCBB))/PCBSIZE)*                       <<01813>>04490000
        CLASS15'SUB0SIZE+CP'STOPSEGEXPANSION;                  <<01813>>04492000
   ASMB(LSEA);                                                 <<01813>>04494000
   TOS:=TOS+1;                                                 <<01813>>04496000
   ASMB(SSEA;DDEL);                                            <<01813>>04498000
   END;                                                        <<01813>>04500000
<<STUFF AWAY REASON STOPPED IN PCBX OF PROCESS>>               <<01813>>04502000
<<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>        <<01813>>04504000
TOS:=ICS(-ICSSTKBANKCELL);                                     <<01813>>04506000
TOS:=ICS(-ICSSTKBASECELL)+PXGLOBSIZE+MEASSTOPREASON'IDX;       <<01813>>04508000
TOS:=STOPSEGFAULT;                                             <<01813>>04510000
ASMB(SSEA;DDEL);                                               <<01813>>04512000
<<FIX PCBX PTRS>>                                                       04514000
                                                                        04516000
TOS:=DST(X:=INX+2);                                                     04518000
TOS:=DST(X:=X+1);                                                       04520000
TOS:=TOS+SBTOSTKDBDISP;                                                 04522000
ASMB(LSEA);                                                             04524000
TOS:=TOS+INC;                                                           04526000
ASMB(SSEA); <<NEW STACK BASE RELATIVE DB>>                              04528000
TOS:=TOS+STKDBTOSTKDLDISP;                                              04530000
ASMB(LSEA);                                                             04532000
SOURCE:=S0+PXFILE-PDL(-3);                                              04534000
<<STORE AWAY THE INFO FOR THE EXPANSION>>                               04536000
                                                                        04538000
GENSPECREQ(INX&LSR(2),NEWSZ&LSR(2),INC,SOURCE);                         04540000
                                                                        04542000
CHANGEALL;                                                              04544000
TOS:=CDB;                                                               04546000
ASMB(XCHD;DDEL);                                                        04548000
TOS:=INX&LSR(2); <<SEGIDENT>>                                           04550000
TOS:=ABSOLUTE(CPCB)-SYSBASE;                                            04552000
SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                                   04554000
MMSTAT(2,INX&LSR(2),9,INC);        <<PXFILE EXPANSION  >>      <<01572>>04556000
WAIT(MEMORYWAITCODE,MEMTRAP);                                           04558000
GO FIN;                                                                 04560000
                                                                        04562000
                                                                        04564000
QUIT:                                                                   04566000
                                                                        04568000
TOS := CDB;                                                             04570000
ASMB(XCHD); DDEL;                                                       04572000
PENABLE;                                                                04574000
                                                                        04576000
FIN:                                                                    04578000
                                                                        04580000
RESETCRITICAL(CRIT);                                                    04582000
IF ICS(-ICSPDISABLECNTCELL) > 0 THEN                           <<02092>>04584000
                                                               <<02092>>04586000
   COMMENT:  The purpose of the following code is to cover up  <<02092>>04588000
             a pdisable problem in which an interrupt handler  <<02092>>04590000
             appears to execute a pdisable without a           <<02092>>04592000
             corresponding penable.  This strange problem      <<02092>>04594000
             always appears to leave the pdisable count at 1.  <<02092>>04596000
             If this condition is met, we shall execute a      <<02092>>04598000
             penable on behalf of the defective software       <<02092>>04600000
             [a small prayer is in order here] and continue    <<02092>>04602000
             execution.  Otherwise we shall HALT the machine.  <<02092>>04604000
             Previously, the software crashed the machine      <<02092>>04606000
             with a SUDDENDEATH(634).  When this problem is    <<02092>>04608000
             corrected the SUDDENDEATH should be implemented;  <<02092>>04610000
                                                               <<02092>>04612000
   IF ICS(-ICSPDISABLECNTCELL) = 1 THEN                        <<02092>>04614000
      PENABLE   <<It's a miracle>>                             <<02092>>04616000
   ELSE                                                        <<02092>>04618000
      IF TRUE THEN                                             <<02092>>04620000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02092>>04622000
      ELSE                                                     <<02092>>04624000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02092>>04626000
END <<ALTPXFILESIZE>> ;                                                 04628000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : MAPCHANGE"                     04630000
<<***************************************************************>>     04632000
                                                                        04634000
COMMENT  SET OR RESET BITS IN THE PXFIXED BITMAP;                       04636000
PROCEDURE MAPCHANGE(MAP,SB,N,FLG);                                      04638000
   VALUE      MAP,SB,N,FLG;                                             04640000
   INTEGER    POINTER MAP;                                              04642000
   INTEGER    SB,N;                                                     04644000
   LOGICAL    FLG;                                                      04646000
   OPTION     UNCALLABLE,PRIVILEGED,INTERNAL;                           04648000
   BEGIN                                                                04650000
         IF FLG THEN                                                    04652000
          TOS := %17400                 <<TSBC>>                        04654000
         ELSE                                                           04656000
          TOS := %17300;                <<TRBC>>                        04658000
         TOS := N-1;                                                    04660000
         WHILE >= DO                                                    04662000
          BEGIN                                                         04664000
           TOS := SB&LSR(4);                                            04666000
           ASMB(DUP,STAX);                                              04668000
           TOS := MAP(X);               <<WORD CONTAING BIT>>           04670000
           X := SB.(12:4);              <<BIT POSITION>>                04672000
           ASMB(XEQ 3;STBX,DELB);                                       04674000
           MAP(X) := TOS;                                               04676000
           SB := SB+1;                                                  04678000
           TOS := TOS-1;                                                04680000
          END;                                                          04682000
   END <<MAPCHANGE>> ;                                                  04684000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : RELEASE PX SEG"                04686000
<<***************************************************************>>     04688000
                                                                        04690000
COMMENT  RELEASE PCBX(PXFIXED), DATA SEGMENT SPACE;                     04692000
PROCEDURE RELPXSEG(L,SIZE);                                             04694000
   VALUE      L,SIZE;                                                   04696000
   INTEGER    L,SIZE;                                                   04698000
   OPTION     UNCALLABLE,PRIVILEGED;                                    04700000
   BEGIN                                                                04702000
     INTEGER POINTER                                                    04704000
              PDL,                     <<POINTER TO DL>>                04706000
              PXFIX=PDL,               <<POINTER TO PXFIXED>>           04708000
              MAP;                     <<POINTER TO BIT MAP>>           04710000
     EQUATE   PXMAP=76;                                        <<02030>>04712000
         SIZE := (SIZE+7)&LSR(3);       <<BIT COUNT>>                   04714000
         PDISABLE;                                                      04716000
         PUSH(DL);                                                      04718000
         @PDL := TOS;                                                   04720000
         @PXFIX := @PDL(-PDL(-2));                                      04722000
         @MAP := @PXFIX(PXMAP);                                         04724000
         MAPCHANGE(MAP,(L-PXMAP-4)&LSR(3),SIZE,1);                      04726000
         PXFIX(L) := 0;                                                 04728000
         MOVE PXFIX(L+1) := PXFIX(L),(SIZE&LSL(3)-1);                   04730000
         PENABLE;                                                       04732000
   END <<RELPXSEG>> ;                                                   04734000
$PAGE "SEGMENT EXPANSIONS/CONTRACTIONS : GET PX SEG"                    04736000
<<***************************************************************>>     04738000
                                                                        04740000
COMMENT  GET PCBX(PXFIXED) DATA SEGMENT SPACE;                          04742000
LOGICAL PROCEDURE GETPXSEG(SIZE);                                       04744000
   VALUE      SIZE;                                                     04746000
   INTEGER    SIZE;                                                     04748000
   OPTION     UNCALLABLE,PRIVILEGED;                                    04750000
   BEGIN                                                                04752000
     INTEGER  MAX,V,SB,B,INX,CRIT;                                      04754000
     INTEGER OLDSIZE,NEWSIZE;                                           04756000
     INTEGER  POINTER                                                   04758000
              PDL,                     <<POINTER TO DL>>                04760000
              PCBX,                    <<POINTER TO PCBX>>              04762000
              PXFIX,                   <<POINTER TO PXFIXED>>           04764000
              MAP;                     <<POINTER TO BIT MAP>>           04766000
     EQUATE   PXMAP=76,                                        <<01558>>04768000
              PXFECODE  =7;                                             04770000
         SIZE := (SIZE+7)&LSR(3);       <<NO. OF BITS>>                 04772000
         CRIT := SETCRITICAL;                                           04774000
         FORCESTKO;                                                     04776000
START  : PDISABLE;                                                      04778000
         PUSH(DL);                                                      04780000
         @PDL := TOS;                                                   04782000
         @PCBX := @PDL(-PDL(-1));                                       04784000
         @PXFIX := @PDL(-PDL(-2));                                      04786000
         @MAP := @PXFIX(PXMAP);                                         04788000
SCANL  : MAX := PDL(-4)&LSL(4);        <<EXPANSION AREA SIZE>>          04790000
         SB := B := V := 0;                                             04792000
AGAIN  : TOS := B; DUPLICATE;                                           04794000
         TOS := MAP(TOS&LSR(4));       <<WORD WITH BIT>>                04796000
         EXCHANGE;                                                      04798000
         X := TOS.(12:4);              <<BIT POSITION>>                 04800000
         ASMB(TBC 0,X); DEL;                                            04802000
         IF <> THEN                                                     04804000
          BEGIN                       <<ON>>                            04806000
           IF (V:=V+1) = SIZE THEN                                      04808000
            GOTO FOUNDL;                                                04810000
          END                                                           04812000
         ELSE                                                           04814000
          BEGIN                       <<OFF>>                           04816000
           SB := B+1;                                                   04818000
           V := 0;                                                      04820000
          END;                                                          04822000
         IF (B:=B+1) >= MAX THEN                                        04824000
          BEGIN <<FAILS>>                                      <<00.06>>04826000
           MAP(MAX&LSR(4)) := -1;      <<INIT THE MAP>>        <<00.06>>04828000
           PENABLE;                                            <<00.06>>04830000
           GO TO EXPANDL;              <<GET MORE SPACE>>      <<00.06>>04832000
          END;                                                 <<00.06>>04834000
         GO AGAIN;                                                      04836000
FOUNDL : <<LOCATED SPACE IF WE GET HERE>>                               04838000
         GETPXSEG := SB&LSL(3)+PXMAP+4;                                 04840000
         MAPCHANGE(MAP,SB,SIZE,0);    <<RESET BITS>>                    04842000
         GO QUIT;                                                       04844000
EXPANDL: <<MUST PHYSICALLY EXPAND AREA IF WE GET HERE>>                 04846000
         IF PDL(-4) >= 3 THEN   <<3 IS LIMIT>>               <<01.02>>  04848000
           BEGIN                                             <<01.02>>  04850000
             GETPXSEG:=-1;                                   <<01.02>>  04852000
             GO TO QUIT1;                                    <<01.02>>  04854000
           END;                                              <<01.02>>  04856000
         INX := PCBI'(PIX+3).(1:10)&LSL(2);                             04858000
         OLDSIZE:=(DST(INX).DATASIZEFIELD)&LSL(2);                      04860000
         NEWSIZE:=OLDSIZE+128;                                          04862000
         DISABLE;                                              <<02061>>04864000
         GETDATASEGCHANGESTATE(INX&LSR(2));                             04866000
         ENABLE;                                               <<02061>>04868000
         IF < THEN     << C. RES, LOCKED, OR FROZEN >>         <<00593>>04870000
           BEGIN                                               <<00593>>04872000
             GETPXSEG := 0;                                    <<00593>>04874000
             GOTO QUIT1;                                       <<00593>>04876000
           END;                                                <<00593>>04878000
         IF > THEN GOTO EXPANDL;      <<IT WAS IMPEDED>>                04880000
         <<THERE IS A PDISABLE IN EFFECT AT THIS POINT>>                04882000
         MAX := PDL(-1)-PDL(-3);      <<C-A>>                           04884000
                                                                        04886000
<<STORE AWAY THE INFO FOR THE EXPANSION>>                               04888000
                                                                        04890000
GENSPECREQ(INX&LSR(2),NEWSIZE&LSR(2),128,MAX);                          04892000
                                                                        04894000
                                                                        04896000
         <<FIX PCBX PTRS>>                                              04898000
                                                                        04900000
         TOS:=DST(X:=INX+2);                                            04902000
         TOS:=DST(X:=X+1);                                              04904000
         TOS:=TOS+SBTOSTKDBDISP;                                        04906000
         ASMB(LSEA);                                                    04908000
         TOS:=TOS+128;                                                  04910000
         ASMB(SSEA); <<NEW STACK BASE RELATIVE DB>>                     04912000
         TOS:=TOS+STKDBTOSTKDLDISP;                                     04914000
         ASMB(LSEA);                                                    04916000
         TOS:=TOS+128;                                                  04918000
         ASMB(SSEA);                                                    04920000
         TOS:=TOS+STKDLTOPXFIXEDDISP;                                   04922000
         ASMB(LSEA);                                                    04924000
         TOS:=TOS+128;                                                  04926000
         ASMB(SSEA);                                                    04928000
         PDL(-1):=PDL(-1)+128;                                          04930000
         PDL(-2):=PDL(-2)+128;                                          04932000
         PDL(-4):=PDL(-4)+1; <<#SECTORS>>                               04934000
                                                                        04936000
         <<SEND SCHEDULER A MESSAGE TO GET RID OF STACK>>               04938000
                                                                        04940000
         TOS:=INX&LSR(2); <<SEGIDENT>>                                  04942000
         TOS:=ABSOLUTE(CPCB)-SYSBASE;                                   04944000
         SENDMSG(SCHEDPIN,MAKEABSENTPORT,2,0);                          04946000
                                                                        04948000
         <<WAIT ON A MEMORY WAIT, THEN START OVER>>                     04950000
                                                                        04952000
         MMSTAT(2,INX&LSR(2),8,SIZE);  <<PXFIXED EXPANSION>>   <<01572>>04954000
         WAIT(MEMORYWAITCODE,MEMTRAP);                                  04956000
         GOTO START;                                                    04958000
QUIT   : PENABLE;                                                       04960000
QUIT1  : RESETCRITICAL(CRIT);                                  <<00.06>>04962000
   END <<GETPXSEG>> ;                                                   04964000
$PAGE "PROCESS EXTRA DATA SEGMENT MANAGEMENT"                           04966000
<<***************************************************************>>     04968000
                                                                        04970000
                                                                        04972000
                                                                        04974000
            << >>                                                       04976000
            <<EXTRA DST MANIPULATION IN PCBX                            04978000
               - 0   GET ENTRY                                          04980000
               - 1   RELEASE ENTRY                                      04982000
               - 2   EXTRACT ENTRY CONTENTS                             04984000
               - 3   SEARCH,VALIDATE,AND RETURN INDEX                   04986000
               - 4   SEARCH,VALIDATE,AND RETURN DST#                    04988000
               - 5   RETURN NEXT ENTRY AND RELEASE                      04990000
               - 6   CHECK ENTRY USING DST#                             04992000
               - 7   EXTRACT COMPLETE ENTRY CONTENTS             C+.09  04994000
               - N   INSERT ENTRY CONTENTS     >>                       04996000
            << >>                                                       04998000
LOGICAL PROCEDURE PXDSEG(FUNC,PARM);                                    05000000
  VALUE   FUNC,PARM;                                                    05002000
  LOGICAL FUNC,PARM;                                                    05004000
  OPTION  PRIVILEGED,UNCALLABLE;                                        05006000
  BEGIN                                                                 05008000
          << >>                                                         05010000
          EQUATE     PXDST=7,                                           05012000
                     PXDSZ=8,                                           05014000
                     PXDSM =PXDSZ - 1;                         <<00.06>>05016000
          DEFINE     LINKF =(0:12)#,                                    05018000
                     COUNTF=(12:4)#,                                    05020000
                     TYPEF =(0:2)#,                                     05022000
                     INDEXF=(2:14)#,                                    05024000
                     NPMAX =F(%1112)#,                         <<00.06>>05026000
                     CRAPF =(0:6)#;                                     05028000
          INTEGER ARRAY STAK(*)=Q+0;                                    05030000
          INTEGER POINTER PBASE,P;                                      05032000
          LOGICAL PRIV,FLAG;                                            05034000
          INTEGER L,I,M,D,DX,IX;                                        05036000
          SWITCH SW:= L0,                                               05038000
                     L1,                                                05040000
                     L2,                                                05042000
                     L3,                                                05044000
                     L3,                                                05046000
                     L5,                                                05048000
                     L6,                                       <<C+.09>>05050000
                     L2;                                       <<C+.09>>05052000
          << >>                                                         05054000
  SUBROUTINE SETUP;                                                     05056000
    BEGIN                                                               05058000
          PUSH(DL);                                                     05060000
          @P:=TOS;                                                      05062000
          @PBASE:=@P-P(-2);                                             05064000
          @P:=@PBASE(PXDST);                                            05066000
    END;                                                                05068000
          << >>                                                         05070000
  LOGICAL SUBROUTINE BUMP;                                              05072000
    BEGIN                                                               05074000
          L:=L-P.COUNTF;                                                05076000
          IF P.LINKF=0 THEN RETURN;                                     05078000
          @P:=@PBASE+P.LINKF;                                           05080000
          BUMP:=TRUE;                                                   05082000
    END;                                                                05084000
          << >>                                                         05086000
  LOGICAL SUBROUTINE POINT(IX);                                         05088000
    VALUE   IX;                                                         05090000
    INTEGER IX;                                                         05092000
    BEGIN                                                               05094000
          L:=IX.INDEXF;                                                 05096000
          WHILE L>P.COUNTF DO                                           05098000
               IF NOT BUMP THEN RETURN;                                 05100000
          @P:=@P(L);                                                    05102000
          POINT:=TRUE;                                                  05104000
    END;                                                                05106000
          << >>                                                         05108000
  LOGICAL SUBROUTINE XCAN(DX);                                          05110000
    VALUE   DX;                                                         05112000
    INTEGER DX;                                                         05114000
    BEGIN                                                               05116000
          L:=0;                                                         05118000
          M:=0;                                                         05120000
    SCN:  I:=0;                                                         05122000
          WHILE (I:=I+1)<=P.COUNTF DO                                   05124000
               BEGIN IF DX=-1 THEN IF P(I)<>0 THEN GOTO SCL;            05126000
                     IF LOGICAL(P(I).PRIVF) THEN M:=M+1;                05128000
                     IF DX=P(I).DSEGF THEN GOTO SCL;                    05130000
               END;                                                     05132000
          IF BUMP THEN GOTO SCN ELSE RETURN;                            05134000
    SCL:  @P:=@P(I);                                                    05136000
          TOS:=P;                                                       05138000
          TOS.INDEXF:=I-L;                                              05140000
          L:=TOS;                                                       05142000
          XCAN:=TRUE;                                                   05144000
    END;                                                                05146000
          << >>                                                         05148000
          PRIV:=STAK(-STAK-1).PRIVF;                                    05150000
          SETUP;                                                        05152000
          GOTO SW(FUNC);                                                05154000
          GOTO LN;                                                      05156000
  L0:     FLAG:=XCAN(0);                                                05158000
          IF NOT PRIV THEN IF M=NPMAX THEN GOTO ZERO;                   05160000
          IF FLAG THEN                                                  05162000
               BEGIN TOS:=L;                                            05164000
                     IF NOT PRIV THEN TOS.PRIVF:=1;                     05166000
                     GOTO FIN;                                          05168000
               END;                                                     05170000
          D:=@P-@PBASE;                                                 05172000
          DX:=GETPXSEG(PXDSZ);                                          05174000
          IF DX < 0 THEN GOTO ZERO                             <<00593>>05176000
          ELSE IF DX = 0 THEN                                  <<00593>>05178000
            BEGIN  << STACK WAS FROZEN >>                      <<00593>>05180000
              TOS := -1;                                       <<00593>>05182000
              GOTO FIN;                                        <<00593>>05184000
            END;                                               <<00593>>05186000
          SETUP;                                                        05188000
          PBASE(D).LINKF:=DX;                                           05190000
          PBASE(DX) := PXDSM;  <<SET COUNT IN FIRST WORD>>     <<00.06>>05192000
          PBASE(DX+1) := 0;     <<CLEAR NEXT WORD>>            <<00.06>>05194000
          MOVE PBASE(DX+2) := PBASE(DX+1),(PXDSM-1); <<CLEAR>> <<00.06>>05196000
          GOTO L0;                                                      05198000
  L1:     IF POINT(PARM) THEN P:=0;                                     05200000
          GOTO ZERO;                                                    05202000
  L2:     IF NOT POINT(PARM) THEN GOTO ZERO;                            05204000
          TOS:=P.DSEGF;                                                 05206000
          IF FUNC=2 THEN GO TO FIN;                            <<C+.09>>05208000
          IF TOS=0 THEN TOS := 1   << 1 MEANS EMPTY. >>        <<C+.09>>05210000
                   ELSE TOS := P;  << COMPLETE CONTENTS >>     <<C+.09>>05212000
          GOTO FIN;                                                     05214000
  L3:     IF PARM.PRIVF = 1 THEN GOTO ZERO;                    <<00626>>05216000
          IF PARM.CRAPF <> 0                                   <<00626>>05218000
               THEN BEGIN IX:=-INTEGER(PARM);                           05220000
                          IF NOT POINT(IX) THEN GOTO ZERO;              05222000
                          IF IX.TYPEF<>P.TYPEF THEN GOTO ZERO;          05224000
                    END                                                 05226000
              ELSE BEGIN IF NOT PRIV THEN GOTO ZERO;                    05228000
                          IF NOT XCAN(PARM) THEN GOTO ZERO;             05230000
                          IX:=L;                                        05232000
                    END;                                                05234000
          IF FUNC=3                                                     05236000
               THEN  TOS:=IX                                            05238000
               ELSE  TOS:=P.DSEGF;                                      05240000
          GOTO FIN;                                                     05242000
  L5:     IF NOT XCAN(-1) THEN GOTO ZERO;                               05244000
          TOS:=P;                                                       05246000
          P:=0;                                                         05248000
          GOTO FIN;                                                     05250000
  L6:     IF NOT XCAN(PARM) THEN GOTO ZERO;                             05252000
          IF LOGICAL(L).PRIVF                                           05254000
               THEN TOS:=-L                                             05256000
               ELSE TOS:=PARM;                                          05258000
          GOTO FIN;                                                     05260000
  LN:     IF NOT POINT(PARM) THEN GOTO ZERO;                            05262000
          TOS:=PARM;                                                    05264000
          TOS.INDEXF:=FUNC;                                             05266000
          P:=TOS;                                                       05268000
          IF PARM.PRIVF                                                 05270000
               THEN  TOS:=-INTEGER(PARM)                                05272000
               ELSE  TOS:=FUNC;                                         05274000
          GOTO FIN;                                                     05276000
  ZERO:   TOS:=0;                                                       05278000
  FIN:    PXDSEG:=TOS;                                                  05280000
  END;                                                                  05282000
<<***************************************************************>>     05284000
                                                                        05286000
                                                                        05288000
                                                                        05290000
            << >>                                                       05292000
            <<ABORT PROCESS(FALSE)/MAIN(TRUE) EXTRA DATA SEGMENTS>>     05294000
            << >>                                                       05296000
PROCEDURE ABORTDSEG(MAIN);                                              05298000
  VALUE   MAIN;                                                         05300000
  LOGICAL MAIN;                                                         05302000
  OPTION PRIVILEGED,UNCALLABLE;                                         05304000
  BEGIN                                                                 05306000
    LOGICAL VAL, DSTX;                                         <<00428>>05308000
    INTEGER REFCNT;                                            <<00428>>05310000
                                                               <<00428>>05312000
    WHILE (VAL := PXDSEG (5, 0)) <> 0 DO                       <<00428>>05314000
      BEGIN                                                    <<00428>>05316000
        DSTX := VAL.DSEGF;                                     <<00428>>05318000
        IF VAL.SHARF THEN                                      <<00428>>05320000
          BEGIN                                                <<00428>>05322000
            REFCNT := XJDT (4, 0, DSTX);                       <<00428>>05324000
            IF REFCNT = 0 THEN SUDDENDEATH (160);              <<00428>>05326000
          END                                                  <<00428>>05328000
        ELSE                                                   <<00428>>05330000
          RELDATASEG (DSTX);                                   <<00428>>05332000
      END;                                                     <<00428>>05334000
                                                               <<00428>>05336000
    IF MAIN THEN                                               <<00428>>05338000
      WHILE (DSTX := XJDT (3, 0, 0)) <> 0                      <<00428>>05340000
        DO RELDATASEG (DSTX);                                  <<00428>>05342000
  END << ABORTDSEG >>;                                         <<00428>>05344000
<<***************************************************************>>     05346000
                                                                        05348000
                                                                        05350000
                                                               <<C+.09>>05352000
                                                               <<C+.09>>05354000
<<  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *   C+.09>>05356000
<< THE FOLLOWING PROCEDURE IS CALLED BY IMAGE/3000 TO INITIAL-   C+.09>>05358000
<<   IZE A RESERVED CELL IN THE PCBX WITH THE PLABEL OF A        C+.09>>05360000
<<   CLEANUP ROUTINE TO BE CALLED UPON PROCESS TERMINATION       C+.09>>05362000
<<   (FROM EXPIRE).  MUST BE CALLED WITH DB POINTING TO STACK.   C+.09>>05364000
<<  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *   C+.09>>05366000
                                                               <<C+.09>>05368000
PROCEDURE PCBXIMAGE(PLABEL);                                   <<C+.09>>05370000
  VALUE PLABEL;                                                <<C+.09>>05372000
  LOGICAL PLABEL;                                              <<C+.09>>05374000
  OPTION PRIVILEGED, UNCALLABLE;                               <<C+.09>>05376000
  BEGIN                                                        <<C+.09>>05378000
          << >>                                                <<C+.09>>05380000
          EQUATE     PXIMAGE = 34; << IMAGE PXFIXED CELL >>    <<C+.09>>05382000
          INTEGER POINTER P;                                   <<C+.09>>05384000
          << >>                                                <<C+.09>>05386000
          PUSH(DL);                     << POINT TO >>         <<C+.09>>05388000
          @P := TOS;                    <<  IMAGE   >>         <<C+.09>>05390000
          @P := @P - P(-2) + PXIMAGE;   <<   SLOT.  >>         <<C+.09>>05392000
          P := PLABEL;                  << INSERT VALUE. >>    <<C+.09>>05394000
  END; << PCBXIMAGE >>                                         <<C+.09>>05396000
                                                                        05398000
            << >>                                                       05400000
<<********************************************************>>            05402000
<<******  CALLABLE - CAPABILITY 2 - DATA SEGMENTS  *******>>            05404000
<<********************************************************>>            05406000
COMMENT:                                                       <<04509>>05408000
            << CREATE EXTRA DATA SEGMENT. RETURNS THE LOGICAL INDEX     05410000
               OF DATA SEGMENT. ALSO RETURNS LENGTH IF NEW ACCESS       05412000
               TO JOB GLOBAL DATA SEG.                                  05414000
               NOTE : PRIVILEGED USERS DO NOT NEED CLASS 2 CAP.         05416000
                       AND THE MAX NUMBER DOES NOT APPLY                05418000
                       ALSO IF LENGTH -VE THEN NO MAXDSEG CHECK         05420000
                                                                        05422000
               INDEX := LOGICAL INDEX OF DATA SEG                       05424000
               ID    =0 - PRIVATE DATA SEG                              05426000
                    <>0 - JOB GLOBAL DATA SEG. IF IT EXISTS             05428000
                           ALLOW ACCESS ELSE CREATE                     05430000
               LENGTH = SIZE OF DATA SEG (/<LENGTH<SYSTEM MAX)          05432000
                                                                        05434000
               CODE: CC=0 OK.                                           05436000
                     CC>0 OK. NO CREATE-JUST ACCESS                     05438000
                     CC<0 NO.  -ILLEGAL (0>=LENGTH>SYSMAX)              05440000
                                   INDEX:=%2000                         05442000
                               -MAX NUMBER OF DATA SEG                  05444000
                                   INDEX:=%2001                         05446000
                               -STORAGE RESOURCE UNAVAILABLE            05448000
                                   INDEX:=%2002                <<04509>>05450000
                               -STACK WAS FROZEN               <<04509>>05452000
                                   INDEX:=%2003                <<04509>>05454000
                               -NO ROOM IN JDT                 <<04509>>05456000
                                   INDEX:=%2004  >>;           <<04509>>05458000
<<********************************************************>>            05460000
            << >>                                                       05462000
PROCEDURE GETDSEG(INDEX,LENGTH,ID);                                     05464000
  VALUE   ID;                                                           05466000
  LOGICAL INDEX,ID;                                                     05468000
  INTEGER LENGTH;                                                       05470000
  OPTION  PRIVILEGED;                                                   05472000
  BEGIN                                                                 05474000
          EQUATE ERRN=130 , CAP2=%2 , EXITN=3;                          05476000
          EQUATE ERREX=[10/ERRN,6/EXITN];                               05478000
          DOUBLE CAP;                                                   05480000
          LOGICAL DSTX,CRITIC,IX,DX,MODE;                               05482000
          LOGICAL CCERR:=CCE;                                           05484000
          << >>                                                         05486000
          ERRORON;                                                      05488000
          CAP:=IF STATUS.PRIVF THEN 0D ELSE DOUBLE(CAP2);               05490000
          CHEK(ERREX,3,%12D,CAP);                                       05492000
          CRITIC:=SETCRITICAL;                                          05494000
          IF ID <> 0 THEN                                      <<WH.22>>05496000
            BEGIN     <<LOOK FOR SHARED DST>>                  <<WH.22>>05498000
              <<SEARCH JDT FOR DST ENTRY WITH ID>>             <<WH.22>>05500000
              <<IF ENTRY FOUND REF COUNT IS BUMPED>>           <<WH.22>>05502000
              DSTX:=XJDT(0,ID,0);                              <<WH.22>>05504000
              IF DSTX <> 0 THEN                                <<WH.22>>05506000
                BEGIN    <<DST WITH ID EXISTS>>                <<WH.22>>05508000
                  <<SEARCH PROCESS PXFIXED FOR DST>>           <<WH.22>>05510000
                  <<IF FOUND THEN PROCESS HAS ACCESSED>>       <<WH.22>>05512000
                  <<DST BEFORE. IF NOT THEN THIS IS >>         <<WH.22>>05514000
                  <<PROCESS'S FIRST ACCESS        >>           <<WH.22>>05516000
                  INDEX:=PXDSEG(6,DSTX);                       <<WH.22>>05518000
                  IF INDEX <> 0 THEN                           <<WH.22>>05520000
                    BEGIN <<DST ACCESSED BEFORE>>              <<WH.22>>05522000
                      CCERR:=CCG;                              <<WH.22>>05524000
                      LENGTH:=                                 <<WH.22>>05526000
                         (DSTI'(DSTX&LSL(2)).DSFLD-1)&LSL(2);  <<WH.22>>05528000
                      IX:=XJDT(4,ID,DSTX);   << DECRMT REF >>  <<01678>>05530000
                      GO TO FIN;                               <<WH.22>>05532000
                    END ELSE                                   <<WH.22>>05534000
                    BEGIN <<PROCESS'S FIRST ACCESS TO DST>>    <<WH.22>>05536000
                          <<ABOVE INCREMENT OF REC COUNT>>     <<WH.22>>05538000
                          <<MUST BE NULLIFIED           >>     <<WH.22>>05540000
                      IX:=XJDT(4,ID,DSTX);   << DECRMT REF >>  <<00428>>05542000
                    END;                                       <<WH.22>>05544000
                 END;                                          <<WH.22>>05546000
              END;                                             <<WH.22>>05548000
          IF (IX:=PXDSEG(0,0))=0 THEN                                   05550000
               BEGIN TOS:=1; GOTO ERROR; END;                           05552000
          IF IX = -1 THEN                                      <<00593>>05554000
            BEGIN  << COULDN'T DO STACK EXPANSION >>           <<00593>>05556000
              TOS := 3;                                        <<00593>>05558000
              GOTO ERROR;                                      <<00593>>05560000
            END;                                               <<00593>>05562000
          IF ID<>0 THEN                                                 05564000
               BEGIN IX.SHARF:=1;                                       05566000
                     IF (DSTX:=XJDT(0,ID,0))<>0 THEN GOTO CONT;         05568000
               END;                                                     05570000
          IF STATUS.PRIVF AND LENGTH<0 THEN                             05572000
               BEGIN LENGTH:=-LENGTH; GOTO CONTY; END;                  05574000
          IF LENGTH < 0 OR LENGTH > F(MAXDSEG') THEN                    05576000
               BEGIN TOS:=0; GOTO ERROR; END;                           05578000
  CONTY:                                                                05580000
          LENGTH:=((LENGTH+3)&ASR(2))&ASL(2);                           05582000
          IF (DSTX:=IF STATUS.PRIVF THEN GETDATASEG(LENGTH,0)<<00614>>  05584000
                           ELSE GETDATASEGC(LENGTH,0))=0 THEN  <<00614>>05586000
               BEGIN TOS:=2;                                            05588000
                     GOTO ERROR;                                        05590000
               END;                                                     05592000
          IF ID=0 THEN GOTO CONTX;                                      05594000
          <<MAKE ENTRY IN JDT>>                                <<04509>>05596000
          IF (DX:=XJDT(1,ID,DSTX))=0 THEN GOTO CONTX;                   05598000
          RELDATASEG(DSTX);                                             05600000
          TOS:=4;   <<NO ROOM IN JDT>>                         <<04509>>05602000
          GOTO ERROR;                                          <<04509>>05604000
  CONT:   CCERR:=CCG;                                                   05606000
          LENGTH := (DSTI'(DSTX&LSL(2)).DSFLD-1)&LSL(2);                05608000
  CONTX:  INDEX:=PXDSEG(DSTX,IX);                                       05610000
                                                                        05612000
          GOTO FIN;                                                     05614000
  ERROR:  CCERR:=CCL;                                                   05616000
          INDEX:=TOS+%2000;                                             05618000
  FIN:    STATUS.CCFLD:=CCERR;                                          05620000
          RESETCRITICAL(CRITIC);                                        05622000
          ERROREXIT(ERREX,0,0);                                         05624000
  END;                                                                  05626000
<<***************************************************************>>     05628000
                                                                        05630000
                                                                        05632000
                                                                        05634000
            << >>                                                       05636000
<<********************************************************>>            05638000
<<******  CALLABLE - CAPABILITY 2 - DATA SEGMENTS  *******>>            05640000
<<********************************************************>>            05642000
            <<RELEASE EXTRA DATA SEGMENT. IF NO MORE REFERENCES ARE     05644000
               BEING MADE TO THAT DATA SEG IN JOB OR IT IS A PRIVATE    05646000
               DATA SEG THEN IT IS DESTROYED. CHECKS ID VS INDEX        05648000
                                                                        05650000
               INDEX = LOGICAL INDEX OF DATA SEG                        05652000
               ID    =0 - PRIVATE DATA SEG                              05654000
                    <>0 - JOB GLOBAL DATA SEG                           05656000
                                                                        05658000
               CODE: CC=0 OK. DESTROYED                                 05660000
                     CC>0 OK. ACCESS RELEASED BUT DATA SEG STILL        05662000
                                   IN JOB                               05664000
                     CC<0 NO.  -ILLEGAL INDEX                           05666000
                               -ILLEGAL INDEX VS ID        >>           05668000
<<********************************************************>>            05670000
            << >>                                                       05672000
PROCEDURE FREEDSEG(INDEX,ID);                                           05674000
  VALUE   INDEX,ID;                                                     05676000
  LOGICAL INDEX,ID;                                                     05678000
  OPTION  PRIVILEGED;                                                   05680000
  BEGIN                                                                 05682000
          EQUATE ERRN=131 , CAP2=%2 , EXITN=2;                          05684000
          EQUATE ERREX=[10/ERRN,6/EXITN];                               05686000
          DOUBLE CAP;                                                   05688000
          LOGICAL DSTX,CRITIC,IX,REF;                                   05690000
          LOGICAL CCERR := CCG;                                         05692000
          << >>                                                         05694000
          ERRORON;                                                      05696000
          CAP:=IF STATUS.PRIVF THEN 0D ELSE DOUBLE(CAP2);               05698000
          CHEK(ERREX,2,0D,CAP);                                         05700000
          CRITIC:=SETCRITICAL;                                          05702000
          IF (IX:=PXDSEG(3,INDEX))=0 THEN                               05704000
               BEGIN ERROR: CCERR:=CCL; GOTO FIN; END;                  05706000
          DSTX:=PXDSEG(2,IX);                                           05708000
          IF IX.SHARF THEN                                              05710000
               BEGIN                                                    05712000
                     IF ID=0 THEN GOTO ERROR;                           05714000
                     IF (REF:=XJDT(2,ID,DSTX))=0 THEN GOTO ERROR;       05716000
                     IF REF>1 THEN GOTO CONT;                           05718000
               END;                                                     05720000
          CCERR := CCE;                                                 05722000
          RELDATASEG(DSTX);                                             05724000
  CONT:   PXDSEG(1,IX);                                                 05726000
  FIN:    STATUS.CCFLD:=CCERR;                                          05728000
          RESETCRITICAL(CRITIC);                                        05730000
          ERROREXIT(ERREX,0,0);                                         05732000
  END;                                                                  05734000
<<***************************************************************>>     05736000
                                                                        05738000
                                                                        05740000
                                                                        05742000
<<********************************************************>>            05744000
<<******  CALLABLE - CAPABILITY 2 - DATA SEGMENTS  *******>>            05746000
<<********************************************************>>            05748000
            <<INCREMENT/DECREMENT EXTRA DATA SEGMENT SIZE.              05750000
               SUBJECT TO THE CONDITION THAT THE NEW SIZE               05752000
               CANNOT EXCEED THE ORIGINAL SIZE SPECIFIED TO             05754000
               GETDSEG. THUS MEMORY STORAGE REQUIREMENTS MAY BE         05756000
               REDUCED DYNAMICALLY TO IMPROVE PERFORMANCE,THE           05758000
               MAXIMUM DISC STORAGE HAVING BEEN ALLOCATED AT            05760000
               TIME OF CREATION. AN ERROR CONDITION IS RETURNED         05762000
               IF THE DATA SEGMENT IS FROZEN AT THE TIME OF             05764000
               REQUESTING THE SIZE CHANGE.                              05766000
                                                                        05768000
               INDEX = LOGICAL INDEX OF DATA SEG                        05770000
               INC   = INCREMENT(+VE)/DECREMENT(-VE) TO SIZE            05772000
               SIZE  := NEW SIZE OF DATA SEG                            05774000
                                                                        05776000
               CODE: CC=0 OK.                                           05778000
                     CC>0 OK.  -ILLEGAL DECREMENT DUE TO NEW SIZE<=0    05780000
                                   SIZE:=CURRENT SIZE                   05782000
                               -ILLEGAL INCREMENT DUE TO NEW SIZE>      05784000
                                   ORIGINAL GETDSEG SIZE                05786000
                                   SIZE:=ORIG GETDSEG SIZE              05788000
                     CC<0 NO.  -ILLEGAL INDEX SIZE:=0                   05790000
                               -FROZEN DATA SEG SIZE:=CURRENT  >>       05792000
<<********************************************************>>            05794000
PROCEDURE ALTDSEG(INDEX,INC,SIZE);                                      05796000
  VALUE   INDEX,INC;                                                    05798000
  LOGICAL INDEX;                                                        05800000
  INTEGER INC,SIZE;                                                     05802000
  OPTION  PRIVILEGED;                                                   05804000
  BEGIN                                                                 05806000
          EQUATE ERRN=134, CAP2=%2 , EXITN=3;                           05808000
          EQUATE ERREX=[10/ERRN,6/EXITN];                               05810000
          DOUBLE CAP;                                                   05812000
          LOGICAL CRITIC,DSTX;                                          05814000
          LOGICAL CCERR:=CCE;                                           05816000
          INTEGER VDSSIZE;                                              05818000
          LOGICAL CHANGEINC:=FALSE;                            <<WH.22>>05820000
          << >>                                                         05822000
          ERRORON;                                                      05824000
          CAP:=IF STATUS.PRIVF THEN 0D ELSE DOUBLE(CAP2);               05826000
          CHEK(ERREX,3,%40D,CAP);                                       05828000
          CRITIC:=SETCRITICAL;                                          05830000
          IF (DSTX:=PXDSEG(4,INDEX))=0 THEN                             05832000
               BEGIN CCERR:=CCL;                                        05834000
                     SIZE:=0;                                           05836000
                     GOTO FIN;                                          05838000
               END;                                                     05840000
          IF INC > 0 THEN                                      <<WH.22>>05842000
            BEGIN  <<EXPANSION-SIZE CANNOT EXCEED VDS>>        <<WH.22>>05844000
              SIZE:=(DSTI'(DSTX&LSL(2)).DSFLD)&LSL(2);         <<WH.22>>05846000
              VDSSIZE:=DST(DSTX&LSL(2)+1).NPFLD;                        05848000
              IF ((SIZE+INC+PSM1)/INTEGER(VMPAGESIZE)) > VDSSIZE THEN   05850000
                BEGIN   <<TOO LARGE-USE MAXIMUM>>              <<WH.22>>05852000
                  INC:=VDSSIZE*INTEGER(VMPAGESIZE)-SIZE;      <<WH.22>> 05854000
                  CHANGEINC:=TRUE;                             <<WH.22>>05856000
                END;                                           <<WH.22>>05858000
            END;                                               <<WH.22>>05860000
          EXCHANGEDB(DSTX);                                             05862000
          ALTDSEGSIZE(DSTX,INC);                                        05864000
          PUSH(STATUS);                                                 05866000
          CCERR:=TOS.CCFLD;                                             05868000
          <<CHANGE CCE STATUS IF ORIGINAL INC WAS TOO BIG>>    <<WH.22>>05870000
          IF CHANGEINC AND CCERR = CCE THEN CCERR:=CCG;        <<WH.22>>05872000
          EXCHANGEDB(0);                                                05874000
          SIZE := (DSTI'(DSTX&LSL(2)).DSFLD-1)&LSL(2);                  05876000
  FIN:    STATUS.CCFLD:=CCERR;                                          05878000
          RESETCRITICAL(CRITIC);                                        05880000
          ERROREXIT(ERREX,0,0);                                         05882000
  END;                                                                  05884000
<<***************************************************************>>     05886000
                                                                        05888000
                                                                        05890000
                                                                        05892000
            << >>                                                       05894000
            << STACK TO/FROM DATA SEGMENT MOVE.                         05896000
               PERFORMS BOUNDS CHECK ON SEGMENTS AND                    05898000
               RETURNS CONDITION CODE PATTERN DIRECTLY                  05900000
               CC=0  OK                                                 05902000
               CC>0  DATA/STACK SEG BOUNDS VIOL                         05904000
               CC<0  ILLEGAL INDEX OR NUMBER   >>                       05906000
            << >>                                                       05908000
LOGICAL PROCEDURE DMOVE(DSTX,DISP,NUMBER,LOC,INTOSTACK,NUM);            05910000
  VALUE   DSTX,DISP,NUMBER,LOC,INTOSTACK,NUM;                           05912000
  LOGICAL DSTX,INTOSTACK;                                               05914000
  INTEGER DISP,NUMBER,LOC,NUM;                                          05916000
  OPTION  PRIVILEGED,UNCALLABLE;                                        05918000
  BEGIN                                                                 05920000
          ENTRY  DMOVE';                                                05922000
          DOUBLE DD,DR;                                                 05924000
          INTEGER SIZE=DD,QVALUE=DR,DLVALUE=DR+1,DELTAQ=Q+0;            05926000
          INTEGER ADDR=DD+1,JUNK;                                       05928000
          LOGICAL DBSAVE,CCERR:=CCE,F'=CCERR+1;                         05930000
          ARRAY BASE(*)=DB+0;                                           05932000
          << >>                                                         05934000
          TOS := 1;                                                     05936000
          GOTO STARTL;                                                  05938000
DMOVE'   :TOS := 0;                                                     05940000
STARTL   :                                                              05942000
          IF NUMBER=0 THEN GOTO FIN;                                    05944000
          IF (DSTX=0) OR (NUMBER<0) THEN                                05946000
               BEGIN CCERR:=CCL; GOTO FIN; END;                         05948000
          IF DISP<0 THEN GOTO ERROR;                                    05950000
          IF DISP+NUMBER < 0 THEN GO TO ERROR;                 <<00081>>05952000
          JUNK := 4;                                                    05954000
          SIZE := (DSTI'(DSTX&LSL(2)).DSFLD)&LSL(2);                    05956000
          IF = THEN                                                     05958000
           BEGIN               <<INVALID ENTRY>>                        05960000
            CCERR := CCL;                                               05962000
            GOTO FIN;                                                   05964000
           END;                                                         05966000
          IF > THEN                                                     05968000
           IF DSTL'(X:=X+1).SEGRESIDENTFLAG THEN JUNK := 0;    <<01915>>05970000
          IF (DISP + NUMBER) > (SIZE - JUNK) THEN                       05972000
           BEGIN                                                        05974000
            IF F' THEN                                                  05976000
             GOTO ERROR;       <<OLD CASE>>                             05978000
            NUMBER := SIZE - JUNK - DISP;                               05980000
            CCERR := CCG;                                               05982000
           END;                                                         05984000
          PUSH(Q,DL); DR:=TOS;                                          05986000
          IF (LOC<DLVALUE) OR ((LOC+NUMBER-1)>(QVALUE                   05988000
                                       -DELTAQ+NUM))                    05990000
               THEN BEGIN ERROR: CCERR:=CCG; GOTO FIN; END;             05992000
          TOS := LOC;                <<DB-RELATIVE DISPLACEMENT>>       05994000
          TOS := DSTX;               <<DATA SEG ENTRY NUMBER>>          05996000
          TOS := DISP;               <<DATA SEG DISPLACEMENT>>          05998000
          IF NOT INTOSTACK THEN                                         06000000
           ASMB(CAB);                                                   06002000
          TOS := NUMBER;             <<MOVE COUNT>>                     06004000
          IF INTOSTACK THEN                                             06006000
           MFDSEG                   <<STACK := DATASEG>>                06008000
          ELSE                                                          06010000
           MTDSEG;                  <<DATASEG := STACK>>                06012000
  FIN:    DMOVE:=CCERR;                                                 06014000
  END;                                                                  06016000
<<***************************************************************>>     06018000
                                                                        06020000
                                                                        06022000
                                                                        06024000
            << >>                                                       06026000
<<********************************************************>>            06028000
<<******  CALLABLE - CAPABILITY 2 - DATA SEGMENTS  *******>>            06030000
<<********************************************************>>            06032000
            << MOVE FROM EXTRA DATA SEGMENT TO STACK SEGMENT.           06034000
               BOUNDS CHECKING IS PERFORMED.                            06036000
                                                                        06038000
               INDEX = LOGICAL INDEX OF DATA SEG (GETDSEG)              06040000
               DISP  = DISPLACEMENT IN DATA SEG (>=0)                   06042000
               NUMBER = SIZE OF TRANSFER (>=0)                          06044000
               LOCATION = STACK ARRAY FOR DESTINATION                   06046000
                                                                        06048000
               CODE: CC=0 OK.                                           06050000
                     CC>0 NO. BOUNDS FAILURE                            06052000
                     CC<0 NO.  -ILLEGAL INDEX                           06054000
                               -ILLEGAL NUMBER             >>           06056000
<<********************************************************>>            06058000
            << >>                                                       06060000
PROCEDURE DMOVIN(INDEX,DISP,NUMBER,LOCATION);                           06062000
  VALUE   INDEX,DISP,NUMBER;                                            06064000
  LOGICAL INDEX;                                                        06066000
  INTEGER DISP,NUMBER;                                                  06068000
  ARRAY   LOCATION;                                                     06070000
  OPTION  PRIVILEGED;                                                   06072000
  BEGIN                                                                 06074000
          EQUATE ERRN=132, CAP2=%2 , EXITN=4;                           06076000
          EQUATE ERREX=[10/ERRN,6/EXITN];                               06078000
          EQUATE BOUND=-EXITN-4;                                        06080000
          DOUBLE CAP;                                                   06082000
          LOGICAL DSTX;                                                 06084000
          INTEGER LOC=Q-4;                                              06086000
          LOGICAL CCERR:=CCE;                                           06088000
          << >>                                                         06090000
          ERRORON;                                                      06092000
          CAP:=IF STATUS.PRIVF THEN 0D ELSE DOUBLE(CAP2);               06094000
          CHEK(ERREX,4,%200D,CAP);                                      06096000
          IF (DSTX:=PXDSEG(4,INDEX))=0 THEN                             06098000
               BEGIN CCERR:=CCL; GOTO FIN; END;                         06100000
          CCERR:=DMOVE(DSTX,DISP,NUMBER,LOC,TRUE,BOUND);                06102000
  FIN:    STATUS.CCFLD:=CCERR;                                          06104000
          ERROREXIT(ERREX,0,0);                                         06106000
  END;                                                                  06108000
<<***************************************************************>>     06110000
                                                                        06112000
                                                                        06114000
                                                                        06116000
            << >>                                                       06118000
<<********************************************************>>            06120000
<<******  CALLABLE - CAPABILITY 2 - DATA SEGMENTS  *******>>            06122000
<<********************************************************>>            06124000
            << MOVE FROM STACK SEGMENT TO EXTRA DATA SEGMENT.           06126000
               BOUNDS CHECKING IS PERFORMED.                            06128000
                                                                        06130000
               INDEX = LOGICAL INDEX OF DATA SEG (GETDSEG)              06132000
               DISP  = DISPLACEMENT IN DATA SEG (>=0)                   06134000
               NUMBER = SIZE OF TRANSFER (>=0)                          06136000
               LOCATION = STACK ARRAY OF DATA SOURCE                    06138000
                                                                        06140000
               CODE: CC=0 OK.                                           06142000
                     CC>0 NO. BOUNDS FAILURE                            06144000
                     CC<0 NO.  -ILLEGAL INDEX                           06146000
                               -ILLEGAL NUMBER             >>           06148000
<<********************************************************>>            06150000
            << >>                                                       06152000
PROCEDURE DMOVOUT(INDEX,DISP,NUMBER,LOCATION);                          06154000
  VALUE   INDEX,DISP,NUMBER;                                            06156000
  LOGICAL INDEX;                                                        06158000
  INTEGER DISP,NUMBER;                                                  06160000
  ARRAY   LOCATION;                                                     06162000
  OPTION  PRIVILEGED;                                                   06164000
  BEGIN                                                                 06166000
          EQUATE ERRN=133, CAP2=%2 , EXITN=4;                           06168000
          EQUATE ERREX=[10/ERRN,6/EXITN];                               06170000
          EQUATE BOUND=-EXITN-4;                                        06172000
          DOUBLE CAP;                                                   06174000
          LOGICAL DSTX;                                                 06176000
          INTEGER LOC=Q-4;                                              06178000
          LOGICAL CCERR:=CCE;                                           06180000
          << >>                                                         06182000
          ERRORON;                                                      06184000
          CAP:=IF STATUS.PRIVF THEN 0D ELSE DOUBLE(CAP2);               06186000
          CHEK(ERREX,4,%200D,CAP);                                      06188000
          IF (DSTX:=PXDSEG(4,INDEX))=0 THEN                             06190000
               BEGIN CCERR:=CCL; GOTO FIN; END;                         06192000
          CCERR:=DMOVE(DSTX,DISP,NUMBER,LOC,FALSE,BOUND);               06194000
  FIN:    STATUS.CCFLD:=CCERR;                                          06196000
          ERROREXIT(ERREX,0,0);                                         06198000
  END;                                                                  06200000
<<***************************************************************>>     06202000
                                                                        06204000
                                                                        06206000
                                                                        06208000
            << >>                                                       06210000
<<********************************************************>>            06212000
<<****  UNCALLABLE - CAPABILITY 7 - PRIV MODE      *******>>            06214000
<<********************************************************>>            06216000
            <<SET DB TO THE BASE OF AN EXTRA DATA SEGMENT.              06218000
               RETURNS THE LOGICAL INDEX OF PREVIOUS DATA SEGMENT.      06220000
               THIS INTRINSIC PROVIDES THE INTERFACE BETWEEN A          06222000
               PRIVILEGED USER RUNNING WITH EXTRA DATA SEGMENTS         06224000
               AND EXCHANGEDB. A VALIDITY CHECK IS PERFORMED ON         06226000
               THE LOGICAL INDEX.                                       06228000
                                                                        06230000
               INDEX <> 0 LOGICAL INDEX OF DATA SEG (GETDSEG)           06232000
                     =  0 STACK SEGMENT                                 06234000
               SWITCHDB := PREVIOUS DATA SEG LOG INDEX                  06236000
                             (=0 STACK SEG)                             06238000
                                                                        06240000
               CODE: CC=0 OK.                                           06242000
                     CC>0 (NULL)                                        06244000
                     CC<0 NO. ILLEGAL INDEX                >>           06246000
<<********************************************************>>            06248000
            << >>                                                       06250000
LOGICAL PROCEDURE SWITCHDB(INDEX);                                      06252000
  VALUE   INDEX;                                                        06254000
  LOGICAL INDEX;                                                        06256000
  OPTION  PRIVILEGED,UNCALLABLE;                                        06258000
  BEGIN                                                                 06260000
          EQUATE ERRN=139, EXITN=1;                                     06262000
          EQUATE ERREX=[10/ERRN,6/EXITN];                               06264000
          LOGICAL DSTX,DSTZ,CRIT;                                       06266000
          LOGICAL CCERR:=CCE;                                           06268000
          << >>                                                         06270000
          CRIT := SETCRITICAL;                                          06272000
          ERRORON;                                                      06274000
          DSTZ:=EXCHANGEDB(0);                                          06276000
          IF INDEX=0 THEN GOTO CONT;                                    06278000
          IF (DSTX:=PXDSEG(4,INDEX))=0 THEN                             06280000
               BEGIN EXCHANGEDB(DSTZ);                                  06282000
                     DSTZ:=0;                                           06284000
                     CCERR:=CCL;                                        06286000
                     GOTO FIN;                                          06288000
               END;                                                     06290000
  CONT:   IF DSTZ=0 THEN GOTO CONTX;                                    06292000
          TOS:=PXDSEG(6,DSTZ);                                          06294000
          ASSEMBLE(TEST);                                               06296000
          IF <> THEN DSTZ:=TOS;                                         06298000
  CONTX:  IF INDEX<>0 THEN EXCHANGEDB(DSTX);                            06300000
  FIN:    SWITCHDB:=DSTZ;                                               06302000
          STATUS.CCFLD:=CCERR;                                          06304000
          RESETCRITICAL(CRIT);                                          06306000
          ERROREXIT(ERREX,0,0);                                         06308000
  END;                                                                  06310000
<<***************************************************************>>     06312000
$PAGE ""                                                       <<01558>>06314000
$PAGE "SOFTWARE INTERRUPT MANAGEMENT"                                   06316000
$PAGE "SYSGLOB - FETCHES WORD FROM SYSGLOB AREA."              <<02830>>06318000
integer procedure SysGlob(Address);                            <<02830>>06320000
   value Address;                                              <<02830>>06322000
   integer Address;               << Address of SYSGLOB word >><<02830>>06324000
   option privileged;                                          <<02830>>06326000
                                                               <<02830>>06328000
<< This procedure fetches a word from the MPE System Global >> <<02830>>06330000
<< Area (SYSGLOB) or SYSGLOB Extension and returns it as    >> <<02830>>06332000
<< value of the procedure.                                  >> <<02830>>06334000
<<                                                          >> <<02830>>06336000
<< INPUT:                                                   >> <<02830>>06338000
<<    Address - This is the address, relative to the start  >> <<02830>>06340000
<<       of the System Global Area, of the word to be re-   >> <<02830>>06342000
<<       turned.  Addresses in the range 0 - %377 refer to  >> <<02830>>06344000
<<       SYSGLOB,  while those in the range %400 - %577 re- >> <<02830>>06346000
<<       fer to the SYSGLOB Extension.                      >> <<02830>>06348000
<<                                                          >> <<02830>>06350000
<< PROCEDURE VALUE:                                         >> <<02830>>06352000
<<    The contents of the addressed SYSGLOB word are re-    >> <<02830>>06354000
<<    turned.                                               >> <<02830>>06356000
<<                                                          >> <<02830>>06358000
<< CONDITION CODE:                                          >> <<02830>>06360000
<<    CCE - The SYSGLOB word was returned.                  >> <<02830>>06362000
<<                                                          >> <<02830>>06364000
<<    CCG - Not used.                                       >> <<02830>>06366000
<<                                                          >> <<02830>>06368000
<<    CCL - <Address> was not in the range 0 - %577.        >> <<02830>>06370000
                                                               <<02830>>06372000
begin << SysGlob >>                                            <<02830>>06374000
                                                               <<02830>>06376000
<< The following declarations take advantage of an undocu-  >> <<02830>>06378000
<< mented feature of SPL.  Declarations of the form         >> <<02830>>06380000
<<                                                          >> <<02830>>06382000
<<    [<type>] pointer <pointer-name> = <integer>           >> <<02830>>06384000
<<                                                          >> <<02830>>06386000
<< specify a pointer located at absolute address %1000 +    >> <<02830>>06388000
<< <integer>.  The address contained in the pointer is also >> <<02830>>06390000
<< relative to absolute location %1000 (instead of DB), so  >> <<02830>>06392000
<< that if @<pointer-name> is 1, <pointer-name> refers to   >> <<02830>>06394000
<< the contents of absolute location %1001.                 >> <<02830>>06396000
                                                               <<02830>>06398000
   define CondCode = Status.(6:2)#;  <<Stack marker CC>>       <<02830>>06400000
   integer pointer SysGlobP = 0;  << 1st word of SYSGLOB >>    <<02830>>06402000
   integer pointer SysGlobExtP = %377; << SYSGLOB Extension >> <<02830>>06404000
                                                               <<02830>>06406000
                                                               <<02830>>06408000
      CondCode := CCE;                                         <<02830>>06410000
      if 0 <= Address <= %377 then                             <<02830>>06412000
         SysGlob := SysGlobP(Address)                          <<02830>>06414000
      else if %400 <= Address <= %577 then                     <<02830>>06416000
         SysGlob := SysGlobExtP(Address - %400)                <<02830>>06418000
      else                                                     <<02830>>06420000
         CondCode := CCL                                       <<02830>>06422000
                                                               <<02830>>06424000
   end; << SysGlob >>                                          <<02830>>06426000
PROCEDURE LOOSESOFTINTERRUPTS;                                 <<03044>>06428000
                                                                        06430000
<<FUNCTION                                                              06432000
  VALID ONLY FOR A TERMINATING PROCESS.  CLEANS UP ANY MESS LEFT        06434000
  BY UNPROCESSED SOFT INTERRUPTS.>>                                     06436000
                                                                        06438000
BEGIN                                                                   06440000
DO RECEIVEMSG(USERMSGPORT,0,DELETEMSG) UNTIL >;                         06442000
DO RECEIVEMSG(SYSTEMSGPORT,0,DELETEMSG) UNTIL >;                        06444000
END;  <<LOOSESOFTINTERRUPTS>>                                           06446000
PROCEDURE LOOSETRLX;                                           <<03044>>06448000
                                                                        06450000
<<FUNCTION                                                              06452000
  VALID ONLY FOR A TERMINATING PROCESS.  CLEANS UP ANY MESS LEFT        06454000
  BY PENDING TIMEOUTS.>>                                                06456000
                                                                        06458000
BEGIN                                                                   06460000
INTEGER PCBXLOC;                                                        06462000
                                                                        06464000
PXFIXED;                                                                06466000
IF PXTIMEOUTRLX <> 0 THEN                                               06468000
   BEGIN                                                                06470000
   ABORTTIMEREQ(PXTIMEOUTRLX);                                          06472000
   PXTIMEOUTRLX:=0;                                                     06474000
   END;                                                                 06476000
END;  <<LOOSETRLX>>                                                     06478000
PROCEDURE RESUMESOFTINT;                                       <<03044>>06480000
                                                                        06482000
<<FUNCTION                                                              06484000
  RETURNS THE PROCESS'S SOFT INTERRUPT STATE BACK TO WHERE IT WAS       06486000
  WHEN THE CONTROL Y TRAP OCCURRED.                                     06488000
                                                                        06490000
  NOTE: IF THE SOFT INTERRUPT STATE IS EXPLICITLY CHANGED WITH          06492000
        FINTSTATE AFTER THE CONTROL Y OCCURS, THEN THIS PROCEDURE       06494000
        WILL NOT CHANGE THE SOFT INTERRUPT STATE.>>                     06496000
                                                                        06498000
BEGIN                                                                   06500000
INTEGER                                                                 06502000
   PCBPT,PCBXLOC;                                                       06504000
LOGICAL                                                                 06506000
   NEWSTATE;                                                            06508000
                                                                        06510000
                                                                        06512000
PCBPT:=ABS(CPCB)-ABS(PCBB);                                             06514000
PXFIXED;                                                                06516000
NEWSTATE:=PXOLDSISTATE;  <<GET THE PRE-CONTROL Y SOFT INT STATE>>       06518000
DISABLE;                                                                06520000
SPCBALLOWSOFT:=NEWSTATE;                                                06522000
IF NEWSTATE AND PORTSTATUS(USERMSGPORT) THEN                            06524000
   BEGIN  <<INTERRUPTS ENABLED AND HAVE PENDING INTERRUPT>>             06526000
   IF SPCBCRITSIR = 0 THEN                                              06528000
      BEGIN  <<OK TO START PROCESSING THE INTERRUPT>>                   06530000
      SPCBSOFTINT:=1;                                                   06532000
      PDISABLE;                                                         06534000
      PSEUDOINT;                                                        06536000
      END                                                               06538000
   ELSE                                                                 06540000
      BEGIN  <<MUST DELAY THE INTERRUPT>>                               06542000
      SPCBDELAYSOFT:=1;                                                 06544000
      SPCBPIOVRFLAG:=1;                                                 06546000
      END;                                                              06548000
   END;                                                                 06550000
END;  <<RESUMESOFTINT>>                                                 06552000
                                                               <<03044>>06554000
$CONTROL SEGMENT=MAIN                                          <<03044>>06556000
END.                                                           <<03044>>06558000
