$CONTROL MAP,CODE,USLINIT                                               00010000
<<KERNELC : MODULE 92>>                                        <<01715>>00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$CONTROL USLINIT,CODE,MAP                                      <<04483>>00030000
$CONTROL PRIVILEGED, SEGMENT=KERNELC, MAIN=KERNELC                      00032000
    LAND NOT LOGICAL(RESABORTINFO).CRITFLAG THEN               <<04453>>00034000
                                                                        00036000
BEGIN                                                                   00038000
                                                                        00040000
DEFINE ASMB=ASSEMBLE#,                                                  00042000
       ABS=ABSOLUTE#,                                          <<01812>>00044000
       DISABLE=ASMB(SED 0)#,                                            00046000
       ENABLE=ASMB(SED 1)#,                                             00048000
       PDISABLE=ASMB(PSDB)#,                                            00050000
       PENABLE=ASMB(PSEB)#,                                             00052000
       EXCHDB=ASMB(XCHD 0)#,                                            00054000
       SETCLOCK=ASMB(SCLK)#;                                            00056000
                                                                        00058000
INTEGER X=X,                                                            00060000
        S0=S-0,                                                         00062000
        S1=S-1,                                                         00064000
        S2=S-2,                                                         00066000
        S3=S-3,                                                         00068000
        S4=S-4,                                                <<01788>>00070000
        S5=S-5,                                                         00072000
        S6=S-6;                                                         00074000
                                                                        00076000
LOGICAL LS0=S-0;                                                        00078000
                                                                        00080000
INTEGER STATUS=Q-1;                                                     00082000
                                                                        00084000
DEFINE TURNOFFTRAPS=PUSH(STATUS);TOS.(2:1):=0;SET(STATUS)#;    <<01644>>00086000
                                                                        00088000
EQUATE CCL=1,                                                           00090000
       CCE=2,                                                           00092000
       CCG=0;                                                           00094000
                                                                        00096000
DEFINE CC=STATUS.(6:2)#;                                                00098000
                                                               <<03041>>00100000
DEFINE LOG=LOGICAL#,                                           <<03041>>00102000
       INT=INTEGER#;                                           <<03041>>00104000
                                                                        00106000
INTEGER DELTAQ=Q+0,QM4=Q-4;                                    <<03041>>00108000
                                                               <<03041>>00110000
DOUBLE DQM1=Q-1,DQM3=Q-3;                                      <<03041>>00112000
                                                               <<03041>>00114000
ARRAY STACK(*)=Q+0,Q0ARRAY(*)=Q+0;                             <<03041>>00116000
                                                               <<03041>>00118000
DEFINE GLOBALTRACEFLAG = ABSOLUTE(%1267)#;                     <<03041>>00120000
                                                               <<03041>>00122000
                                                                        00124000
<<                                                                      00126000
FIXED CELLS                                                             00128000
>>                                                                      00130000
                                                                        00132000
EQUATE CSTP=0,                                                          00134000
       CSTXP=1,                                                         00136000
       DSTP=2,                                                          00138000
       PCBP=3,                                                          00140000
       CPCB=4,                                                          00142000
       ICS'QI=5,                                                        00144000
       ICS'ZI=6;                                                        00146000
                                                                        00148000
<<                                                                      00150000
SYSGLOB CELLS                                                           00152000
>>                                                                      00154000
                                                                        00156000
                                                                        00158000
EQUATE SYSBASE=%1000,                                                   00160000
       SLIX=1,                                                          00162000
       SYSSL=SYSBASE+SLIX,                                              00164000
       DSTIX=2,                                                         00166000
       SYSDST=SYSBASE+DSTIX,                                            00168000
       PCBIX=3,                                                         00170000
       SYSPCB=SYSBASE+PCBIX,                                            00172000
       ARSBMIX=4,                                                       00174000
       IOQIX=5,                                                         00176000
       SYSIOQ=SYSBASE+IOQIX,                                            00178000
       SYSARSBM=SYSBASE+ARSBMIX,                                        00180000
       ICSIX=7,                                                         00182000
       SYSICS=SYSBASE+ICSIX,                                            00184000
       LPDTIX=%10,                                                      00186000
       SYSLPDT=SYSBASE+LPDTIX,                                          00188000
       BPTIX=%11,                                                       00190000
       SYSBPT=SYSBASE+BPTIX,                                            00192000
       TRLIX=%12,                                                       00194000
       SYSTRL=SYSBASE+TRLIX,                                            00196000
       SIRTABIX=%14,                                                    00198000
       SYSSIRTAB=SYSBASE+SIRTABIX,                                      00200000
       SWAPTABIX=%25,                                                   00202000
       SYSSWAPTAB=SYSBASE+SWAPTABIX,                                    00204000
       DISCREQTABIX=%31,                                                00206000
       SYSDISCREQTAB=SYSBASE+DISCREQTABIX,                              00208000
       DFCIX=%32,                                                       00210000
       SYSDFC=SYSBASE+DFCIX,                                            00212000
       DFSIX=%33,                                                       00214000
       SYSDFS=SYSBASE+DFSIX,                                            00216000
       SPECREQTABIX=%42,                                                00218000
       SYSSPECREQTAB=SYSBASE+SPECREQTABIX,                              00220000
       SPECQHEADIX=%43,                                                 00222000
       SYSSPECQHEAD=SYSBASE+SPECQHEADIX,                                00224000
       ARLDIX=%44,                                                      00226000
       SYSARLD=SYSBASE+ARLDIX,                                          00228000
       NBANKSIX=%47,                                                    00230000
       SYSNBANKS=SYSBASE+NBANKSIX,                                      00232000
       MAXAVAILREGIX=%45,                                               00234000
       SYSMAXAVAILREG=SYSBASE+MAXAVAILREGIX,                            00236000
       DISPAWAKEMSGIX=%50,                                              00238000
       SYSDISPAWAKEMSG=SYSBASE+DISPAWAKEMSGIX,                          00240000
       CSTXBLKIX=%51,                                                   00242000
       SYSCSTXBLK=SYSBASE+CSTXBLKIX,                                    00244000
       AWAKESCHEDMSGIX=%52,                                             00246000
       SYSAWAKESCHEDMSGIX=SYSBASE+AWAKESCHEDMSGIX,                      00248000
       WAITDISPMSGIX=%53,                                               00250000
       SYSWAITDISPMSG=SYSBASE+WAITDISPMSGIX,                            00252000
       CURRACTPRIIX=%54,                                                00254000
       SYSCURRACTPRI=SYSBASE+CURRACTPRIIX,                              00256000
       DISPQHEADIX=%271,                                                00258000
       SYSDISPQHEAD=SYSBASE+DISPQHEADIX,                                00260000
       DISPQTAILIX=%272,                                                00262000
       SYSDISPQTAIL=SYSBASE+DISPQTAILIX,                                00264000
       BUGCATCHIX=%355,                                                 00266000
       SYSBUGCATCH=SYSBASE+BUGCATCHIX,                                  00268000
       LASTBANKIX=%361,                                                 00270000
       SYSLASTBANK=SYSBASE+LASTBANKIX,                                  00272000
       LASTBASEIX=%362,                                                 00274000
       SYSLASTBASE=SYSBASE+LASTBASEIX,                                  00276000
       SYSGLOBEXTIX=%377,                                               00278000
       SYSGLOBEXTBASE=SYSBASE+SYSGLOBEXTIX;                             00280000
                                                                        00282000
<<                                                                      00284000
SYSGLOB CELLS FOR DIRECT DB-REL ACCESS                                  00286000
>>                                                                      00288000
                                                                        00290000
INTEGER PCBSYSBASEINX=DB+PCBIX,                                         00292000
        DSTSYSBASEINX=DB+DSTIX,                                         00294000
        DFC=DB+DFCIX,                                                   00296000
        DFS=DB+DFSIX,                                                   00298000
        ICSSYSBASEINX=DB+ICSIX,                                         00300000
        SLSYSBASEINX=DB+SLIX,                                           00302000
        SPECREQTABSYSBASEINX=DB+SPECREQTABIX,                           00304000
        SPECQHEAD=DB+SPECQHEADIX,                                       00306000
        MAXAVAILREG=DB+MAXAVAILREGIX,                                   00308000
        NBANKS=DB+NBANKSIX,                                             00310000
        ARSBMSYSBASEINX=DB+ARSBMIX,                                     00312000
        ARLDSYSBASEINX=DB+ARLDIX,                                       00314000
        SWAPTABSYSBASEINX=DB+SWAPTABIX,                                 00316000
        DISCREQTABSYSBASEINX=DB+DISCREQTABIX,                           00318000
        CSTXBLKSYSBASEINX=DB+CSTXBLKIX,                                 00320000
        DISPQHEAD=DB+DISPQHEADIX,                                       00322000
        DISPQTAIL=DB+DISPQTAILIX;                                       00324000
                                                                        00326000
LOGICAL DISPTOAWAKEMSG=DB+DISPAWAKEMSGIX,                               00328000
        CURRACTPRI=DB+CURRACTPRIIX,                                     00330000
        AWAKETOSCHEDMSG=DB+AWAKESCHEDMSGIX,                             00332000
        BUGCATCH=DB+BUGCATCHIX,                                         00334000
        WAITTODISPMSG=DB+WAITDISPMSGIX;                                 00336000
                                                                        00338000
DOUBLE LASTMEMORYADDRESS=DB+LASTBANKIX;                                 00340000
                                                                        00342000
EQUATE FIRSTMEMIX=%20,                                                  00344000
       TIMELASTCYCIX=%22,                                               00346000
       SCANPOINTIX=%265,                                                00348000
       LASTCYCDURIX=%351,                                               00350000
       CYCLETHRESHIX=%353;                                              00352000
DOUBLE SCANPOINT=DB+SCANPOINTIX,                                        00354000
       FIRSTMEMADDR=DB+FIRSTMEMIX,                                      00356000
       TIMEOFLASTCYCLE=DB+TIMELASTCYCIX,                                00358000
       CYCLETHRESHOLD=db+CYCLETHRESHIX,                                 00360000
       LASTCYCLEDURATION=DB+LASTCYCDURIX;                               00362000
INTEGER STATICMPLFENCE=DB+%27;                                 <<01913>>00364000
                                                                        00366000
                                                                        00368000
                                                                        00370000
<<                                                                      00372000
TABLE POINTERS (LST ACCESS)                                             00374000
>>                                                                      00376000
                                                                        00378000
INTEGER POINTER SL=SLIX,                                                00380000
                DST=DSTIX,                                              00382000
                PCB=PCBIX,                                              00384000
                IOQ=IOQIX,                                              00386000
                LPDT=LPDTIX,                                            00388000
                TRL=TRLIX,                                              00390000
                ARSBM=ARSBMIX,                                          00392000
                SPECREQTAB=SPECREQTABIX,                                00394000
                SIRTAB=SIRTABIX,                                        00396000
                SWAPTAB=SWAPTABIX,                                      00398000
                DISCREQTAB=DISCREQTABIX,                                00400000
                CSTXBLK=CSTXBLKIX,                                      00402000
                ICS=ICSIX,                                              00404000
                SYSGLOBEXT=SYSGLOBEXTIX;                                00406000
                                                                        00408000
                                                                        00410000
<<                                                                      00412000
SYSGLOB EXTENSION ASSIGNENTS                                            00414000
>>                                                                      00416000
                                                                        00418000
                                                                        00420000
DEFINE GARBCOLLENABLED=SYSGLOBEXT(3)#,                                  00422000
       FIRSTMEMBANK=SYSGLOBEXT(1)#,                                     00424000
       FIRSTMEMBASE=SYSGLOBEXT(2)#,                                     00426000
       MEMORYPAGESIZE=SYSGLOBEXT(5)#,                                   00428000
       VDSPAGESIZE=SYSGLOBEXT(6)#,                                      00430000
       HOTIMELASTMAKEROOM=SYSGLOBEXT(7)#,                               00432000
       LOTIMELASTMAKEROOM=SYSGLOBEXT(8)#,                               00434000
       MEMPRESSDUREXT=SYSGLOBEXT(9)#,                                   00436000
       MOVETHRESHOLD=SYSGLOBEXT(4)#;                                    00438000
                                                                        00440000
                                                                        00442000
DOUBLE POINTER ARLD=DB+ARLDIX,                                          00444000
               LPDTD=DB+LPDTIX;                                         00446000
                                                                        00448000
<<                                                                      00450000
STANDARD SYSTEM TABLES ENTRY ALLOCATION                                 00452000
>>                                                                      00454000
                                                                        00456000
LOGICAL ARRAY SYSTABENTRY00(*)=DB+0,                                    00458000
              SYSTABENTRY01(*)=DB+1,                                    00460000
              SYSTABENTRY02(*)=DB+2,                                    00462000
              SYSTABENTRY03(*)=DB+3,                                    00464000
              SYSTABENTRY04(*)=DB+4,                                    00466000
              SYSTABENTRY05(*)=DB+5,                                    00468000
              SYSTABENTRY16(*)=DB+16;                                   00470000
                                                                        00472000
DEFINE ENTRYWORD00=SYSTABENTRY00(X)#,                                   00474000
       ENTRYWORD01=SYSTABENTRY01(X)#,                                   00476000
       ENTRYWORD02=SYSTABENTRY02(X)#,                                   00478000
       ENTRYWORD03=SYSTABENTRY03(X)#,                                   00480000
       ENTRYWORD04=SYSTABENTRY04(X)#,                                   00482000
       ENTRYWORD05=SYSTABENTRY05(X)#;                                   00484000
                                                                        00486000
LOGICAL ARRAY SYSTABFREECOUNT(*)=DB+2,                                  00488000
              SYSTABCONFCOUNT(*)=DB+0,                                  00490000
              SYSTABFREEHEAD(*)=DB+3,                                   00492000
              SYSTABFREETAIL(*)=DB+4,                                   00494000
              SYSTABMOSTOUT(*)=DB+5,                                    00496000
              SYSTABSIZE(*)=DB+1,                                       00498000
              SYSTABFREEWORD(*)=DB+0,                                   00500000
              SYSTABPREV(*)=DB+2,                                       00502000
              SYSTABNEXT(*)=DB+1;                                       00504000
                                                                        00506000
DEFINE SYSTABFREECNT=SYSTABFREECOUNT(X)#,                               00508000
       SYSTABENTRYSIZE=SYSTABSIZE(X)#,                                  00510000
       SYSTABENTRYCOUNT=SYSTABCONFCOUNT(X)#,                            00512000
       SYSTABFIRSTFREEINX=SYSTABFREEHEAD(X)#,                           00514000
       SYSTABLASTFREEINX=SYSTABFREETAIL(X)#,                            00516000
       SYSTABMOSTUSED=SYSTABMOSTOUT(X)#,                                00518000
       SYSTABFREEINDICATOR=SYSTABFREEWORD(X)#,                          00520000
       SYSTABENTRYPREVINX=SYSTABPREV(X)#,                               00522000
       SYSTABENTRYNEXTINX=SYSTABNEXT(X)#;                               00524000
                                                                        00526000
                                                               <<01987>>00528000
DEFINE TOTALDISCREQCNT=SYSTABENTRY00(X).(0:8)#,                <<01987>>00530000
       INUSEDISCREQCNT=SYSTABENTRY04(X).(8:8)#;                <<01987>>00532000
                                                               <<01987>>00534000
$INCLUDE INCLST                                                         00536000
$INCLUDE INCLSLL                                                        00538000
$INCLUDE INCLPCB                                                        00540000
$INCLUDE INCLICS                                                        00542000
<<SEGMENT IDENTIFIER FORMAT>>                                           00544000
                                                                        00546000
EQUATE SEGIDDATATYPE=0,                                                 00548000
       SEGIDSLTYPE=1;  <<PROGRAM TYPE =2 OR 3>>                         00550000
DEFINE SEGIDTYPEFIELD=(0:2)#,                                           00552000
       SEGIDPBXFLAG=(0:1)#,                                             00554000
       SEGIDPBXFIELD=(1:7)#,                                            00556000
       SEGIDLOGSEGFIELD=(8:8)#;                                         00558000
                                                                        00560000
                                                                        00562000
INTEGER ARRAY MEM(*)=DB+0;                                              00564000
                                                                        00566000
<<                                                                      00568000
PCBX                                                                    00570000
>>                                                                      00572000
                                                                        00574000
EQUATE PXGLOBSIZE=%10,  <<FOR ACCESS THRU EXTENDED ADDRESSING>>         00576000
       SBTOSTKRELDBDISP=1,                                              00578000
       STKDLTOSTKDBDISP=1,                                              00580000
       STKDBTOSTKDLDISP=-1,                                             00582000
       STKDLTODBRELZDISP=10,                                            00584000
       SBTODBRELSDISP=PXGLOBSIZE+1,                                     00586000
       SBTODBRELZDISP=PXGLOBSIZE+2,                                     00588000
       SBTOINITQDISP=PXGLOBSIZE+3,                                      00590000
       SBTODBRELDLDISP=PXGLOBSIZE+4,                                    00592000
       SBTOMAXDATADISP=PXGLOBSIZE+%15,                                  00594000
       SBTOPROCTIMEDISP=PXGLOBSIZE+%30,                                 00596000
       SBTOPMBNDSTAT=PXGLOBSIZE+%36,                           <<04663>>00598000
       SBTOTIMELEFTDISP=PXGLOBSIZE+%37,                                 00600000
       SBTOTSLRDISP=PXGLOBSIZE+%52,                                     00602000
       SBTOTSTBDISP=PXGLOBSIZE+%53,                                     00604000
       SBTOTSSWAPINDISP=PXGLOBSIZE+%54,                                 00606000
       SBTOTSLADISP=PXGLOBSIZE+%55,                                     00608000
       SBTOTSLDDISP=PXGLOBSIZE+%56,                                     00610000
       SBTOMEASSTOPREASON=PXGLOBSIZE+%101,                     <<01812>>00612000
       SBTOMEASSTOPTIME=PXGLOBSIZE+%102,                       <<01812>>00614000
       SBTOQUEUETIMESTAMPDISP=PXGLOBSIZE+%76; <<DOUBLE WORD>>           00616000
                                                                        00618000
EQUATE TSLRTOTSTBDISP=1,                                                00620000
       TSLRTOQCNTDISP=5,                                                00622000
       STKRELDBTODBRELDLDISP=%13,                                       00624000
       STKRELDBTOSBDISP=-1,                                             00626000
       DBRELDLTODBRELZDISP=-2,                                          00628000
       DBRELZTODBRELSDISP=-1,                                           00630000
       PROCTIMETOJCIDISP=-%31,                                          00632000
       JCITOFROLSDISP=%40,                                              00634000
       JCITOTSSWAPINDISP=%55,                                           00636000
       FROLSTOJCIDISP=-%40,                                             00638000
       JCITOSBDISP=-%7,                                                 00640000
       TSLDTOTSLADISP=-1,                                               00642000
       TSLSWAPINTOTSLRDISP=-2,                                          00644000
       TSSWAPINTOTSLDDISP=2,                                            00646000
       JCITOJROLSDISP=%40,                                              00648000
       TSLRTOQCNTDISIP=5,                                               00650000
       TSTBTOQCNTDISP=4,                                                00652000
       TSLATOTSLDDISP=1;                                                00654000
                                                                        00656000
                                                                        00658000
<<                                                                      00660000
MEMORY REGION HEADERS AND TRAILERS                                      00662000
>>                                                                      00664000
                                                                        00666000
EQUATE RBTOPTSSDISP=-22,                                                00668000
       RBTOPTRASDISP=-21,                                               00670000
       RBTOPTRSDISP=-20,                                                00672000
       RBTORASDISP=-19,                                                 00674000
       RBTORSDISP=-18,                                                  00676000
       RBTOIOCNTDISP=-17,                                               00678000
       RBTOINITMSGDISP=-16,                                             00680000
       RBTOINITINFODISP=-15,                                            00682000
       RBTOPLDISP=-15,                                                  00684000
       RBTOCOMPMSGDISP=-14,                                             00686000
       RBTOMPQLINKDISP=-13,                                             00688000
       RBTONLDISP=-13,                                                  00690000
       RBTORPAGECNTDISP=-12,                                            00692000
       RBTOIOREQQDISP=-11,                                              00694000
       RBTOSSDISP=-10,                                                  00696000
       RBTOSDDISP=-9,                                                   00698000
       RBTOWREQPDISP=-8,                                                00700000
       RBTOSEGIDENTDISP=-7,                                             00702000
       RBTOLKFZCNTDISP=-6,                                              00704000
       RBTOWDIOFZCNTDISP=-5,                                            00706000
       RBTOHODADISP=-4,                                                 00708000
       RBTOLODADISP=-3,                                                 00710000
       RBTODSKREQHEADPDISP=-2,                                          00712000
       RBTODSKREQTAILPDISP=-1,                                          00714000
       PTSSTORBDISP=22,                                                 00716000
       PTRASTORBDISP=21,                                                00718000
       PTRSTORBDISP=20,                                                 00720000
       RASTORBDISP=19,                                                  00722000
       RSTORBDISP=18,                                                   00724000
       IOCNTTORBDISP=17,                                                00726000
       INITMSGTORBDISP=16,                                              00728000
       INITINFOTORBDISP=15,                                             00730000
       PLTORBDISP=15,                                                   00732000
       COMPMSGTORBDISP=14,                                              00734000
       MPQLINKTORBDISP=13,                                              00736000
       NLTORBDISP=13,                                                   00738000
       RPAGECNTTORBDISP=12,                                             00740000
       IOREQQTORBDISP=11,                                               00742000
       SSTORBDISP=10,                                                   00744000
       SSTORSDISP=-8,                                                   00746000
       RSTOSSDISP=8,                                                    00748000
       SDTORBDISP=9,                                                    00750000
       WREQPTORBDISP=8,                                                 00752000
       SEGIDENTTORBDISP=7,                                              00754000
       LKFZCNTTORBDISP=6,                                               00756000
       WDIOFZCNTTORBDISP=5,                                             00758000
       HODATORBDISP=4,                                                  00760000
       LODATORBDISP=3,                                                  00762000
       DSKREQHEADPTORBDISP=2,                                           00764000
       DSKREQTAILPTORBDISP=1,                                           00766000
       RASTORSDISP=1,                                                   00768000
       RASTOIOCNTDISP=2,                                                00770000
       RASTOINITMSGDISP=3,                                              00772000
       RASTOINITINFODISP=4,                                             00774000
       RASTOCOMPMSGDISP=5,                                              00776000
       RASTOMPQLINKDISP=6,                                              00778000
       RASTORPAGECNTDISP=7,                                             00780000
       RASTOIOREQQDISP=8,                                               00782000
       RASTOSSDISP=9,                                                   00784000
       RASTOSDDISP=10,                                                  00786000
       RASTOWREQPDISP=11,                                               00788000
       RASTOSEGIDENTDISP=12,                                            00790000
       RASTOLKFZCNTDISP=13,                                             00792000
       RASTOWDIOFZCNTDISP=14,                                           00794000
       RASTOHODADISP=15,                                                00796000
       RASTOLODADISP=16,                                                00798000
       RASTODSKREQHEADPDISP=17,                                         00800000
       RASTODSKREQTAILPDISP=18,                                         00802000
       RSTORASDISP=-1,                                                  00804000
       IOCNTTORASDISP=-2,                                               00806000
       INITMSGTORASDISP=-3,                                             00808000
       INITMSGTOSDDISP=7,                                               00810000
       INITMSGTOSEGIDENTDISP=9,                                         00812000
       INITINFOTORASDISP=-4,                                            00814000
       COMPMSGTORASDISP=-5,                                             00816000
       MPQLINKTORASDISP=-6,                                             00818000
       RPAGECNTTORASDISP=-7,                                            00820000
       IOREQQTORASDISP=-8,                                              00822000
       SSTORASDISP=-9,                                                  00824000
       SDTORASDISP=-10,                                                 00826000
       WREQPTORASDISP=-11,                                              00828000
       SEGIDENTTORASDISP=-12,                                           00830000
       LKFZCNTTORASDISP=-13,                                            00832000
       WDIOFZCNTTORASDISP=-14,                                          00834000
       HODATORASDISP=-15,                                               00836000
       LODATORASDISP=-16,                                               00838000
       DSKREQHEADPTORASDISP=-17,                                        00840000
       DSKREQTAILPTORASDISP=-18,                                        00842000
       DSKREQHEADPTOWDIOFZCNTDISP=-3,                                   00844000
       WDIOFZCNTTODSKREQHEADP=3,                                        00846000
       WDIOFZCNTTOLKFZCNTDISP=-1,                                       00848000
       COMPMSGTOWDIOFZCNTDISP=9,                                        00850000
       HODATOCOMPMSGDISP=-10,                                           00852000
       HODATOINITMSGDISP=-12,                                           00854000
       HODATOSEGIDENTDISP=-3,                                           00856000
       HODATOWREQPDISP=-4,                                              00858000
       PTRASTORSDISP=3,                                                 00860000
       PTSSTORSDISP=4,                                                  00862000
       RSTOPTSSDISP=-4,                                                 00864000
       RSTOPTRASDISP=-3,                                                00866000
       SSTOPTRASDISP=-11,                                               00868000
       RSTOSDDISP=9,                                                    00870000
       TRASTOTRSDISP=1,                                                 00872000
       TRASTOTSSDISP=-1,                                                00874000
       TRSTOTRASDISP=-1,                                                00876000
       TSSTORSDISP=2,                                                   00878000
       TRSTOTSSDISP=-2,                                                 00880000
       TSSTOTRASDISP=1,                                                 00882000
       RASTOPTRASDISP=-2,                                               00884000
       PTRASTORASDISP=2,                                                00886000
       RASTOPTSSDISP=-3,                                                00888000
       PTSSTORASDISP=3,                                                 00890000
       PLTONLDISP=2,                                                    00892000
       NLTOPLDISP=-2,                                                   00894000
       IOREQQTOSSDISP=1,                                                00896000
       IOREQQTORSDISP=-7,                                               00898000
       SSTOIOREQQDISP=-1,                                               00900000
       RSTOPTRSDISP=-2,                                                 00902000
       PTRSTORSDISP=2,                                                  00904000
       SEGIDENTTOPTRSDISP=-13,                                          00906000
       SEGIDENTTOPTRASDISP=-14,                                         00908000
       SEGIDENTTOPTSSDISP=-15,                                          00910000
       SEGIDENTTOINITMSGDISP=-9,                                        00912000
       SEGIDENTTOINITINFODISP=-8,                                       00914000
       SEGIDENTTOSDDISP=-2,                                             00916000
       SEGIDENTTOWREQPDISP=-1,                                          00918000
       MPQLINKTOCOMPMSGDISP=-1,                                         00920000
       COMPMSGTOINITINFODISP=-1,                                        00922000
       INITMSGTOCOMPMSGDISP=2,                                          00924000
       COMPMSGTOINITMSGDISP=-2,                                         00926000
       COMPMSGTOIOREQQDISP=3,                                           00928000
       INITMSGTOINITINFODISP=1,                                         00930000
       INITMSGTORPAGECNTDISP=4,                                         00932000
       INITMSGTOMPQLINKDISP=3,                                          00934000
       INITMSGTORSDISP=-2,                                              00936000
       INITMSGTOWREQPDISP=8,                                            00938000
       INITINFOTOSEGIDENTDISP=8,                                        00940000
       INITINFOTOSDDISP=6,                                              00942000
       RPAGECNTTORSDISP=-6,                                             00944000
       WREQPTOSDDISP=-1,                                                00946000
       WREQPTOSEGIDENTDISP=1,                                           00948000
       INITINFOTOHODADISP=11,                                           00950000
       SSTOSEGIDENTDISP=3,                                              00952000
       SSTOSDDISP=1,                                                    00954000
       SDTOSSDISP=-1,                                                   00956000
       SDTOIOCNTDISP=-8,                                                00958000
       IOCNTTOINITMSGDISP=1,                                            00960000
       RSTOSEGIDENTDISP=11,                                             00962000
       NLTORBTORBDISP=13,                                               00964000
       PLTORBTORBDISP=15,                                               00966000
       RASTOPTRSDISP=-1,                                                00968000
       PTRSTORASDISP=1;                                                 00970000
                                                                        00972000
DEFINE REGASSIGNEDFLAG=(0:1)#,                                          00974000
       REGRESERVEDFLAG=(1:1)#,                                          00976000
       REGAVAILABLEFLAG=(2:1)#,                                         00978000
       REGCLEAREDFLAG=(3:1)#,                                           00980000
       REGLKDFLAG=(5:1)#,                                               00982000
       BLKDLKMIGIPFLAG=(15:1)#, <<BLOCKED LOCK MIGRATION IN PROGRESS>>  00984000
       REGFZFLAG=(6:1)#,                                                00986000
       REGIOFZFLAG=(7:1)#,                                              00988000
       REGNONMOVEFLAGS=(5:3)#,                                          00990000
       SIZECHANGEPNDGFLAG=(4:1)#,                                       00992000
       INITMSGTOGGLESWITCH=(0:1)#,                                      00994000
       MSGEXTDISABLEDFLAG=(1:1)#,                                       00996000
       MSGONGOINGIODISABLED=(2:1)#,                                     00998000
       QUEUEREADREQFLAG=(3:1)#,                                         01000000
       INCMOVEREQFLAG=(4:1)#,                                           01002000
       EXPREQFLAG=(5:1)#,                                               01004000
       GARBCOLLFLAG=(6:1)#,                                             01006000
       INITMSGABORTEDFLAG=(7:1)#,                                       01008000
       INITMSGRELRESPAGESFLAG=(8:1)#,                                   01010000
       COMPMSGTOGGLESWITCH=(0:1)#,                                      01012000
       COMPMSGMODFLAG=(1:1)#,                                           01014000
       COMPMSGBLKDLKFLAG=(2:1)#,                                        01016000
       COMPMSGIOWAKEFLAG=(4:1)#,                                        01018000
       COMPMSGLDEVFIELD=(8:8)#,                                         01020000
       MSGVALIDYETFLAG=(15:1)#,                                         01022000
       MSGGARBCOLLFLAG=(6:1)#,                                          01024000
       COMPMSGABORTEDFLAG=(5:1)#,                                       01026000
       FZCNTFIELD=(0:8)#,                                               01028000
       LKCNTFIELD=(8:8)#,                                               01030000
       SDVALIDFLAG=(0:1)#,                                              01032000
       IOFZCNTFIELD=(8:8)#,                                             01034000
       WRITDCNTFIELD=(0:8)#;                                            01036000
                                                                        01038000
EQUATE REGIOFZBIT=7,                                                    01040000
       REGLKDBIT=5,                                                     01042000
       REGFZBIT=6,                                                      01044000
       MSGVALIDBIT=15,                                                  01046000
       INITMSGTOGGLEBIT=0,                                              01048000
       COMPMSGTOGGLEBIT=0,                                              01050000
       COMPMSGIOWAKEBIT=4,                                              01052000
       SDVALIDBIT=0,                                                    01054000
       QUEUEREADREQBIT=3,                                               01056000
       MSGGARBCOLLBIT=6;                                                01058000
                                                                        01060000
EQUATE COMPLETEDFLAG=6,                                                 01062000
       CURRENTFLAG=10;                                                  01064000
                                                                        01066000
EQUATE REGAVAILABLECODE=%20000,                                         01068000
       REGRESERVEDCODE=%40000,                                          01070000
       REGASSIGNEDCODE=%100000,                                         01072000
       LASTTRASADDR=%177776;                                            01074000
$INCLUDE INCLMSG                                                        01076000
                                                                        01078000
EQUATE NONDESTRUCTREAD=%100000;                                <<01557>>01080000
$INCLUDE INCLIO                                                         01082000
                                                                        01084000
<<                                                                      01086000
BREAKPOINT TABLE                                                        01088000
>>                                                             <<MM.IV>>01090000
                                                               <<MM.IV>>01092000
EQUATE BKPT'FLAG      = SYSBPT,                                <<MM.IV>>01094000
       BPT'DST        = %36,                                   <<MM.IV>>01096000
       BPT'DST'IND    = BPT'DST*4,                             <<MM.IV>>01098000
       SYS'BKPT'EXT'X = 1;        <<INDEX OF HEAD OF SYS LIST>><<MM.IV>>01100000
                                                               <<MM.IV>>01102000
DEFINE SYS'BKPT       = ABSOLUTE(BKPT'FLAG).(15:1)#,           <<MM.IV>>01104000
       BPT'TAB'LOCKED = ABSOLUTE(BKPT'FLAG).(14:1)#,           <<MM.01>>01106000
      BKPT'UPDATING   = (10:1)#;                               <<MM.01>>01108000
                                                               <<MM.IV>>01110000
INTEGER ARRAY BPT(*)  = DB+0;                                  <<MM.IV>>01112000
                                                               <<MM.IV>>01114000
                                                                        01116000
<<                                                                      01118000
MISC                                                                    01120000
>>                                                                      01122000
                                                                        01124000
EQUATE PAGEPOWER=7, <<8>> <<9>>                                         01126000
       MMPAGESIZE=128, <<256>> <<512>>                                  01128000
       HEADERLENGTH=19,                                                 01130000
       TRAILERLENGTH=4,                                                 01132000
       OVERHEAD=HEADERLENGTH+TRAILERLENGTH,                             01134000
       MAXHOLESIZE=512, <<256>> <<128>>                                 01136000
       PCBSIZE=%20,                                                     01138000
       ARSBMLENGTH=MAXHOLESIZE/16+1,                                    01140000
       ARLDLENGTH=MAXHOLESIZE*2+2,                                      01142000
       SIRTABENTRYLENGTH=2,                                             01144000
       CSTXBMWRDCNT=4,                                                  01146000
       SWAPTABENTRYSIZE=5;                                              01148000
                                                                        01150000
DEFINE MSGIOFZREQFLAG=(0:1)#; <<MSG CONTENT DEFINITIONS>>               01152000
                                                                        01154000
EQUATE DISPATCHINGQ=1, <<FOR QUEUEPROC CALLS>>                          01156000
       NOQUEUE=0,                                                       01158000
       FRONTOFCLASS=1,                                                  01160000
       FRONTOFQUEUE=1,                                                  01162000
       ENDOFCLASS=0,                                                    01164000
       ENDOFQUEUE=0;                                                    01166000
                                                                        01168000
DEFINE DISPRUNNINGFLAG=(0:1)#, <<DISPTOAWAKEMSG>>                       01170000
       PREEMPTOKFLAG=(1:1)#,                                            01172000
       CURPROCPRI=(2:8)#,                                               01174000
       CURPROCQUEUE=(10:4)#,                                   <<02827>>01176000
       PAUSEDFLAG=(15:1)#;                                              01178000
                                                                        01180000
EQUATE DISPRUNNINGBIT=0,                                                01182000
       PAUSEDBIT=15;                                                    01184000
                                                                        01186000
DEFINE TRANSCOMPFLAG=(15:1)#,  <<WAITTODISPMSG>>                        01188000
       LONGWAITFLAG=(1:1)#,                                             01190000
       PHASETRANSFLAG=(3:1)#,                                           01192000
       MEMTRAPFLAG=(4:1)#,                                              01194000
       IMPTRAPFLAG=(5:1)#,                                              01196000
       RECOVEREDOCFLAG=(6:1)#,                                          01198000
       DISCWAITFLAG=(7:1)#,                                             01200000
       TERMREADFLAG=(8:1)#,                                    <<04774>>01202000
       PREEMPTEDFLAG=(9:1)#;                                   <<04774>>01204000
                                                                        01206000
EQUATE NOINFO=0, <<WAIT FLAGS PARAMETER>>                               01208000
       MEMTRAP=%4000,                                                   01210000
       TRANSCOMPBIT=15,                                                 01212000
       SWBIT=0,                                                         01214000
       LONGWAITBIT=1,                                                   01216000
       NEWVERSIONBIT=2,                                                 01218000
       PHASETRANSBIT=3,                                                 01220000
       MEMTRAPBIT=4,                                                    01222000
       IMPTRAPBIT=5,                                                    01224000
       RECOVEREDOCBIT=6,                                                01226000
       NOWAIT=0; <<AWAKE PARAMETER>>                                    01228000
                                                                        01230000
EQUATE IMPWAITCODE=%100000,  <<FOR WAIT/AWAKE  CALLS>>                  01232000
       SIRWAITCODE=%40000,                                              01234000
       TIMERWAITCODE=%20000,                                            01236000
       MEMORYWAITCODE=%10000,                                           01238000
       MOURNINGWAITCODE=%4000,                                          01240000
       GLOBALRINWAITCODE=%2000,                                         01242000
       LOCALRINWAITCODE=%1000,                                          01244000
       MAILWAITCODE=%400,                                               01246000
       BIOWAITCODE=%200,                                                01248000
       UIOWAITCODE=%100,                                                01250000
       UCOPWAITCODE=%40,                                                01252000
       JUNKWAITCODE=%20,                                                01254000
       MSGWAITCODE=%4,                                         <<02805>>01256000
       SONWAITCODE=%2,                                                  01258000
       FATHERWAITCODE=1;                                                01260000
                                                                        01262000
                                                                        01264000
EQUATE GARBCOLLCODE=1,                                                  01266000
       LOCKCODE=2,                                                      01268000
       NORMALCLEANCODE=0;  <<FOR CLEANREGION'S SPECIALINFO PARM>>       01270000
                                                                        01272000
EQUATE PUTATFRONT=-1,                                                   01274000
       PUTATEND=0;  <<PUTONARL HEADOFLIST PARAMETER>>                   01276000
                                                                        01278000
EQUATE IOSYSREQBIT=0, <<FETCHSEGMENT'S SPECIALFLAGS PARAMETER>>         01280000
       IOFZREQBIT=1,                                                    01282000
       BKLKREQBIT=2,                                                    01284000
       LKREQBIT=3,                                                      01286000
       FZREQBIT=4;                                                      01288000
                                                                        01290000
DEFINE IOSYSREQFLAG=(0:1)#,                                             01292000
       IOFZREQFLAG=(1:1)#,                                              01294000
       BKLKREQFLAG=(2:1)#,                                              01296000
       LKREQFLAG=(3:1)#,                                                01298000
       FZREQFLAG=(4:1)#;                                                01300000
                                                                        01302000
EQUATE RELNRSBIT=0, <<ADJUSTLOCALITY PARAMETER BITS>>                   01304000
       INITLOCBIT=1,                                                    01306000
       FLUSHLOCBIT=2,                                                   01308000
       CLEARDISCSEGBIT=3,                                               01310000
       CLEARDBATSEGBIT=4,                                               01312000
       CLEARFZFLAGBIT=5,                                                01314000
       CLEARLKFLAGBIT=6,                                                01316000
       TOSSSEGSENTRYBIT=7,                                              01318000
       RELTILLROOMBIT=8,                                                01320000
       REFMINLOCBIT=9,                                                  01322000
       RELLOCBIT=15;                                                    01324000
                                                                        01326000
DEFINE SETMEMREQPTRFLAG=(0:1)#, <<ADDTOLOCALITY PARAMETER FLAGS>>       01328000
       SETBLKLKFLAG=(4:1)#,                                             01330000
       SETLOCKFLAG=(5:1)#,                                              01332000
       SETFZFLAG=(6:1)#,                                                01334000
       SETDISCIOSEGFLAG=(1:1)#,                                         01336000
       PROCSSTKFLAG=(2:1)#,                                             01338000
       UPDSLLFLAG=(15:1)#,                                              01340000
       SETDBATSEGFLAG=(3:1)#,                                           01342000
       RELNRSEGFLAG=(0:1)#,<<ADJUSTLOCALITY PARAMETER FLAGS>>           01344000
       INITLOCFLAG=(1:1)#,                                              01346000
       FLUSHLOCFLAG=(2:1)#,                                             01348000
       CLEARDISCSEGFLAG=(3:1)#,                                         01350000
       CLEARDBATSEGFLAG=(4:1)#,                                         01352000
       CLEARFZFLAGFLAG=(5:1)#,                                          01354000
       CLEARLKFLAGFLAG=(6:1)#,                                          01356000
       TOSSSEGSENTRYFLAG=(7:1)#,                                        01358000
       RELTILLROOMFLAG=(8:1)#,                                          01360000
       RELLOCFLAG=(15:1)#;                                              01362000
                                                                        01364000
EQUATE UPDATESLLBIT=15;                                                 01366000
                                                                        01368000
EQUATE MEMOVRFLOW=0, <<ABORTPROCESS CODES>>                             01370000
       MAKEPRESIOERR=1;                                                 01372000
                                                               <<04663>>01374000
<< THE FOLLOWING DEFINES ARE USED TO SUPPORT PRIVILEGED    >>  <<04663>>01376000
<< MODE BOUNDS CHECKING. GET'XDSEG'LIMITS TRANSFERS THE    >>  <<04663>>01378000
<< BANK, BASE ADDRESS, AND LIMIT ADDRESS TO ICS QI MINUS   >>  <<04663>>01380000
<< AREA. THE INDEX REGISTER IS EXPECTED TO BE POINTING TO  >>  <<04663>>01382000
<< DST ENTRY, WORD 0.                                      >>  <<04663>>01384000
                                                               <<04663>>01386000
DEFINE  GET'XDSEG'LIMITS=                                      <<04663>>01388000
                                                               <<04663>>01390000
  BEGIN                                                        <<04663>>01392000
  TOS:= X;                    << SAVE INDEX REG >>             <<04663>>01394000
  TOS:= DST(X:= X+2);         << GET XDSEG BANK NUM >>         <<04663>>01396000
  TOS:= DST(X:= X+1);         << GET XDSEG BASE ADDR >>        <<04663>>01398000
  ASMB(DUP);                  << COPY XDSEG BASE ADDR >>       <<04663>>01400000
  TOS:= (DST(X:= X-3).(3:13) & LSL(2)) + TOS;                  <<04663>>01402000
  ICS(- ICS'XDSEGLIMCELL):= TOS;    << ICS GETS XDSEG LIMT >>  <<04663>>01404000
  ICS(- ICS'XDSEGBASECELL):= TOS;   << ICS GETS XDSEG BASE >>  <<04663>>01406000
  ICS(- ICS'XDSEGBNKCELL):= TOS;    << ICS GETS XDSEG BANK >>  <<04663>>01408000
  X:= TOS;                          << RESTORE INDEX REG. >>   <<04663>>01410000
  END#;                                                        <<04663>>01412000
                                                               <<04663>>01414000
DEFINE  XFER'XDSEG'LIMITS=                                     <<04663>>01416000
                                                               <<04663>>01418000
  TOS:= 2;                                                     <<04663>>01420000
  ASMB(SBL)#;                     << CPU REG GET XDSEG INFO >> <<04663>>01422000
                                                               <<04663>>01424000
DEFINE   CPUNUM= ASMB(PCN)#,         << GET CPU NUMBER >>      <<04663>>01426000
         SBF   = CON %20104, %11#,   << SET BOUNDS FLAG >>     <<04663>>01428000
         SBL   = CON %20104, %12#;   << SET BOUNDS LIMITS >>   <<04663>>01430000
                                                               <<04663>>01432000
EQUATE SERIES64    = 4;                                        <<04663>>01434000
                                                               <<04663>>01436000
<< PCBX'BNDSINFO GETS THE CURRENT PCBX BANK AND ADDRESS.   >>  <<04663>>01438000
<< GET'PCBXBNDS'FLAG TRANSFERS THE BOUNDS CHECKING STATUS  >>  <<04663>>01440000
<< WORD FOUND IN THE PCBX TO THE ICS QI MINUS AREA.        >>  <<04663>>01442000
<< UPDATE'PCBXBNDS'FLAG TRANSFERS THE BOUNDS STATUS WORD   >>  <<04663>>01444000
<< FOUND IN THE ICS QI MINUS AREA TO THE PCBX. TOS SHOULD  >>  <<04663>>01446000
<< CONTAIN THE PCBX BOUND STATUS WORD, BANK, AND BASE OF   >>  <<04663>>01448000
<< THE PCBX.                                               >>  <<04663>>01450000
                                                               <<04663>>01452000
DEFINE PCBX'BNDSINFO =                                         <<04663>>01454000
                                                               <<04663>>01456000
       TOS:= X;                     << SAVE INDEX REG >>       <<04663>>01458000
       TOS:= ICS'STKBANK;           << GET STACK BANK NUM >>   <<04663>>01460000
       TOS:= ICS'STKBASE+ SBTOPMBNDSTAT;                       <<04663>>01462000
       << GET STACK BASE ADDRESS AND ADD OFFSET >>             <<04663>>01464000
                                                               <<04663>>01466000
       ASMB(LSEA)#;                                            <<04663>>01468000
                                                               <<04663>>01470000
DEFINE GET'PCBXBNDS'FLAG =                                     <<04663>>01472000
                                                               <<04663>>01474000
       BEGIN                                                   <<04663>>01476000
       PCBX'BNDSINFO;                                          <<04663>>01478000
       TOS:= TOS.(0:2);                                        <<04663>>01480000
       ICS(-ICS'PMBNDSTATCELL).(14:2):= TOS;                   <<04663>>01482000
       ICS(-ICS'XDSEGBNKCELL):= -1;                            <<04663>>01484000
       ASMB(DDEL);                                             <<04663>>01486000
       X:= TOS;                                                <<04663>>01488000
       END#;                                                   <<04663>>01490000
                                                               <<04663>>01492000
DEFINE UPDATE'PCBXBNDS'FLAG =                                  <<04663>>01494000
                                                               <<04663>>01496000
       BEGIN                                                   <<04663>>01498000
       PCBX'BNDSINFO;                                          <<04663>>01500000
       TOS.(0:2):= ICS(-ICS'PMBNDSTATCELL).(14:2);             <<04663>>01502000
       ASMB(SSEA;DDEL);                                        <<04663>>01504000
       X:= TOS;                                                <<04663>>01506000
       END#;                                                   <<04663>>01508000
                                                               <<04663>>01510000
DEFINE UPDATE'ICS'XDSEGBNKCELL =                               <<04663>>01512000
                                                               <<04663>>01514000
       BEGIN                                                   <<04663>>01516000
       ABSOLUTE(ABSOLUTE (5)- ICS'XDSEGBNKCELL):= -1;          <<04663>>01518000
       XFER'XDSEG'LIMITS;                                      <<04663>>01520000
       END#;                                                   <<04663>>01522000
                                                               <<04663>>01524000
                                                                        01526000
EQUATE SOFTSWAP=FALSE,   <<SWAPIN'S EFFORT CONTROL PARAMETER>> <<01987>>01528000
       HARDSWAP=TRUE;                                          <<01987>>01530000
                                                               <<01987>>01532000
EQUATE MMOK=0,  <<MEM MANAGEMENT STATUS RETURNS>>              <<01987>>01534000
       MMPREEMPT=4,                                            <<01987>>01536000
       MMIOERR=5,                                              <<01987>>01538000
       MMSEGBUSY=6,                                            <<01987>>01540000
       MMTHRASHDANGER=7,                                       <<01987>>01542000
       MMNOLOCKSPACE=8,                                        <<01987>>01544000
       MMOUTOFDISCREQ=9;                                       <<01987>>01546000
                                                               <<01987>>01548000
                                                               <<01987>>01550000
$INCLUDE INCLMEAS                                                       01552000
                                                               <<04109>>01554000
$INCLUDE INCLMIFT                                              <<04109>>01556000
$PAGE "SOFT INTERRUPT GLOBAL DEFINES."                         <<03041>>01558000
                                                               <<03041>>01560000
DEFINE                                                         <<03041>>01562000
   PXFIXED = PUSH(Q,DL); ASSEMBLE(XCH,SUB); <<CALCS Q+0 TO>>   <<03041>>01564000
             PCBXLOC:=TOS-Q0ARRAY(S0-2)#;   <<PCBX FIXED>>     <<03041>>01566000
                                                               <<03041>>01568000
DEFINE                                                         <<03041>>01570000
   PXCONTROLYLABEL= Q0ARRAY(PCBXLOC+18)#,                      <<03041>>01572000
   PXDELAYCONTROLY= Q0ARRAY(PCBXLOC+60).(1:1)#,                <<03041>>01574000
   PXOLDSISTATE   = Q0ARRAY(PCBXLOC+60).(3:1)#,                <<03041>>01576000
   PXTIMEOUTRLX   = Q0ARRAY(PCBXLOC+61)#;                      <<03041>>01578000
                                                               <<03041>>01580000
EQUATE                                                         <<03041>>01582000
   UGLYPSEUDOINT  = 4,                                         <<03041>>01584000
   MAXMSGLEN      = 4,                                         <<03041>>01586000
   DELETEMSG      = 0,                                         <<03041>>01588000
   SAVEMSG        = %100000;                                   <<03041>>01590000
                                                               <<03041>>01592000
                                                               <<03041>>01594000
EQUATE  <<MMSTAT EVENT NUMBERS>>                               <<03041>>01596000
   MMCAUSE         = -240,                                     <<03041>>01598000
   MMPROCESS       = -241,                                     <<03041>>01600000
   MMBUILDMARKER   = -242,                                     <<03041>>01602000
   MMCHANGESTATE   = -243,                                     <<03041>>01604000
   MMTIMEOUT       = -244;                                     <<03041>>01606000
                                                               <<03041>>01608000
EQUATE  <<MMSTAT MMSTATE PSEUDO-INTERRUPT NUMBERS>>            <<03041>>01610000
   HARDKILLER      = 0,                                        <<03041>>01612000
   SOFTKILLER      = 1,                                        <<03041>>01614000
   CONTROLY        = 2,                                        <<03041>>01616000
   BREAKER         = 3,                                        <<03041>>01618000
   SYSOFTINT       = 4,                                        <<03041>>01620000
   USERSOFTINT     = 5;                                        <<03041>>01622000
                                                               <<03041>>01624000
EQUATE  <<PSEUDO-INTERRUPT VALUES>>                            <<03041>>01626000
   HARDKILLVALUE  = 1,                                         <<03041>>01628000
   SOFTKILLVALUE  = 2,                                         <<03041>>01630000
   STOPVALUE      = 3,                                         <<03041>>01632000
   HYBERNATEVALUE = 4,                                         <<03041>>01634000
   CONTROLYVALUE  = 5,                                         <<03041>>01636000
   BREAKVALUE     = 6,                                         <<03041>>01638000
   NORMALVALUE    = 7;                                         <<03041>>01640000
                                                               <<03041>>01642000
EQUATE  <<RETURN VALUES OF TIMEOUT PROCEDURE>>                 <<03041>>01644000
   TIMEOUTOCCURRED= 0,                                         <<03041>>01646000
   TRLXEXHAUSTED  = 1,                                         <<03041>>01648000
   SOFTINTOCCURRED= 2;                                         <<03041>>01650000
                                                               <<03041>>01652000
EQUATE                                                         <<03041>>01654000
   USERMSGPORT    = 1,                                         <<03041>>01656000
   SYSTEMSGPORT   = 2;                                         <<03041>>01658000
<<                                                                      01660000
      EXTERNAL PROCEDURES                                               01662000
>>                                                                      01664000
PROCEDURE HELP;                                                         01666000
OPTION EXTERNAL;                                                        01668000
                                                                        01670000
PROCEDURE INITIO(FLAGS);                                                01672000
VALUE FLAGS;                                                            01674000
INTEGER FLAGS;                                                          01676000
OPTION EXTERNAL;                                                        01678000
                                                                        01680000
PROCEDURE ABORT(MODE,CODE,PARAM);                                       01682000
VALUE MODE,CODE,PARAM;                                                  01684000
LOGICAL MODE,CODE,PARAM;                                                01686000
OPTION EXTERNAL;                                                        01688000
                                                                        01690000
DOUBLE PROCEDURE TIMER;                                                 01692000
OPTION EXTERNAL;                                                        01694000
                                                                        01696000
PROCEDURE SUDDENDEATH(WHICH);                                           01698000
VALUE WHICH;                                                            01700000
INTEGER WHICH;                                                          01702000
OPTION EXTERNAL;                                                        01704000
                                                                        01706000
INTEGER PROCEDURE TIMEREQ(C,R,T);                                       01710000
VALUE C,R,T;                                                            01712000
INTEGER C,R;                                                            01714000
DOUBLE T;                                                               01716000
OPTION EXTERNAL;                                                        01718000
                                                                        01720000
PROCEDURE ABORTTIMEREQ(TRLX);                                           01722000
VALUE TRLX;                                                             01724000
INTEGER TRLX;                                                           01726000
OPTION EXTERNAL;                                                        01728000
                                                                        01730000
PROCEDURE AWAKEIO(DITP,FLAGS);                                          01732000
VALUE DITP,FLAGS;                                                       01734000
INTEGER POINTER DITP;                                                   01736000
INTEGER FLAGS;                                                          01738000
OPTION EXTERNAL;                                                        01740000
                                                                        01742000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS);    01744000
VALUE LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                         01746000
INTEGER LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                       01748000
OPTION EXTERNAL;                                                        01750000
                                                                        01752000
PROCEDURE SETBREAKPOINTS(PINX,CLABEL);                                  01754000
VALUE PINX,CLABEL;                                                      01756000
INTEGER PINX,CLABEL;                                                    01758000
OPTION EXTERNAL;                                                        01760000
                                                                        01762000
                                                                        01764000
INTEGER PROCEDURE GETDISCREQ(REQTYPE);                         <<01644>>01766000
VALUE REQTYPE;                                                 <<01644>>01768000
INTEGER REQTYPE;                                               <<01644>>01770000
OPTION EXTERNAL;                                               <<01644>>01772000
                                                               <<01644>>01774000
PROCEDURE RETURNDISCREQ(PNTR);                                 <<01644>>01776000
VALUE PNTR;                                                    <<01644>>01778000
INTEGER POINTER PNTR;                                          <<01644>>01780000
OPTION EXTERNAL;                                               <<01644>>01782000
                                                                        01784000
PROCEDURE STARTCLOCK(YEARDAY,TIMEDAY);                                  01786000
VALUE YEARDAY,TIMEDAY;                                                  01788000
INTEGER YEARDAY;                                                        01790000
DOUBLE TIMEDAY;                                                         01792000
OPTION EXTERNAL;                                                        01794000
                                                                        01796000
PROCEDURE QUEUEONSEGMENT(SEGIDENT);                                     01798000
VALUE SEGIDENT;                                                         01800000
LOGICAL SEGIDENT;                                                       01802000
OPTION FORWARD;                                                         01804000
                                                                        01806000
                                                                        01808000
                                                                        01810000
<<                                                                      01812000
FORWARD PROCEDURE DECLARATIONS                                          01814000
>>                                                                      01816000
                                                                        01818000
PROCEDURE WAIT(EVENTMASK,SPECIALINFO);                                  01820000
VALUE EVENTMASK,SPECIALINFO;                                            01822000
INTEGER EVENTMASK;                                                      01824000
LOGICAL SPECIALINFO;                                                    01826000
OPTION FORWARD;                                                         01828000
                                                                        01830000
PROCEDURE ADDTOLOCALITY(SLLINX,SEGIDENTIFIER,FLAGS);                    01832000
VALUE SLLINX,SEGIDENTIFIER,FLAGS;                                       01834000
INTEGER SLLINX,FLAGS;                                                   01836000
LOGICAL SEGIDENTIFIER;                                                  01838000
OPTION FORWARD;                                                         01840000
                                                                        01842000
PROCEDURE ADJUSTLOCALITY(PROCINX,SEGIDENT,REQSIZE,FLAGS);               01844000
VALUE PROCINX,SEGIDENT,REQSIZE,FLAGS;                                   01846000
LOGICAL PROCINX,SEGIDENT,REQSIZE,FLAGS;                                 01848000
OPTION FORWARD;                                                         01850000
                                                                        01852000
PROCEDURE PROCESSINITMSG(REGIONBASE);                                   01854000
VALUE REGIONBASE;                                                       01856000
DOUBLE REGIONBASE;                                                      01858000
OPTION FORWARD;                                                         01860000
                                                                        01862000
LOGICAL PROCEDURE SETCRITICAL;                                          01864000
OPTION FORWARD;                                                         01866000
                                                                        01868000
PROCEDURE RESETCRITICAL(OLDCRITICAL);                                   01870000
VALUE OLDCRITICAL;                                                      01872000
LOGICAL OLDCRITICAL;                                                    01874000
OPTION FORWARD;                                                         01876000
                                                                        01878000
PROCEDURE STARTSEGWRITE(DSTENTRYNUMBER,URGCLASS);                       01880000
VALUE DSTENTRYNUMBER,URGCLASS;                                          01882000
INTEGER DSTENTRYNUMBER,URGCLASS;                                        01884000
OPTION FORWARD;                                                         01886000
                                                                        01888000
PROCEDURE DISCQMANAGER(REQP,REQUESTTYPE);                               01890000
VALUE REQP,REQUESTTYPE;                                                 01892000
INTEGER REQP,REQUESTTYPE;                                               01894000
OPTION EXTERNAL;                                                        01896000
                                                                        01898000
PROCEDURE QUEUEDISCREQ(REQP,DITSYSBASEINDEX);                           01900000
VALUE REQP,DITSYSBASEINDEX;                                             01902000
INTEGER REQP,DITSYSBASEINDEX;                                           01904000
OPTION EXTERNAL;                                                        01906000
                                                               <<03041>>01908000
LOGICAL PROCEDURE CHEKTRLFREE;                                 <<03041>>01910000
OPTION EXTERNAL;                                               <<03041>>01912000
                                                               <<03041>>01914000
PROCEDURE TERMINATE;                                           <<03041>>01916000
OPTION EXTERNAL;                                               <<03041>>01918000
                                                               <<03041>>01920000
PROCEDURE SYSBREAK;                                            <<03041>>01922000
OPTION EXTERNAL;                                               <<03041>>01924000
                                                               <<03041>>01926000
INTEGER PROCEDURE FAMILY(A,B);                                 <<03041>>01928000
VALUE A,B;                                                     <<03041>>01930000
INTEGER A,B;                                                   <<03041>>01932000
OPTION EXTERNAL;                                               <<03041>>01934000
                                                               <<03041>>01936000
PROCEDURE DEBUG;                                               <<03041>>01938000
OPTION EXTERNAL;                                               <<03041>>01940000
                                                               <<03041>>01942000
PROCEDURE FCPREPAFT(REPLYPORT,FILENUM);                        <<03041>>01944000
VALUE REPLYPORT,FILENUM;                                       <<03041>>01946000
INTEGER REPLYPORT,FILENUM;                                     <<03041>>01948000
OPTION EXTERNAL;                                               <<03041>>01950000
                                                                        01952000
PROCEDURE DEQUEUEDISCREQ(REQP,DITSYSBASEINDEX);                         01954000
VALUE REQP,DITSYSBASEINDEX;                                             01956000
INTEGER REQP,DITSYSBASEINDEX;                                           01958000
OPTION EXTERNAL;                                                        01960000
                                                                        01964000
INTEGER PROCEDURE CONVEXTLABELTODELTAP(EXTLABEL);              <<03041>>01966000
VALUE EXTLABEL;                                                <<03041>>01968000
INTEGER EXTLABEL;                                              <<03041>>01970000
OPTION FORWARD;                                                <<03041>>01972000
                                                                        01974000
PROCEDURE AWAKE (PCBPT,WAKECODE,WAITFLAGS);                             01976000
VALUE PCBPT,WAKECODE,WAITFLAGS;                                         01978000
INTEGER PCBPT,WAITFLAGS;                                                01980000
LOGICAL WAKECODE;                                                       01982000
OPTION FORWARD;                                                         01984000
                                                                        01986000
PROCEDURE IMPEDE(PCBPT);                                                01988000
VALUE PCBPT;                                                            01990000
INTEGER PCBPT;                                                          01992000
OPTION FORWARD;                                                         01994000
                                                                        01996000
PROCEDURE UNIMPEDE(PCBPT);                                              01998000
VALUE PCBPT;                                                            02000000
INTEGER PCBPT;                                                          02002000
OPTION FORWARD;                                                         02004000
                                                                        02006000
PROCEDURE QUEUEPROC(PROCSYSDBINX,QUEUENAME,LOCATION);                   02008000
VALUE PROCSYSDBINX,QUEUENAME,LOCATION;                                  02010000
INTEGER PROCSYSDBINX,QUEUENAME,LOCATION;                                02012000
OPTION FORWARD;                                                         02014000
                                                                        02016000
PROCEDURE RECOVEROC(SEGIDENT,SEGDESCSTINX);                             02018000
VALUE SEGIDENT,SEGDESCSTINX;                                            02020000
INTEGER SEGIDENT,SEGDESCSTINX;                                          02022000
OPTION FORWARD;                                                         02024000
                                                                        02026000
PROCEDURE COLLECTGARBAGE(SINGLEHOLEBASE);                               02028000
VALUE SINGLEHOLEBASE;                                                   02030000
DOUBLE SINGLEHOLEBASE;                                                  02032000
OPTION FORWARD;                                                         02034000
                                                                        02036000
PROCEDURE IOFREEZE'(SEGIDENT);                                          02038000
VALUE SEGIDENT;                                                         02040000
LOGICAL SEGIDENT;                                                       02042000
OPTION FORWARD;                                                         02044000
                                                                        02046000
PROCEDURE IOUNFREEZE'(SEGIDENT);                                        02048000
VALUE SEGIDENT;                                                         02050000
LOGICAL SEGIDENT;                                                       02052000
OPTION FORWARD;                                                         02054000
                                                               <<01658>>02056000
<<****************************************************************>>    02058000
                                                                        02060000
COMMENT  THIS FUNCTION IS CALLED TO MONITOR AND/OR COLLECT              02062000
         PERFORMANCE MEASUREMENT DATA;                                  02064000
PROCEDURE MMSTAT(EVENT,P1,P2,P3);                              <<01658>>02066000
                                                               <<01658>>02068000
VALUE          EVENT,P1,P2,P3;                                 <<01658>>02070000
                                                               <<01658>>02072000
INTEGER        EVENT,P1,P2,P3;                                 <<01658>>02074000
                                                               <<01658>>02076000
OPTION         PRIVILEGED,UNCALLABLE;                          <<01658>>02078000
                                                               <<01658>>02080000
                                                               <<01658>>02082000
BEGIN <<MMSTAT>>                                               <<01658>>02084000
                                                               <<01658>>02086000
INTEGER          PINN;                <<PROCESS ID>>           <<01658>>02088000
INTEGER POINTER  MEASBUF,             <<MEASIO BUFFER POINTER>><<01658>>02090000
                 SMONBUF  = DB + %17; <<MONITOR BUF POINTER>>  <<01658>>02092000
                                                                        02094000
                                                                        02098000
LOGICAL    MEASFLAG = DB + %267;  <<MEASIO STATUS FLAGS>>      <<01658>>02100000
                                                               <<01658>>02102000
EQUATE           SYSDB = %1000,         <<SYSGLOB ADDRESS>>    <<01658>>02104000
                                                                        02106000
                 MEASBUFSIZE = 512;     <<MEASIO BUFFER SIZE>> <<01658>>02108000
                                                               <<01658>>02110000
INTRINSIC        TIMER;                 <<TIME FUNCTION>>      <<01658>>02112000
$PAGE "SYSTEM TABLE MANAGEMENT : GET SYSTAB ENTRY"                      02114000
                                                               <<01658>>02116000
                                                               <<01658>>02118000
DEFINE PIN=(ABSOLUTE(CPCB)-ABSOLUTE(3))/PCBSIZE#;              <<01658>>02120000
                                                               <<01658>>02122000
<< IF A PROCESS IS EXECUTING, GET ITS PIN >>                   <<01658>>02124000
                                                               <<01658>>02126000
PINN:=0;                                                       <<01715>>02128000
IF ABSOLUTE(CPCB) <> 0 THEN PINN := PIN;                       <<01658>>02130000
                                                               <<01658>>02132000
                                                               <<01658>>02134000
<< IF THE EVENT NUMBER IS POSITIVE THEN >>                     <<01658>>02136000
<<                                      >>                     <<01658>>02138000
<<      CHECK EVENT VALIDITY            >>                     <<01658>>02140000
<<      DISABLE INTERRUPTS              >>                     <<01658>>02142000
<<      XCHD TO SYSDB                   >>                     <<01658>>02144000
<<      LOG THE EVENT TO MONBUF         >>                     <<01658>>02146000
<<                                      >>                     <<01658>>02148000
<< IF THE EVENT NUMBER IS NEGATIVE THEN >>                     <<01658>>02150000
<<                                      >>                     <<01658>>02152000
<<      MAKE IT POSITIVE                >>                     <<01658>>02154000
<<      CHECK ITS VALIDITY              >>                     <<01658>>02156000
<<      DISABLE INTERRUPTS              >>                     <<01658>>02158000
<<      XCHD TO SYSDB                   >>                     <<01658>>02160000
                                                               <<01658>>02162000
                                                               <<01658>>02164000
                                                               <<01658>>02166000
                                                               <<01658>>02168000
<<  Turn off traps >>                                          <<04442>>02170000
PUSH(STATUS);                                                  <<04442>>02172000
TOS.(2:1) := 0;                                                <<04442>>02174000
SET(STATUS);                                                   <<04442>>02176000
                                                               <<01658>>02178000
TOS := EVENT;                                                  <<01658>>02180000
                                                               <<01658>>02182000
IF >= THEN                                                     <<01658>>02184000
                                                               <<01658>>02186000
  BEGIN <<POSITIVE EVENT>>                                     <<01658>>02188000
                                                               <<01658>>02190000
  IF EVENT > 255 THEN RETURN;                                  <<01658>>02192000
  push(z); push(s); assemble(sub);                             <<01934>>02194000
                                                               <<01658>>02196000
  if TOS<24 then return; <<MMstat cant stand a stack overflow>><<01934>>02198000
  DISABLE;                                                     <<01658>>02200000
                                                               <<01658>>02202000
  TOS := SYSDB D;            <<SWITCH TO SYSGLOB>>             <<01658>>02204000
                                                               <<01658>>02206000
  ASSEMBLE(XCHD);                                              <<01658>>02208000
                                                               <<01658>>02210000
                                                               <<01658>>02212000
                                                               <<01658>>02214000
<< SAVE EVENT/PIN,P1,P2,P3 IN MONBUF >>                        <<01658>>02216000
                                                               <<01658>>02218000
  TOS := EVENT;                                                <<01658>>02220000
  TOS.(0:8) := PINN;                                           <<01658>>02222000
  SMONBUF(SMONIDX) := TOS;                                     <<01658>>02224000
  SMONBUF(X:=X+1)  := P1;                                      <<01658>>02226000
  SMONBUF(X:=X+1)  := P2;                                      <<01658>>02228000
  SMONBUF(X:=X+1)  := P3;                                      <<01658>>02230000
                                                               <<01658>>02232000
                                                               <<01658>>02234000
<< IF THE END OF THE BUFFER HAS BEEN REACHED, >>               <<01658>>02236000
<< SET THE BUFFER INDEX TO THE START OF THE   >>               <<01658>>02238000
<< BUFFER AND RESET THE TIME STAMPS IN THE    >>               <<01658>>02240000
<< FIRST ENTRY.  THIS ENTRY CONTAINS TWO TIME >>               <<01658>>02242000
<< TIME STAMPS INDICATING THE LAST TWO TIMES  >>               <<01658>>02244000
<< WRAP AROUND HAS OCCURED.  TIME STAMPS ARE  >>               <<01658>>02246000
<< TWO WORDS IN LENGTH.                       >>               <<01658>>02248000
                                                               <<01658>>02250000
                                                               <<01658>>02252000
  IF (SMONIDX:=SMONIDX+4) >= LOGICAL(SMONBUF(-1)) THEN         <<01658>>02254000
                                                               <<01658>>02256000
     BEGIN <<MONBUF WRAP AROUND>>                              <<01658>>02258000
                                                               <<01658>>02260000
     TOS := TIMER;            <<GET NEW TIME STAMP>>           <<01658>>02262000
     TOS := SMONBUF(0);       <<GET OLD TIME STAMP>>           <<01658>>02264000
     TOS := SMONBUF(X:=X+1);                                   <<01658>>02266000
     SMONBUF(X:=X+2) := TOS;  <<SAVE OLD TIME STAMP>>          <<01658>>02268000
     SMONBUF(X:=X-1) := TOS;                                   <<01658>>02270000
     SMONBUF(X:=X-1) := TOS;  <<SAVE NEW TIME STAMP>>          <<01658>>02272000
     SMONBUF(X:=X-1) := TOS;                                   <<01658>>02274000
     SMONIDX := 4;            <<RESET BUFFER INDEX>>           <<01658>>02276000
                                                               <<01658>>02278000
     END; <<MONBUF WRAP AROUND>>                               <<01658>>02280000
                                                               <<01658>>02282000
  END <<POSITIVE EVENT>>                                       <<01658>>02284000
                                                               <<01658>>02286000
ELSE                                                           <<01658>>02288000
                                                               <<01658>>02290000
  BEGIN <<NEGATIVE EVENT>>                                     <<01658>>02292000
                                                               <<01658>>02294000
  TOS := -EVENT;                                               <<01658>>02296000
                                                               <<01658>>02298000
  IF (EVENT:=TOS) > 255 THEN RETURN;                           <<01658>>02300000
                                                               <<01658>>02302000
  DISABLE;                                                     <<01658>>02304000
  TOS := SYSDB D;                                              <<01658>>02306000
  ASSEMBLE(XCHD);                                              <<01658>>02308000
                                                               <<01658>>02310000
  END; <<NEGATIVE EVENT>>                                      <<01658>>02312000
                                                               <<01658>>02314000
                                                               <<01658>>02316000
<< IF A MONITOR RUN IS REQUESTED THEN LOG THE EVENT >>         <<01658>>02318000
<< TO THE MEASBUF DOUBLE BUFFER SET AND CALL MEASIO >>         <<01658>>02320000
<< WHEN A BUFFER IS FILLED.                         >>         <<01658>>02322000
                                                               <<01658>>02324000
                                                               <<01658>>02326000
IF (TOS:=MEASFLAG) THEN                                        <<01658>>02328000
                                                               <<01658>>02330000
  BEGIN <<MEASUREMENT ENABLED>>                                <<01658>>02332000
                                                               <<01658>>02334000
                                                               <<01658>>02336000
<< COMPUTE THE GROUP ID (MODULO 10) AND TEST ITS >>            <<01658>>02338000
<< CORRESPONDING MEASUREMENT ENABLE FLAG.        >>            <<01658>>02340000
                                                               <<01658>>02342000
                                                               <<01658>>02344000
  TOS := EVENT/10;                                             <<01658>>02346000
  ASSEMBLE(TRBC 11);                                           <<01658>>02348000
                                                               <<01658>>02350000
  TOS := IF = THEN MEAS'MSK0 ELSE MEAS'MSK1;                   <<04109>>02352000
                                                               <<01658>>02354000
  ASSEMBLE(STBX; TBC 0,X; DDEL);                               <<01658>>02356000
                                                               <<01658>>02358000
                                                               <<01658>>02360000
                                                               <<01658>>02362000
<< IF THE EVENT IS ENABLED FOR MONTIORING, DUMP IT   >>        <<01658>>02364000
<< TO THE CURRENT MEASUREMENT BUFFER.  IF THE BUFFER >>        <<01658>>02366000
<< IS FILLED, CALL "MEASIO" TO WRITE THE BUFFER TO   >>        <<01658>>02368000
<< TAPE AND SWITCH TO THE OTHER BUFFER.              >>        <<01658>>02370000
                                                               <<01658>>02372000
                                                               <<01658>>02374000
                                                               <<01658>>02376000
  IF <> THEN                            <<TEST ENABLE FLAG>>   <<01658>>02378000
                                                               <<01658>>02380000
     BEGIN <<EVENT ENABLED>>                                   <<01658>>02382000
                                                               <<01658>>02384000
     ASSEMBLE(TBC 14);                  <<TEST GROUP FLAG>>    <<01658>>02386000
     @MEASBUF := IF = THEN 0 ELSE 512; <<OFFSET INTO BUFFER>>  <<02725>>02388000
      TOS := MEAS'BANK;           <<MEASIO BUFFER BANK>>       <<04109>>02390000
      TOS := MEAS'BUF0;           <<MEASIO BUFFER>>            <<04109>>02392000
     ASSEMBLE(XCHD;DDEL);                                      <<02725>>02394000
                                                               <<02725>>02396000
     TOS := TIMER;                                             <<01658>>02398000
     ASSEMBLE(XCH);                                            <<01658>>02400000
     MEASBUF(MEAS'IDX) := TOS;                                 <<04109>>02402000
     MEASBUF(X:=X+1)  := TOS;                                  <<01658>>02404000
     MEASBUF(X:=X+1)  := PINN;                                 <<01658>>02406000
     MEASBUF(X:=X+1)  := EVENT;                                <<01658>>02408000
     MEASBUF(X:=X+1)  := P1;                                   <<01658>>02410000
     MEASBUF(X:=X+1)  := P2;                                   <<01658>>02412000
     MEASBUF(X:=X+1)  := P3;                                   <<01658>>02414000
                                                               <<01658>>02416000
      IF (MEAS'IDX := MEAS'IDX + 8 ) >= MEASBUFSIZE THEN       <<04109>>02418000
                                                               <<01658>>02420000
        BEGIN <<WRITE BUFFER>>                                 <<01658>>02422000
                                                               <<01658>>02424000
        MEAS'IDX := 0;                                         <<04109>>02426000
        ASSEMBLE(TCBC 14; DUP);   <<SWITCH BUFFER FLAG>>       <<01658>>02428000
        MEASFLAG := TOS;          <<SAVE IN CASE INTERRUPTED>> <<01658>>02430000
        TOS := 0;                 <<RESULT>>                   <<01658>>02432000
        TOS := MEAS'LDEV;         <<TAPE LDEV>>                <<04109>>02434000
        TOS := 1;                 <<MEASIO WRITE REQUEST>>     <<01658>>02436000
        TOS := MEAS'BANK;         <<MEASBUF BANK>>             <<04109>>02438000
        TOS := LOGICAL(@MEASBUF) + MEAS'BUF0; <<MEASBUF ADDR>> <<04109>>02440000
        TOS := MEASBUFSIZE;       <<MEASBUF SIZE>>             <<01658>>02442000
        TOS := MEAS'PLAB;         <<MEASIO PLABEL>>            <<04109>>02444000
                                                               <<02725>>02446000
        TOS := SYSDB D;      <<SWITCH TO SYSDB>>               <<02725>>02448000
        ASSEMBLE(XCHD;DDEL);                                   <<02725>>02450000
                                                               <<02725>>02452000
        ASSEMBLE(PCAL 0);         <<CALL MEASIO>>              <<01658>>02454000
                                                               <<01658>>02456000
                                                               <<01658>>02458000
                                                               <<01658>>02460000
<< ON RETURN FROM "MEASIO", CHECK THE TAPE STATUS  >>          <<01658>>02462000
<< AND MARK THE APPROPRIATE MEASFLAG BIT:          >>          <<01658>>02464000
<<          MEASFLAG(12:1) - TAPE ERROR            >>          <<01658>>02466000
<<          MEASFLAG(13:1) - END OF TAPE           >>          <<01658>>02468000
<<          MEASFLAG(14:1) - BUFFER SELECT         >>          <<01658>>02470000
<<          MEASFLAG(15:1) - MEASIO ENABLE         >>          <<01658>>02472000
                                                               <<01658>>02474000
        DEL;                 <<DELETE TAPE STATUS WORD>>       <<01658>>02476000
                                                               <<01658>>02478000
        IF <> THEN           <<TEST TAPE STATUS>>              <<01658>>02480000
                                                               <<01658>>02482000
           BEGIN <<TAPE STATUS>>                               <<01658>>02484000
                                                               <<01658>>02486000
           IF > THEN TOS.(13:1) := 1    <<END OF TAPE>>        <<01658>>02488000
                ELSE TOS.(12:1) := 1;   <<TAPE ERROR>>         <<01658>>02490000
                                                               <<01658>>02492000
           TOS.(15:1) := 0;             <<CLEAR MEASIO ENABLE>><<01658>>02494000
                                                               <<01658>>02496000
           END; <<TAPE STATUS>>                                <<01658>>02498000
                                                               <<01658>>02500000
        END; <<WRITE BUFFER>>                                  <<01658>>02502000
                                                               <<01658>>02504000
     END; <<EVENT ENABLED>>                                    <<01658>>02506000
                                                               <<01658>>02508000
  MEASFLAG := TOS;                 <<RESTORE MEASFLAG>>        <<01658>>02510000
                                                               <<01658>>02512000
  END <<MEASUREMENT ENABLED>>                                  <<01658>>02514000
                                                               <<01658>>02516000
                                                               <<01658>>02518000
ELSE                                                           <<01658>>02520000
                                                               <<01658>>02522000
  DEL;                             <<DELETE MEASFLAG>>         <<01658>>02524000
                                                               <<01658>>02526000
ASSEMBLE(XCHD);                                                <<01658>>02528000
                                                               <<01658>>02530000
END; <<MMSTAT>>                                                <<01658>>02532000
<<                                                                      02534000
STANDARD SYSTEM TABLE ENTRY MANAGEMENT PROCEDURES                       02536000
>>                                                                      02538000
                                                                        02540000
LOGICAL PROCEDURE GETSYSTABENTRY(SYSTABINX);                            02542000
VALUE SYSTABINX;                                                        02544000
LOGICAL SYSTABINX;                                                      02546000
OPTION PRIVILEGED,UNCALLABLE;                                           02548000
                                                                        02550000
COMMENT                                                                 02552000
                                                                        02554000
GETSYSTABENTRY REMOVES THE FIRST FREE ENTRY FROM A STANDARD             02556000
SYSTEM TABLE AND RETURNS THE SYSBASE RELATIVE INDEX OF THE              02558000
ENTRY.  IF THERE ARE NO FREE ENTRIES, GETSYSTABENTRY RETURNS 0.         02560000
FOR STANDARD SYSTEM TABLES WITH ENTRY LENGTHS >= 5, FREE ENTRIES        02562000
ARE TAKEN FROM THE HEAD OF THE FREE ENTRY LIST AND RETURNED TO THE TAIL.02564000
FOR SYSTEM TABLES OF ENTRYSIZE SIZE LARGER THAN 5, HIGH WATER MARKS ARE 02566000
MAINTAINED.                                                             02568000
;                                                                       02570000
                                                                        02572000
BEGIN                                                                   02574000
                                                                        02576000
LOGICAL RETURNVALUE=GETSYSTABENTRY;                                     02578000
                                                                        02580000
LOGICAL PREV,                                                           02582000
        NEXT,                                                           02584000
        ENTRIESUSED,                                                    02586000
        ENTRYSIZE;                                                      02588000
                                                                        02590000
<<ASSUMES DB AT SYSDB>>                                                 02592000
X:=SYSTABINX;                                                           02594000
ENTRYSIZE:=SYSTABENTRYSIZE;                                             02596000
DISABLE;                                                       <<01560>>02598000
TOS:=SYSTABFREECNT-1;                                          <<01770>>02600000
IF < THEN GETSYSTABENTRY:=0 <<CONFIGURED TOO SMALL>> ELSE               02602000
   BEGIN                                                                02604000
   SYSTABFREECNT:=TOS;                                         <<01770>>02606000
   GETSYSTABENTRY:=X:=SYSTABFIRSTFREEINX+SYSTABINX;                     02608000
   NEXT:=SYSTABENTRYNEXTFREEINX;                                        02610000
   SYSTABENTRY00(X):=0; <<FOR MOVE BELOW>>                              02612000
   X:=SYSTABINX;                                                        02614000
   SYSTABFIRSTFREEINX:=NEXT;                                            02616000
   IF ENTRYSIZE > 4 THEN IF NEXT=0 THEN SYSTABLASTFREEINX:=0;           02618000
   IF ENTRYSIZE > 5 THEN                                                02620000
      BEGIN <<MAINTAIN HIGH WATER MARK>>                                02622000
      ENTRIESUSED:=SYSTABENTRYCOUNT-SYSTABFREECNT;                      02624000
      IF ENTRIESUSED > SYSTABMOSTUSED THEN SYSTABMOSTUSED:=ENTRIESUSED; 02626000
      END;                                                              02628000
   <<ZERO OUT THE ENTRY>>                                               02630000
   TOS:=RETURNVALUE+1;                                                  02632000
   TOS:=RETURNVALUE;                                                    02634000
   TOS:=ENTRYSIZE-1;<<MOVE COUNT>>                                      02636000
   ASMB(MOVE);                                                          02638000
   END;                                                                 02640000
END  <<PROCEDURE GETSYSTABENTRY>>;                                      02642000
$PAGE "SYSTEM TABLE MANAGEMENT : REL SYSTAB ENTRY"                      02644000
$PAGE "MESSAGE FACILITY INTRINSICS : SEND MESSAGE"                      02646000
PROCEDURE RELSYSTABENTRY(SYSTABINX,ENTRYSYSBASEINX);                    02648000
VALUE SYSTABINX,ENTRYSYSBASEINX;                                        02650000
LOGICAL SYSTABINX,ENTRYSYSBASEINX;                                      02652000
OPTION PRIVILEGED,UNCALLABLE;                                           02654000
                                                                        02656000
COMMENT                                                                 02658000
                                                                        02660000
RELSYSTABENTRY RELEASES AN ENTRY OF A STANDRAD SYSTEM TABLE             02662000
TO THE TABLE'S FREE ENTRY LIST.  FOR SYSTEM TABLES WITH ENTRY           02664000
LENGTH <= 4 WORDS, A SINGLY LINKED LIST IS MAINTAINED, AND              02666000
RELEASED ENTRIES ARE PLACED AT THE HEAD OF THE LIST.  FOR               02668000
TABLES WITH ENTRY LENGTH >=5 WORDS, THE LIST OF FREE ENTRIES IS         02670000
DOUBLY LINKED, WITH ENTRIES BEING RELEASED TO THE TAIL AND              02672000
CONSUMED FROM THE HEAD.                                                 02674000
                                                                        02676000
;                                                                       02678000
                                                                        02680000
BEGIN                                                                   02682000
                                                                        02684000
LOGICAL OLDTAIL,                                                        02686000
        ENTRYTABLERELINX,                                               02688000
        OLDHEAD,                                                        02690000
        ENTRYSIZE;                                                      02692000
EQUATE TTAIL=3;                                                         02694000
                                                                        02696000
<<ASSUMES DB AT SYSDB>>                                                 02698000
                                                                        02700000
X:=SYSTABINX;                                                           02702000
ENTRYSIZE:=SYSTABENTRYSIZE;                                             02704000
ENTRYTABLERELINX:=ENTRYSYSBASEINX-SYSTABINX;                            02706000
                                                                        02708000
<<CHECK THAT ENTRY BEING RELEASED IS WITHIN RANE OF TABLE>>             02710000
                                                                        02712000
IF <= OR ENTRYTABLERELINX>(ENTRYSIZE*SYSTABCONFCOUNT(X))       <<03063>>02714000
THEN SUDDENDEATH(603);                                         <<01644>>02716000
DISABLE;                                                       <<01560>>02718000
SYSTABFREECNT:=SYSTABFREECNT+1;                                         02720000
IF ENTRYSIZE <= 4 THEN                                                  02722000
   BEGIN <<PLACE AT HEAD OF FREE ENTRY QUEUE>>                          02724000
   OLDHEAD:=SYSTABFIRSTFREEINX;                                         02726000
   SYSTABFIRSTFREEINX:=ENTRYTABLERELINX;                                02728000
   X:=ENTRYSYSBASEINX;                                                  02730000
   SYSTABENTRYNEXTFREEINX:=OLDHEAD;                                     02732000
   SYSTABFREEINDICATOR:=%100000;                                        02734000
   END                                                                  02736000
ELSE                                                                    02738000
   BEGIN                                                                02740000
   OLDTAIL:=SYSTABLASTFREEINX;                                          02742000
   SYSTABLASTFREEINX:=ENTRYTABLERELINX;                                 02744000
   IF OLDTAIL=0 THEN                                           <<01880>>02746000
      BEGIN  << TABLE WAS EMPTY >>                             <<01880>>02748000
      SYSTABFIRSTFREEINX := ENTRYTABLERELINX;                  <<01880>>02750000
      << ZERO OUT RELEASED ENTRY'S NEXT POINTER:  >>           <<01880>>02752000
      X := ENTRYSYSBASEINX;                                    <<01880>>02754000
      SYSTABENTRYNEXTFREEINX := 0;                             <<01880>>02756000
      END                                                      <<01880>>02758000
   ELSE                                                        <<01880>>02760000
      BEGIN  <<PLACE NEXT LINK INTO OLD TAIL,ZERO NEXT LINK>>           02762000
      X:=SYSTABINX+OLDTAIL;                                             02764000
      SYSTABENTRYNEXTFREEINX:=ENTRYTABLERELINX;                         02766000
      X:=ENTRYSYSBASEINX;                                               02768000
      SYSTABENTRYNEXTFREEINX:=0;                                        02770000
      END;                                                              02772000
   END;                                                                 02774000
END  <<PROCEDURE RELSYSTABENTRY>>;                                      02776000
PROCEDURE SENDMSG(DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS);                 02778000
VALUE DESTPIN,DESTPORTNUM,MSGLENGTH,FLAGS;                              02780000
INTEGER DESTPIN,DESTPORTNUM,MSGLENGTH;                                  02782000
LOGICAL FLAGS;                                                          02784000
OPTION PRIVILEGED,UNCALLABLE;                                           02786000
                                                                        02788000
COMMENT                                                                 02790000
                                                                        02792000
SENDMSG IS CALLED TO DELIVER A SHORT MESSAGE OF MSGLENGTH WORDS         02794000
TO THE MESSAGE PORT SPECIFIED BY DESTPORTNUM OF THE PROCESS             02796000
SPECIFIED BY DESTPIN.                                                   02798000
                                                                        02800000
THE FLAGS PARAMETER CONTROLS THE PROCEDURE AS FOLLOWS :                 02802000
                                                                        02804000
    FLAGS.MSGWAKEUPFLAG=1 ==> WAKE-UP DESTINATION PROCESS        HM.XX  02806000
                              FROM A MESSAGE WAIT                HM.XX  02808000
         .MSGSECTABFLAG=1 ==> BUFFER MESSAGE IN SECONDARY               02810000
                              MESSAGE TABLE                             02812000
                                                                        02814000
IF THE SECONDARY TABLE WAS SPECIFIED, AND THE TABLE IS FULL, THE CALLER 02816000
IS QUEUED FOR AN ENTRY AND WAITED.  IF THE PRIMARY TABLE IS SPECIFIED   02818000
AND THE TABLE IS FULL, SENDMSG CRASHES THE SYSTEM.                      02820000
                                                                        02822000
SENDMSG EXPECTS THE FIRST WORD OF THE MESSAGE TO BE AT Q-7-MSGLENGTH    02824000
AND THE LAST WORD TO BE AT Q-8.  ON EXIT THE STACKED MESSAGE CONTENTS   02826000
ARE DELETED.                                                            02828000
                                                                        02830000
IF THE FLAGS SPECIFY THAT THE DESTINATION PROCESS BE AWAKENED, THE      02832000
RETURN CC IS SET TO CCG IF THE PROCESS IS ALREADY AWAKE.                02834000
                                                                        02836000
THE MESSAGE CONTENTS STACKED BY THE CALLER ARE DELETED ON THE EXIT      02838000
FROM SENDMSG.                                                           02840000
                                                                        02842000
;                                                                       02844000
                                                                        02846000
                                                                        02848000
BEGIN                                                                   02850000
                                                                        02852000
EQUATE PARMCNT=4,  <<INCOMING PARAMETER COUNT>>                         02854000
       LASTMSGWORD=4+PARMCNT;                                           02856000
                                                                        02858000
ARRAY MSGARRAY(*)=Q-LASTMSGWORD; <<STARTS AT Q-8>>                      02860000
                                                                        02862000
DOUBLE MSGHARBORTABBASE,                                                02864000
       DESTHARBORBASE,                                                  02866000
       PRIMMSGTABBASE,                                                  02868000
       SECMSGTABBASE,                                                   02870000
       MSGADDRESS;                                                      02872000
                                                                        02874000
INTEGER CALLERPIN,                                                      02876000
        OLDHEADPIN,                                                     02878000
        MSGINDEX,                                                       02880000
        NEWFREEHEAD,                                                    02882000
        I;                                                              02884000
                                                                        02886000
LOGICAL MSGLINK;                                                        02888000
                                                                        02890000
                                                                        02892000
LOGICAL GOTONE:=FALSE;                                                  02894000
                                                                        02896000
SUBROUTINE GETMSGTABENTRY;                                              02898000
                                                                        02900000
BEGIN                                                                   02902000
IF FLAGS.MSGSECTABFLAG THEN TOS:=SECMSGTABBASE                          02904000
ELSE TOS:=PRIMMSGTABBASE;                                               02906000
TOS:=TOS+3;                                                             02908000
ASMB(LSEA);  <<INDEX OF FIRST FREE ENTRY>>                              02910000
MSGINDEX:=TOS;                                                          02912000
IF <> THEN                                                              02914000
   BEGIN <<MESSAGE ENTRY IN SPECIFIED TABLE IS AVAILABLE>>              02916000
   GOTONE:=TRUE;                                                        02918000
   TOS:=TOS-1;<<ADDR OF AVAIL ENTRY CNT>>                               02920000
   ASMB(LSEA);                                                          02922000
   TOS:=TOS-1; <<UPDATE AVAIL CNT>>                                     02924000
   IF < THEN SUDDENDEATH(620);                                 <<01644>>02926000
   ASMB(SSEA);                                                          02928000
   TOS:=TOS-2;  <<MSGTABBASE>>                                          02930000
   TOS:=MSGINDEX;                                                       02932000
   ASMB(LADD,DDUP);                                                     02934000
   MSGADDRESS:=TOS;                                                     02936000
   TOS:=TOS+1; <<ADDRESS OF NEXT IN FREE LIST>>                         02938000
   ASMB(LSEA);                                                          02940000
   NEWFREEHEAD:=TOS;                                                    02942000
   ASMB(DDEL);                                                          02944000
   IF FLAGS.MSGSECTABFLAG THEN TOS:=SECMSGTABBASE                       02946000
   ELSE TOS:=PRIMMSGTABBASE;                                            02948000
   TOS:=TOS+3;                                                          02950000
   TOS:=NEWFREEHEAD;                                                    02952000
   ASMB(SSEA;DDEL);  <<UPDATE NEW HEAD OF FREE ENTRY LIST>>             02954000
   END                                                                  02956000
ELSE                                                                    02958000
   BEGIN  <<OUT OF ENTRIES>>                                            02960000
   IF NOT FLAGS.MSGSECTABFLAG THEN SUDDENDEATH(620);           <<01644>>02962000
                                                                        02964000
   <<QUEUE FOR ENTRY AND IMPEDE>>                                       02966000
                                                                        02968000
   IF ABSOLUTE(4)=0 THEN SUDDENDEATH(621);                     <<01644>>02970000
   CALLERPIN:=(ABSOLUTE(4)-ABSOLUTE(3))/PCBSIZE;                        02972000
   TOS:=TOS+1;                                                 <<03041>>02974000
   ASMB(LSEA); <<PIN OF FIRST QUEUED>>                                  02976000
   OLDHEADPIN:=TOS;                                                     02978000
   TOS:=CALLERPIN;                                                      02980000
   ASMB(SSEA;DDEL);  <<PLACE CALLER AT HEAD OF QUEUE>>                  02982000
   PCB(CALLERPIN*PCBSIZE+PIINFONIMPPINWORDNUM).NIMPPINFIELD             02984000
      :=OLDHEADPIN;  <<ATTACH Q>>                                       02986000
   IMPEDE(0);                                                           02988000
   DISABLE;                                                             02990000
   END;                                                                 02992000
END <<SUBROUTINE GETMSGTABENTRY>>;                                      02994000
                                                                        02996000
<<FILL IN LOCAL VARIABLES>>                                             02998000
                                                                        03000000
TOS:=DST(MSGHARBTABDSTN&LSL(2)+2);                                      03002000
TOS:=DST(X:=X+1);                                                       03004000
ASMB(DDUP);                                                             03006000
MSGHARBORTABBASE:=TOS;                                                  03008000
TOS:=MSGHARBORLENGTH*DESTPIN;                                           03010000
ASMB(LADD);                                                             03012000
DESTHARBORBASE:=TOS;                                                    03014000
TOS:=DST(PRIMMSGTABDSTN&LSL(2)+2);                                      03016000
TOS:=DST(X:=X+1);                                                       03018000
PRIMMSGTABBASE:=TOS;                                                    03020000
TOS:=DST(SECMSGTABDSTN&LSL(2)+2);                                       03022000
TOS:=DST(X:=X+1);                                                       03024000
SECMSGTABBASE:=TOS;                                                     03026000
                                                                        03028000
<<OBTAIN A MSG TABLE ENTRY FOR BUFFERING THE MESSAGE>>                  03030000
                                                                        03032000
DISABLE;                                                                03034000
WHILE NOT GOTONE DO GETMSGTABENTRY;                                     03036000
                                                                        03038000
<<FILL IN THE MESSSAGE ENTRY>>                                          03040000
                                                                        03042000
IF MSGLENGTH > MAXMSGLENGTH THEN SUDDENDEATH(622);             <<01644>>03044000
TOS:=MSGADDRESS; <<INITIALIZED BY GETMSGTABENTRY>>                      03046000
TOS:=0;  <<LINK TO NEXT MSG IN FIFO(THIS ONE AT END)>>                  03048000
ASMB(SSEA);                                                             03050000
I:=0;                                                                   03052000
WHILE (I:=I+1) <= MSGLENGTH DO                                          03054000
   BEGIN  <<PUT IN NEXT MSG WORD>>                                      03056000
   TOS:=TOS+1;                                                          03058000
   TOS:=MSGARRAY(-MSGLENGTH+I);                                         03060000
   ASMB(SSEA);                                                          03062000
   END;                                                                 03064000
ASMB(DDEL); <<ADDR OF LOCATION FOR LAST MSG WORD>>                      03068000
                                                                        03070000
<<FLAG PORT NON-EMPTY IN DESTNATION HARBOR>>                            03072000
                                                                        03074000
IF DESTPORTNUM > MAXPORTNUM THEN SUDDENDEATH(622);             <<01644>>03076000
TOS:=DESTHARBORBASE;                                                    03078000
TOS:=TOS+MSGPORTWORDNUM;  <<ADDR OF PORTMASK>>                          03080000
ASMB(LSEA);                                                             03082000
X:=DESTPORTNUM;                                                         03084000
ASMB(TSBC 0,X);                                                         03086000
ASMB(SSEA);                                                             03088000
                                                                        03090000
<<LINK THE ENTRY TO THE END OF THE DEST PORT'S FIFO QUEUE>>             03092000
                                                                        03094000
TOS:=TOS-MSGPORTWORDNUM+DESTPORTNUM;                                    03096000
ASMB(LSEA);                                                             03098000
MSGLINK:=TOS;                                                           03100000
IF = THEN                                                               03102000
   BEGIN                                                                03104000
   TOS:=MSGINDEX;                                                       03106000
   TOS.(0:1):=FLAGS.MSGSECTABFLAG; <<LINK>>                             03108000
   ASMB(SSEA);                                                          03110000
   END                                                                  03112000
ELSE                                                                    03114000
   BEGIN <<FLIP THRU Q AND PUT AT END>>                                 03116000
   WHILE MSGLINK <> 0 DO                                                03118000
      BEGIN                                                             03120000
      IF MSGLINK.(0:1)=1 THEN TOS:=SECMSGTABBASE                        03122000
      ELSE TOS:=PRIMMSGTABBASE;                                         03124000
      TOS:=MSGLINK;                                                     03126000
      TOS.(0:1):=0;                                                     03128000
      ASMB(LADD);                                                       03130000
      ASMB(LSEA);                                              <<01560>>03132000
      MSGLINK:=TOS;                                                     03134000
      IF = THEN                                                         03136000
         BEGIN <<HIT END OF Q>>                                         03138000
         TOS:=MSGINDEX;                                                 03140000
         TOS.(0:1):=FLAGS.MSGSECTABFLAG; <<LINK>>                       03142000
         ASMB(SSEA);                                                    03144000
         END;                                                           03146000
      ASMB(DDEL);                                                       03148000
      END;                                                              03150000
   END;                                                                 03152000
                                                                        03154000
<<WAKE-UP DESTINATION PROCESS IF CALLER SO REQUESTED>>                  03156000
                                                                        03158000
IF FLAGS.MSGWAKEUPFLAG                                                  03160000
THEN AWAKE(DESTPIN*PCBSIZE,MSGWAITCODE,NOWAIT);                         03162000
IF DESTPIN=0 THEN                                                       03164000
   BEGIN  <<SPECIAL FOR SCHEDULER MESSAGES>>                            03166000
   IF ABSOLUTE(SYSDISPAWAKEMSG).DISPRUNNINGFLAG                         03168000
   AND NOT ABSOLUTE(SYSDISPAWAKEMSG).PAUSEDFLAG                         03170000
   THEN ABSOLUTE(SYSAWAKESCHEDMSG):=0 <<PREEMPT CUR ACT>>               03172000
   ELSE ASMB(DISP); <<PREEMPT CURRENT PROCESS OR WAKE DISP>>            03174000
   END;                                                                 03176000
                                                                        03178000
<<BUILD AND EXECUTE AN EXIT INSTRUCTION TO DELETE STACKED MSG>>         03180000
                                                                        03182000
TOS:=MSGLENGTH+PARMCNT;  <<# OF PARAMETERS TO DELETE>>                  03184000
TOS:=TOS LOR (%31400);  <<BUILD EXIT INSTRUCTION>>                      03186000
ASMB(XEQ 0);                                                            03188000
END  <<PROCEDURE SENDMSG>>;                                             03190000
$PAGE "MESSAGE FACILITY INTRINSICS : PORT STATUS"                       03192000
INTEGER PROCEDURE PORTSTATUS(PORTNUMBER);                               03194000
VALUE PORTNUMBER;                                                       03196000
INTEGER PORTNUMBER;                                                     03198000
OPTION PRIVILEGED,UNCALLABLE;                                           03200000
                                                                        03202000
COMMENT                                                                 03204000
                                                                        03206000
WHEN SUPPLIED A VALID PORTNUMBER, PORTSTATUS RETURNS A TRUE             03208000
VALUE IF THE PORT IS NON-EMPTY AND A FALSE VALUE IF THE PORT IS         03210000
EMPTY.                                                                  03212000
                                                                        03214000
WHEN PASSED A -1 AS PORTNUMBER PARAMETER, PORTSTATUS RETURNS            03216000
THE PORTNUMBER OF THE PROCESS' MOST URGENT NON-EMPTY PORT (WHERE        03218000
THE CONVENTION OF LOWER NUMERICAL PORT NUMBERS RELATING TO MORE         03220000
URGENT PORTS IS UNDERSTOOD).                                            03222000
                                                                        03224000
IF ALL PORTS ARE EMPTY, PORTSTATUS RETURNS CC=CCE.  IF AT LEAST         03226000
ONE PORT IS NON-EMPTY, PORTSTATUS RETURNS CC=CCG.                       03228000
                                                                        03230000
;                                                                       03232000
                                                                        03234000
                                                                        03236000
BEGIN                                                                   03238000
                                                                        03240000
INTEGER CALLERPIN;                                                      03242000
                                                                        03244000
IF ABSOLUTE(CPCB)=0 THEN CALLERPIN:=0                                   03246000
ELSE CALLERPIN:=(ABSOLUTE(CPCB)-ABSOLUTE(PCBP))/PCBSIZE;                03248000
TOS:=DST(MSGHARBTABDSTN&LSL(2)+2); <<BANK OF MSG HARBOR TAB>>           03250000
TOS:=DST(X:=X+1); <<OFFSET IN BANK OF MSG HARBOR TAB>>                  03252000
TOS:=CALLERPIN*MSGHARBORLENGTH; <<OFFSET OF CALLER'S HARBOR>>           03254000
ASMB(LADD);                                                             03256000
                                                                        03258000
<<GRAB CALLER'S PORT STATUS>>                                           03260000
                                                                        03262000
DISABLE;                                                                03264000
TOS:=TOS+MSGPORTWORDNUM;  <<ADDR OF HARBOR'S PORT STATUS>>              03266000
ASMB(LSEA); <<LDEA IF EXTEND TO 32 PORTS>>                              03268000
IF = THEN                                                               03270000
   BEGIN <<ALL PORTS EMPTY>>                                            03272000
   CC:=CCE;                                                             03274000
   PORTSTATUS:=FALSE;                                                   03276000
   END                                                                  03278000
ELSE                                                                    03280000
   BEGIN  <<AT LEAST ONE PORT NON-EMPTY>>                               03282000
   IF PORTNUMBER <> -1 THEN                                             03284000
      BEGIN  <<CHECK SPECIFIC PORT>>                                    03286000
      IF PORTNUMBER > MAXPORTNUM THEN SUDDENDEATH(622);        <<01644>>03288000
      X:=PORTNUMBER;                                                    03290000
      ASMB(TSBC 0,X);                                                   03292000
      IF <> THEN PORTSTATUS:=TRUE;                                      03294000
      END                                                               03296000
   ELSE                                                                 03298000
      BEGIN  <<RETURN PORTNUMBER OF MOST URGENT NON-EMPTY PORT>>        03300000
      ASMB(SCAN);                                                       03302000
      IF X > MAXPORTNUM THEN SUDDENDEATH(620);                 <<01644>>03304000
      PORTSTATUS:=X;                                                    03306000
      END;                                                              03308000
   END;                                                                 03310000
END  <<PROCEDURE PORTSTATUS>>;                                          03312000
$PAGE "MESSAGE FACILITY INTRINSICS : RECEIVE MESSAGE"                   03314000
PROCEDURE RECEIVEMSG(PORTNUM,MSGLENGTH,FLAGS);                          03316000
VALUE PORTNUM,MSGLENGTH,FLAGS;                                          03318000
INTEGER PORTNUM,MSGLENGTH;                                              03320000
LOGICAL FLAGS;                                                          03322000
OPTION PRIVILEGED,UNCALLABLE;                                           03324000
                                                                        03326000
COMMENT                                                                 03328000
                                                                        03330000
RECEIVEMSG IS CALLED TO OBTAIN THE CONTENTS OF THE MESSAGE              03332000
AT THE HEAD OF THE CALLING PROCESS' MSG PORT (PORT SPECIFIED            03334000
BY PORTNUMBER PARAMETER).                                               03336000
                                                                        03338000
THE CALLER OF RECEIVEMSG DOES AN ASMB(ADDS MSGLENGHTH) TO MAKE          03340000
SPACE FOR THE MSG CONTENTS.  RECEIVEMSG DEPOSITS THE MSG CONTENTS       03342000
INTO Q-7-MSGLENGTH,...,Q-8, WITH THE FIRST WORD OF THE SENT             03344000
MESSAGE DEPOSITED INTO Q-7-MSGLENGTH.                                   03346000
                                                                        03348000
THE CALLER HAS THE OPTION OF A NON-DESTRUCTIVE READ OF THE MESSAGE.     03350000
FLAGS.MSGNONDESTRUCT=1 ==> RETURN CONTENTS OF MESSAGE, BUT LEAVE        03352000
                           MESSAGE AT THE HEAD OF THE PORT.             03354000
FLAGS.MSGWAITONEMPTY=1 ==> WAIT THE CALLER ON A MESSAGE WAIT   <<02805>>03356000
                           IF THE QUEUE IS EMPTY. (PROCESS     <<02805>>03358000
                           WILL BE REAWAKENED WHEN SOMEBODY    <<02805>>03360000
                           SENDS A MESSAGE TO THE SPECIFIED    <<02805>>03362000
                           PORT).                              <<02805>>03364000
                                                                        03366000
STATUS IS RETURNED THRU THE CC AS FOLLOWS :                    <<02805>>03370000
                                                               <<02805>>03372000
   IF PORT IS EMPTY AND WAIT NOT SPECIFIED CC:=CCG.            <<02805>>03374000
   IF A MSG BEING RETURNED, CC:=CCE.                           <<02805>>03376000
                                                               <<02805>>03378000
                                                                        03380000
;                                                                       03382000
                                                                        03384000
BEGIN                                                                   03386000
                                                                        03388000
EQUATE PARMCNT=3,                                                       03390000
       LASTMSGWORD=4+PARMCNT;                                           03392000
                                                                        03394000
ARRAY MSGARRAY(*)=Q-LASTMSGWORD;  <<STARTS AT Q-7>>                     03396000
                                                                        03398000
DOUBLE MSGHARBORBASE,                                                   03400000
       PRIMMSGTABBASE,                                                  03402000
       SECMSGTABBASE,                                                   03404000
       PORTMASKADDR,                                                    03406000
       PORTHEADADDR,                                                    03408000
       MSGADDR;                                                         03410000
                                                                        03412000
LOGICAL MSGLINK;                                                        03414000
                                                                        03416000
INTEGER CALLERPIN,                                                      03418000
        I,                                                              03420000
        NEXTLINK;                                                       03422000
                                                               <<02805>>03424000
LOGICAL SKIPIT:=FALSE;                                         <<02805>>03426000
                                                                        03428000
<<FILL IN LOCAL VARIABLES>>                                             03430000
                                                                        03432000
IF ABSOLUTE(CPCB)=0 THEN CALLERPIN:=0                                   03434000
ELSE CALLERPIN:=(ABSOLUTE(CPCB)-ABSOLUTE(PCBP))/PCBSIZE;                03436000
TOS:=DST(PRIMMSGTABDSTN&LSL(2)+2);                                      03438000
TOS:=DST(X:=X+1);                                                       03440000
PRIMMSGTABBASE:=TOS;                                                    03442000
TOS:=DST(SECMSGTABDSTN&LSL(2)+2);                                       03444000
TOS:=DST(X:=X+1);                                                       03446000
SECMSGTABBASE:=TOS;                                                     03448000
TOS:=DST(MSGHARBTABDSTN&LSL(2)+2); <<BANK OF MSG HARBOR TAB>>           03450000
TOS:=DST(X:=X+1); <<OFFSET IN BANK OF MSG HARBOR TAB>>                  03452000
TOS:=CALLERPIN*MSGHARBORLENGTH; <<OFFSET OF CALLER'S HARBOR>>           03454000
ASMB(LADD,DDUP);                                                        03456000
MSGHARBORBASE:=TOS;                                                     03458000
TOS:=TOS+MSGPORTWORDNUM;  <<ADDR OF HARBOR'S PORT STATUS>>              03460000
PORTMASKADDR:=TOS;                                                      03464000
                                                                        03466000
<<SEE IF PORT HAS SOME MESSAGES>>                                       03468000
                                                                        03470000
CHECKPORT :                                                    <<02805>>03472000
                                                               <<02805>>03474000
TOS:=PORTMASKADDR;                                             <<02805>>03476000
DISABLE;                                                                03478000
ASMB(LSEA); <<LDEA IF EXTEND TO 32 PORTS>>                              03480000
X:=PORTNUM;                                                             03482000
ASMB(TBC 0,X);                                                          03484000
IF = THEN                                                      <<02805>>03488000
   BEGIN <<PORT IS EMPTY>>                                     <<02805>>03490000
   ASMB(DEL,DDEL);                                             <<02805>>03492000
   IF FLAGS.MSGWAITONEMPTY THEN                                <<02805>>03494000
      BEGIN  <<CALLER WANTS TO WAIT TILL THE MSG ARRIVES>>     <<02805>>03496000
      WAIT(MSGWAITCODE,NOINFO);                                <<02805>>03498000
      GO CHECKPORT;                                            <<02805>>03500000
      END                                                      <<02805>>03502000
   ELSE                                                        <<02805>>03504000
      BEGIN <<NOWAIT OPTION>>                                  <<02805>>03506000
      CC:=CCG;                                                 <<02805>>03508000
      SKIPIT:=TRUE;                                            <<02805>>03510000
      END;                                                     <<02805>>03512000
   END;                                                        <<02805>>03514000
                                                               <<02805>>03516000
                                                               <<02805>>03518000
IF NOT SKIPIT THEN                                             <<02805>>03520000
   BEGIN  <<THERE IS A PENDING MESSAGE AT THIS PORT>>                   03522000
   CC:=CCE;                                                             03524000
   ASMB(DEL,DDEL);                                                      03526000
   TOS:=MSGHARBORBASE;                                                  03528000
   TOS:=PORTNUM;                                                        03530000
   ASMB(LADD;LSEA);                                                     03532000
   IF = THEN SUDDENDEATH(620);                                 <<01644>>03534000
                                                                        03536000
   <<RETURN THE CONTENTS OF THE FIRST MESSAGE ON THIS PORT>>            03538000
                                                                        03540000
   MSGLINK:=TOS;                                                        03542000
   PORTHEADADDR:=TOS;                                                   03544000
   IF MSGLINK.MSGSECTABFLAG THEN TOS:=SECMSGTABBASE                     03546000
   ELSE TOS :=PRIMMSGTABBASE;                                           03548000
   TOS:=MSGLINK;                                                        03550000
   TOS.(0:1):=0;                                                        03552000
   ASMB(LADD,DDUP);                                                     03554000
   MSGADDR:=TOS;                                                        03556000
   ASMB(LSEA);                                                          03558000
   NEXTLINK:=TOS;                                                       03560000
   IF MSGLENGTH > MAXMSGLENGTH THEN SUDDENDEATH(622);          <<01644>>03562000
   I:=0;                                                                03564000
   WHILE (I:=I+1) <= MSGLENGTH DO                                       03566000
      BEGIN                                                             03568000
      TOS:=TOS+1;                                                       03570000
      ASMB(LSEA);                                                       03572000
      MSGARRAY(-MSGLENGTH+I):=TOS;                                      03574000
      END;                                                              03576000
                                                                        03578000
   IF NOT FLAGS.MSGNONDESTRUCT THEN                                     03580000
      BEGIN  <<RELEASE MESSAGE>>                                        03582000
                                                                        03584000
      <<UNLINK MESSAGE FROM PORT HEAD>>                                 03586000
                                                                        03588000
      TOS:=PORTHEADADDR;                                                03590000
      TOS:=NEXTLINK;                                                    03592000
      ASMB(SSEA;DDEL);<<UPDATE NEW HEAD OF MSG Q FOR THIS PORT>>        03594000
                                                                        03596000
      <<UPDATE NON-EMPTY PORT MASK>>                                    03598000
                                                                        03600000
      IF NEXTLINK = 0 THEN                                              03602000
         BEGIN  <<PORT IS NOW EMPTY>>                                   03604000
         TOS:=PORTMASKADDR;                                             03606000
         ASMB(LSEA);                                                    03608000
         X:=PORTNUM;                                                    03610000
         ASMB(TRBC 0,X);                                                03612000
         ASMB(SSEA);                                                    03614000
         END;                                                           03616000
                                                                        03618000
      <<RELEASE MSG TABLE ENTRY TO FREE LIST>>                          03620000
                                                                        03622000
      IF MSGLINK.MSGSECTABFLAG THEN TOS:=SECMSGTABBASE                  03624000
      ELSE TOS:=PRIMMSGTABBASE;                                         03626000
      TOS:=TOS+2;                                                       03628000
      ASMB(LSEA);                                                       03630000
      TOS:=TOS+1;  <<#OF AVAILABLE ENTRIES>>                            03632000
      ASMB(SSEA);                                                       03634000
      TOS:=TOS+1;                                                       03636000
      ASMB(LSEA);                                                       03638000
      NEXTLINK:=TOS;                                                    03640000
      TOS:=MSGLINK;                                                     03642000
      TOS.(0:1):=0;                                                     03644000
      ASMB(SSEA);  <<NEW HEAD OF FREE MSG LIST>>                        03646000
      TOS:=MSGADDR;                                                     03648000
      TOS:=%100000;                                                     03650000
      ASMB(SSEA);                                                       03652000
      TOS:=TOS+1;                                                       03654000
      TOS:=NEXTLINK;                                                    03656000
      ASMB(SSEA);  <<LINK UP REST OF LIST OF FREE ENTRIES>>             03658000
      IF MSGLINK.MSGSECTABFLAG AND NEXTLINK=0 THEN                      03660000
         BEGIN  <<SOMEBODY MAY HAVE BEEN IMPEDED ON AN ENTRY>>          03662000
         TOS:=SECMSGTABBASE;                                            03664000
         TOS:=TOS+4;                                                    03666000
         ASMB(LSEA);                                                    03668000
         IF <> THEN UNIMPEDE(S0*PCBSIZE);                               03670000
         END;                                                           03672000
      END;                                                              03674000
   END;                                                                 03676000
END  <<PROCEDURE RECEIVEMSG>>;                                          03678000
$PAGE "MEASUREMENT INTERFACE : UPDATESTATISTICS"                        03680000
INTEGER PROCEDURE UPDATESTATISTICS(CLASS,SUBCLASS,SUBCLASSENTRY,        03682000
                                   STARTINGITEM,NEWVALUEFLAG,           03684000
                                   VALUECHANGE,DOUBLEITEMFLAG);         03686000
  VALUE   CLASS,SUBCLASS,SUBCLASSENTRY,STARTINGITEM,NEWVALUEFLAG,       03688000
          VALUECHANGE,DOUBLEITEMFLAG;                                   03690000
  INTEGER CLASS,SUBCLASS,SUBCLASSENTRY,STARTINGITEM;                    03692000
  DOUBLE  VALUECHANGE;                                                  03694000
  LOGICAL NEWVALUEFLAG,DOUBLEITEMFLAG;                                  03696000
  OPTION  PRIVILEGED,UNCALLABLE;                                        03698000
                                                                        03700000
COMMENT                                                                 03702000
*************************************************************           03704000
THIS PROCEDURE IS USED TO UPDATE AN ITEM IN A GIVEN CLASS,              03706000
SUBCLASS, ENTRY DEFINED BY THE MPE IV MEASUREMENT INTERFACE.            03708000
                                                                        03710000
INPUT PARAMETERS:                                                       03712000
                                                                        03714000
      CLASS,          THE CLASSNUMBER OF STATS TO BE UPDATED            03716000
      SUBCLASS,       SUBCLASS NUMBER OF CLASS                          03718000
      SUBCLASSENTY,   ENTRY NUMBER OF SUBCLASS                          03720000
      STARTINGITEM,           STARTINGITEM # OF ENTRY                   03722000
      NEWVALUEFLAG,   IF TRUE=> VALUECHANGE PARM REPLACES STARTINGITEM  03724000
                      ELSE ADD VALUECHANGE TO OLD STARTINGITEM          03726000
      VALUECHANGE     EITHER ADDED TO OR REPLACES OLD STARTINGITEM      03728000
      DOUBLEITEMFLAG  IF TRUE=> VALUECHANGE IS A DOUBLE WORD UPDATE     03730000
                                                                        03732000
RETURN VALUES:                                                          03734000
                                                                        03736000
      CC = CCL ==> BAD PARAMETER                                        03738000
      CC = CCE ==> OK                                                   03740000
      CC = CCG ==> NOT USED                                             03742000
                                                                        03744000
      UPDATESTATISTICS = 0 ==> OK                                       03746000
                       = 1 ==> STATS NOT ENABLED                        03748000
                       = 2 ==> BAD STARTINGITEM PARM                    03750000
                       = 3 ==> BAD SUBCLASSENTRY PARM                   03752000
                       = 4 ==> BAD SUBCLASS PARM                        03754000
                       = 5 ==> BAD CLASS PARM                           03756000
                                                                        03758000
ENTRY POINTS:                                                           03760000
                                                                        03762000
      FUPDATESTATISTICS: WILL BYPASS ALL PARAMETER CHECKING,            03764000
                         BUT WILL NOT ALLOW UPDATING IF CLASS           03766000
                         NOT ENABLED.                                   03768000
                                                                        03770000
OPERATION:                                                              03772000
                                                                        03774000
      UPDATESTATISTICS WILL FIRST CHECK TO SEE THAT THE CLASS           03776000
      OF STATISTICS REQUESTED TO BE UPDATED HAS BEEN ENABLED.           03778000
      IF IT WAS ENABLED IT WILL USE ABS ADDRESSING TO RETRIEVE          03780000
      SOME OFFSETS AND VALUES FROM THE LOCKED AND FROZEN STAT-          03782000
      ISTICS GATHERING DATASEGMENT. IF THE ALTERNATE ENTRY POINT        03784000
      FUPDATESTATISTICS WAS NOT USED, THEN PARAMETER CHECKING IS        03786000
      PREFORMED ON THE CLASS, SUBCLASS, SUBCLASSENTRY AND START-        03788000
      INGITEM PARAMETERS. IF AN ERROR WAS ENCOUNTERED THEN CC           03790000
      IS SET TO CCL AND WE RETURN, OTHERWISE EITHER A SINGLE            03792000
      OR DOUBLE ITEM IS UPDATED (BASED ON DOUBLEITEMFLAG) AND           03794000
      THE OLDVALUE IS EITHER INCREMENTED OR REPLACED (BASED ON          03796000
      NEWVALUEFLAG).                                                    03798000
                                                                        03800000
*************************************************************           03802000
;                                                                       03804000
BEGIN                                                                   03806000
                                                                        03808000
EQUATE  NOTENBLD       = 1,  <<STATISTICS GATH NOT ENBLD>>              03810000
        ITEM'ERROR     = 2,  <<ITEM OUT OF RANGE     >>                 03812000
        SUBENTRY'ERROR = 3,  <<SUBCLASS OUT OF RANGE >>                 03814000
        SUBCLASS'ERROR = 4,  <<SUBCLASS OUT OF RANGE    >>              03816000
        CLASS'ERROR    = 5;  <<CLASS OUT OF RANGE   >>                  03818000
                                                                        03820000
INTEGER ERROR:=NOTENBLD,                                                03822000
        CLASSBASE,       <<OFFSET TO REQUESTED CLASS>>                  03824000
        SUBBASE,         <<SEG REL OFFSET TO REQ SUBCLASS>>             03826000
        ACTUAL'ENTRIES,  <<NUM ENTRIES LESS ENTRY 0>>                   03828000
        VALUECHANGE0=VALUECHANGE,  <<MSW OF VALUECHANGE>>               03830000
        VALUECHANGE1=VALUECHANGE+1,<<LSW OF VALUECHANGE>>               03832000
        SAVECC,          <<TEMP COND CODE>>                             03834000
        X=X,             <<X REG>>                                      03836000
        STATUS=Q-1;      <<STATUS REGISTER>>                            03838000
                                                                        03840000
INTEGER ARRAY C0'SUBSIZES(*) = PB:= CLASS0'SUB0SIZE,                    03842000
                                    CLASS0'SUB1SIZE,                    03844000
                                    CLASS0'SUB2SIZE,                    03846000
                                    CLASS0'SUB3SIZE;                    03848000
                                                                        03850000
INTEGER ARRAY C1'SUBSIZES(*) = PB:= CLASS1'SUB0SIZE,                    03852000
                                    CLASS1'SUB1SIZE,                    03854000
                                    CLASS1'SUB2SIZE,                    03856000
                                    CLASS1'SUB3SIZE,                    03858000
                                    CLASS1'SUB4SIZE,                    03860000
                                    CLASS1'SUB5SIZE;                    03862000
                                                                        03864000
LOGICAL POINTER MEASINFO'TABPTR = %261;                                 03866000
                                                                        03868000
LOGICAL FUPDATE:=FALSE;                                                 03870000
                                                                        03872000
ENTRY FUPDATESTATISTICS;        <<WILL BYPASS PARM CHECKING>>           03874000
                                                                        03876000
DEFINE CLASSBASE'IDX   = (CLASS+1)#,  <<OFFSET TO CLASS>>               03878000
       SUBBASE'IDX     = (SUBCLASS+1)#, <<OFFSET TO SUBCLASS>>          03880000
       ACT'STARTINGITEM= (STARTINGITEM+3)#; <<GET PAST ENTRY 0>>        03882000
                                                                        03884000
<<***************SUBROUTINES*********************>>                     03886000
                                                                        03888000
LOGICAL SUBROUTINE GOODSUBCLASS;                                        03890000
BEGIN  <<CHECK FOR VALID SUBCLASS>>                                     03892000
GOODSUBCLASS:=TRUE;                                                     03894000
CASE CLASS OF                                                           03896000
   BEGIN                                                                03898000
   <<CLASS0>>                                                           03900000
   IF SUBCLASS < 0 OR SUBCLASS >= CLASS0'SUBCLASSCNT THEN               03902000
      GOODSUBCLASS:=FALSE;                                              03904000
   <<CLASS1>>                                                           03906000
   IF SUBCLASS < 0 OR SUBCLASS >= CLASS1'SUBCLASSCNT THEN               03908000
      GOODSUBCLASS:=FALSE;                                              03910000
   END; <<CASE>>                                                        03912000
END; <<GOODSUBCLASS>>                                                   03914000
                                                                        03916000
                                                                        03918000
LOGICAL SUBROUTINE GOODENTRY;                                           03920000
BEGIN <<CHECK FOR VALID SUBCLASSENTRY>>                                 03922000
GOODENTRY:=TRUE;                                                        03924000
IF SUBCLASSENTRY < 1 OR    <<DO NOT ALLOW UPDATING>>                    03926000
SUBCLASSENTRY > ACTUAL'ENTRIES THEN  <<OF ENTRY 0>>                     03928000
   GOODENTRY:=FALSE;                                                    03930000
END; <<GOODENTRY>>                                                      03932000
                                                                        03934000
                                                                        03936000
LOGICAL SUBROUTINE GOODSTARTITEM;                                       03938000
BEGIN <<CHECK FOR GOOD STARTINGITEM>>                                   03940000
GOODSTARTITEM:=TRUE;                                                    03942000
CASE CLASS OF                                                           03944000
   BEGIN                                                                03946000
   <<CLASS0>>                                                           03948000
   IF STARTINGITEM < 0 OR                                               03950000
   STARTINGITEM >= C0'SUBSIZES(SUBCLASS) OR                             03952000
   DOUBLEITEMFLAG AND STARTINGITEM+1 >= C0'SUBSIZES(SUBCLASS) THEN      03954000
      GOODSTARTITEM:=FALSE;                                             03956000
   <<CLASS1>>                                                           03958000
   IF STARTINGITEM < 0 OR                                               03960000
   STARTINGITEM >= C1'SUBSIZES(SUBCLASS) OR                             03962000
   DOUBLEITEMFLAG AND STARTINGITEM+1 >= C1'SUBSIZES(SUBCLASS) THEN      03964000
      GOODSTARTITEM:=FALSE;                                             03966000
   END; <<CASE>>                                                        03968000
END; <<GOODSTARTITEM>>                                                  03970000
                                                                        03972000
                                                                        03974000
LOGICAL SUBROUTINE GOODCLASS;                                           03976000
BEGIN << CHECK FOR VALID CLASS>>                                        03978000
GOODCLASS:=TRUE;                                                        03980000
IF CLASS < 0 OR CLASS >= CLASSCOUNT THEN                                03982000
   GOODCLASS:=FALSE;                                                    03984000
END; <<GOODCLASS>>                                                      03986000
                                                                        03988000
<<******************END OF SUBROUTINES******************>>              03990000
                                                                        03992000
GOTO START;                                                             03994000
                                                                        03996000
FUPDATESTATISTICS:                                                      03998000
                                                                        04000000
FUPDATE:=TRUE;                                                          04002000
                                                                        04004000
START:                                                                  04006000
                                                                        04008000
PDISABLE;   <<MAKE SURE NO ONE CHANGES GATHERING STATUS>>               04010000
                                                                        04012000
TOS:=GCLASSENABLEDMASK;   <<CHECK TO SEE IF REQUESTED CLASS>>           04014000
X:=CLASS;                 <<IS CURRENTLY ENABLED>>                      04016000
ASMB(TBC 0,X);                                                          04018000
IF <> THEN                                                              04020000
   BEGIN                   <<CLASS WAS ENABLED>>                        04022000
                                                                        04024000
   ERROR:=0;                                                            04026000
                                                                        04028000
   TOS:=MEASSTATXDSBANK;                                                04030000
   TOS:=MEASSTATXDSBASE+LDEVTABSIZE;  <<GET BEYOND LDEVTAB>>            04032000
   TOS:=TOS+CLASSBASE'IDX;            <<ABS ADDR OF CLASSBASE PTR>>     04034000
   ASMB(LSEA);                        <<PULL OUT OFFSET TO CLASS >>     04036000
   CLASSBASE:=TOS;                                                      04038000
                                                                        04040000
   <<NOW GET SEGRELOFF FOR SUBCLASS>>                                   04042000
                                                                        04044000
   TOS:=CLASSBASE-CLASSBASE'IDX+SUBBASE'IDX; <<ADD SEGREL OFFSETS>>     04046000
   ASMB(LADD;LSEA);       <<ADD TO ABS ADDR OF CLASSBASE PTR>>          04048000
   SUBBASE:=TOS+CLASSBASE;<<SEGREL OFFSET TO BASE OF SUBCLASS>>         04050000
                                                                        04052000
   <<FINALLY PULL OUT NUMBER OF ENTRIES IN SUBCLASS>>                   04054000
                                                                        04056000
   TOS:=SUBBASE-CLASSBASE-SUBBASE'IDX;                                  04058000
   ASMB(LADD);                                                          04060000
   ASMB(LSEA);                                                          04062000
   ACTUAL'ENTRIES:=TOS-1;   <<SUB 1 FOR ENTRY 0>>                       04064000
   DDEL;                                                                04066000
                                                                        04068000
   IF NOT FUPDATE THEN                                                  04070000
      BEGIN               <<PARAMETER CHECKING>>                        04072000
                                                                        04074000
      IF NOT GOODCLASS THEN                                             04076000
         ERROR := CLASS'ERROR                                           04078000
      ELSE                                                              04080000
         IF NOT GOODSUBCLASS THEN                                       04082000
            ERROR:=SUBCLASS'ERROR                                       04084000
         ELSE                                                           04086000
            IF NOT GOODENTRY THEN                                       04088000
               ERROR:=SUBENTRY'ERROR                                    04090000
            ELSE                                                        04092000
               IF NOT GOODSTARTITEM THEN                                04094000
                  ERROR := ITEM'ERROR                                   04096000
      END;                                                              04098000
                                                                        04100000
   END; <<CLASS ENABLED>>                                               04102000
                                                                        04104000
IF ERROR = 0 THEN                                                       04106000
                                                                        04108000
   BEGIN <<UPDATE ITEM>>                                                04110000
   TOS := MEASSTATXDSBANK;                                              04112000
   TOS := MEASSTATXDSBASE+LDEVTABSIZE+SUBBASE+ACT'STARTINGITEM;         04114000
   IF NOT DOUBLEITEMFLAG THEN                                           04116000
                                                                        04118000
      BEGIN <<PROCESS SINGLE ITEM UPDATE>>                              04120000
      IF NOT NEWVALUEFLAG THEN                                          04122000
         BEGIN <<RETRIVE OLD VALUE, ADD W/VLAUECHANGE,STORE>>           04124000
         ASMB(LSEA);                                                    04126000
         TOS:=TOS+VALUECHANGE1;                                         04128000
         ASMB(SSEA);                                                    04130000
         END                                                            04132000
      ELSE                                                              04134000
         BEGIN <<REPLACE OLDVALUE W/VALUECHANGE>>                       04136000
         TOS:=VALUECHANGE1;                                             04138000
         ASMB(SSEA);                                                    04140000
         END;                                                           04142000
      END   <<SINGLE ITEM UPDATE>>                                      04144000
                                                                        04146000
   ELSE                                                                 04148000
                                                                        04150000
      BEGIN <<PROCESS DOUBLE ITEM UPDATE>>                              04152000
      IF NOT NEWVALUEFLAG THEN                                          04154000
         BEGIN <<RETRIEVE OLD VALUE, ADD W/VALUECHANGE,STORE>>          04156000
         ASMB(LDEA);                                                    04158000
         TOS:=TOS+VALUECHANGE;                                          04160000
         ASMB(SDEA);                                                    04162000
         END                                                            04164000
      ELSE                                                              04166000
         BEGIN <<REPLACE OLD VALUE W/VALUECHANGE>>                      04168000
         TOS:=VALUECHANGE;                                              04170000
         ASMB(SDEA);                                                    04172000
         END;                                                           04174000
      END;                                                              04176000
                                                                        04178000
   DDEL; <<BANK,ADDRESS>>                                               04180000
   SAVECC:=CCE;                                                         04182000
   END                                                                  04184000
                                                                        04186000
ELSE                                                                    04188000
                                                                        04190000
   SAVECC:=CCL;                                                         04192000
                                                                        04194000
PENABLE;                                                                04196000
UPDATESTATISTICS:=ERROR;                                                04198000
CC:=SAVECC;                                                             04200000
END;  <<UPDATESTATISTICS>>                                              04202000
$PAGE "UNCALLABLE UTILITIES : SYSPROC"                                  04204000
PROCEDURE READYPROCESS(PCBPT);                                 <<03041>>04206000
VALUE PCBPT;                                                   <<03041>>04208000
INTEGER PCBPT;                                                 <<03041>>04210000
OPTION PRIVILEGED,UNCALLABLE;                                  <<03041>>04212000
BEGIN                                                          <<03041>>04214000
LOGICAL                                                        <<03041>>04216000
   PAWSEDFLAG;                                                 <<03041>>04218000
                                                               <<03041>>04220000
IF NOT LOG(SPCBDISPQ) AND SPCBWAITFIELD = 0 THEN               <<03041>>04222000
   BEGIN <<MUST GET PROCESS INTO CONTENTION FOR THE CPU>>      <<03041>>04224000
   PDISABLE;  <<PSEUDO DISABLE FOR FAST DB SWITCH>>            <<03041>>04226000
   TOS:=%1000D;                                                <<03041>>04228000
   EXCHDB;                                                     <<03041>>04230000
   QUEUEPROC(ABSOLUTE(SYSPCB)+PCBPT,DISPATCHINGQ,FRONTOFCLASS);<<03041>>04232000
   PAWSEDFLAG:=DISPTOAWAKEMSG.PAUSEDFLAG;                      <<03041>>04234000
   EXCHDB;                                                     <<03041>>04236000
   PENABLE;                                                    <<03041>>04238000
   IF PAWSEDFLAG THEN ASMB(DISP);                              <<03041>>04240000
   END;                                                        <<03041>>04242000
END;  <<READYPROCESS>>                                         <<03041>>04244000
LOGICAL PROCEDURE SYSPROC(LOGICALPROCNUMBER);                           04246000
VALUE LOGICALPROCNUMBER;                                                04248000
INTEGER LOGICALPROCNUMBER;                                              04250000
OPTION PRIVILEGED,UNCALLABLE;                                           04252000
                                                                        04254000
COMMENT                                                                 04256000
                                                                        04258000
SYSPROC CONVERTS THE CALLER SUPPLIED LOGICAL PROCESS                    04260000
NUMBER INTO THE PCB RELATIVE POINTER TO THAT PROCESS'                   04262000
PCB ENTRY.                                                              04264000
                                                                        04266000
;                                                                       04268000
                                                                        04270000
BEGIN                                                                   04272000
$TITLE "UNCALLABLE UTILITIES : SET PSIF"                                04274000
EQUATE LOGPROCTABBASE=%1141,                                            04276000
       LOGPROCTABSIZE=12;                                               04278000
                                                                        04280000
SYSPROC:=IF LOGICALPROCNUMBER > LOGPROCTABSIZE THEN 0                   04282000
ELSE ABSOLUTE(LOGPROCTABBASE+LOGICALPROCNUMBER);                        04284000
END  <<PROCEDURE SYSPROC>>;                                             04286000
$PAGE "UNCALLABLE UTILITIES : BUILD/CONVERT SEG ID"                     04288000
INTEGER PROCEDURE BUILDSEGID(SEGTYPE,SEGNUMBER,PIN);                    04290000
VALUE SEGTYPE,SEGNUMBER,PIN;                                            04292000
INTEGER SEGTYPE,SEGNUMBER,PIN;                                          04294000
OPTION PRIVILEGED,UNCALLABLE;                                           04296000
                                                                        04298000
COMMENT                                                                 04300000
                                                                        04302000
BUILDSEGID CONVERTS THE SEGMENT NUMBER PARAMETER INTO THE STANDARD      04304000
INVARIANT FORM OF SEGIDENTIFIER USED THROUGHOUT THE SYSTEM.             04306000
THIS ROUTINE MAY BE CALLED IN SPLIT STACK MODE.                <<01609>>04308000
                                                                        04310000
SEGTYPE =0 ==> SEGMENT IS A DATA SEGMENT,                               04312000
               SEGNUMBER=DST ENTRY NUMBER OF SEGMENT'S DESCRIPTOR       04314000
        =1 ==> SEGMENT IS A SYSTEM SL SEGMENT,                          04316000
               SEGNUMBER=SL ENTRY NUMBER OF SEGMENT'S DESCRIPTOR        04318000
        =2 ==> SEGMENT IS A PART OF A PROGRAM,                          04320000
               SEGNUMBER=PROGRAM SEGMENT NUMBER (>%300),                04322000
               PIN=PIN OF PROCESS EXECUTING THE PROGRAM                 04324000
;                                                                       04326000
                                                                        04328000
BEGIN                                                                   04330000
INTEGER SEGID;                                                          04332000
IF SEGTYPE=0 THEN BUILDSEGID:=SEGNUMBER ELSE                            04334000
   BEGIN  <<CODE SEG A LITTLE TUFFER>>                                  04336000
   IF SEGTYPE=1 THEN                                                    04338000
      BEGIN <<SL SEG>>                                                  04340000
      TOS:=SEGNUMBER;                                                   04342000
      TOS.SEGIDTYPEFIELD:=SEGIDSLTYPE;                                  04344000
      BUILDSEGID:=TOS;                                                  04346000
      END                                                               04348000
   ELSE                                                                 04350000
      BEGIN <<PROGRAM SEGMENT>>                                         04352000
      TOS:=SEGNUMBER-%300;                                              04354000
      TOS.SEGIDPBXFLAG:=1;                                              04356000
      SEGID:=TOS;                                                       04358000
      SEGID.SEGIDPBXFIELD:=PCB(PIN*PCBSIZE+PBXWORDNUM);                 04360000
      BUILDSEGID:=SEGID;                                                04362000
      END;                                                              04364000
   END;                                                                 04366000
END <<BUILDSEGID>>;                                                     04368000
                                                                        04370000
INTEGER PROCEDURE CONVSEGIDTOSTINX(SEGIDENTIFIER);                      04372000
VALUE SEGIDENTIFIER;                                                    04374000
LOGICAL SEGIDENTIFIER;                                                  04376000
OPTION PRIVILEGED,UNCALLABLE;                                           04378000
                                                                        04380000
COMMENT                                                                 04382000
                                                                        04384000
CONVERTS A SEGIDENTIFIER TO THE CURRENT SEGMENT TABLE INDEX OF          04386000
THE CORRESPONDING SEGMENT'S DESCRIPTOR. THIS ROUTINE MAY       <<01609>>04388000
BE CALLED IN SPLIT STACK MODE.                                 <<01609>>04390000
IF THE DESIGNATED SEGMENT DESCRIPTOR IS VALID, THE CODITION COD<<01557>>04392000
IS SET TO CCE AND THE SEGMENT TABLE RELATIVE INDEX OF THE SEGME<<01557>>04394000
DESCRIPTOR IS RETURNED.                                        <<01557>>04396000
                                                               <<01557>>04398000
IF THE DESIGNATED DESCRIPTOR IS UNASSIGNED, THE CONDITION CODE <<01557>>04400000
SET TO CCL AND A ZERO IS RETURNED.                             <<01557>>04402000
                                                               <<01557>>04404000
                                                                        04406000
;                                                                       04408000
                                                                        04410000
BEGIN                                                                   04412000
INTEGER DESCSTINX=CONVSEGIDTOSTINX,                            <<01557>>04414000
        CONDCODE:=CCE;                                         <<01557>>04416000
IF SEGIDENTIFIER.SEGIDTYPEFIELD=SEGIDDATATYPE                           04418000
THEN CONVSEGIDTOSTINX:=SEGIDENTIFIER&LSL(2) ELSE                        04420000
   BEGIN  <<CODE SEG>>                                                  04422000
   TOS:=SEGIDENTIFIER;                                                  04424000
   TOS.SEGIDPBXFLAG:=0;                                                 04426000
   IF <> THEN                                                           04428000
      BEGIN <<IN A PROGRAM BLOCK>>                                      04430000
      X:=S0.SEGIDPBXFIELD;                                              04432000
      IF CSTXBLK(X)=-1 THEN                                    <<01913>>04434000
         BEGIN                                                 <<01913>>04436000
         CONDCODE:=CCL;                                        <<01913>>04438000
         CONVSEGIDTOSTINX:=0;                                  <<01913>>04440000
         END                                                   <<01913>>04442000
      ELSE                                                     <<01913>>04444000
      CONVSEGIDTOSTINX:=S0.SEGIDLOGSEGFIELD&LSL(2)+CSTXBLK(X);          04446000
      END                                                               04448000
   ELSE                                                                 04450000
      BEGIN <<SL SEG>>                                                  04452000
      TOS.SEGIDTYPEFIELD:=0;                                            04454000
      CONVSEGIDTOSTINX:=S0&LSL(2)+ABSOLUTE(SYSDFC);                     04456000
      END;                                                              04458000
   END;                                                                 04460000
IF DST(DESCSTINX)=%100000 THEN                                 <<01557>>04462000
   BEGIN  <<UNALLOCATED ENTRY>>                                <<01557>>04464000
   CONDCODE:=CCL;                                              <<01557>>04466000
   DESCSTINX:=0;                                               <<01557>>04468000
   END;                                                        <<01557>>04470000
CC:=CONDCODE;                                                  <<01557>>04472000
END  <<CONVSEGIDTOSTINX>>;                                              04474000
                                                                        04476000
PROCEDURE SET'PSIF(PCBPT,FLAG);                                         04478000
VALUE PCBPT,FLAG;                                                       04480000
INTEGER PCBPT;                                                          04482000
LOGICAL FLAG;                                                           04484000
OPTION PRIVILEGED,UNCALLABLE;                                           04486000
                                                                        04488000
COMMENT                                                                 04490000
                                                                        04492000
SET'PSIF SETS A FLAG IN THE PSEUDO-INTERRUPT FIELD OF                   04494000
PCBPT'S PCB ENTRY,PROVIDED NO MORE URGENT PI IS IN EFFECT.              04496000
IF THE PROCESS IS IMPEDED, HOLDING A SIR, CRITICAL, OR                  04498000
EXECUTING SYSTEM CODE, THE PIOVRFLAG IS SET.  OTHERWISE,                04500000
THE PROCESS IS QUEUED INTO THE DISPQ, SO IT WILL BE SWAPPED             04502000
IN AND A MARKER TO PSEUDOINT PUT ON ITS STACK BEFORE LAUNCH.            04504000
                                                                        04506000
;                                                                       04508000
                                                                        04510000
BEGIN                                                                   04512000
ENTRY CLEAR'PSIF;                                                       04514000
LOGICAL SETTING:=FALSE,                                                 04516000
        DELAY:=FALSE;                                                   04518000
                                                                        04520000
DISABLE;                                                                04522000
SETTING:=TRUE;                                                          04524000
X:=PCBPT+PROCSTATEWORDNUM;                                              04526000
TOS:=PCB(X):=LOGICAL(PCB(X)) LOR FLAG.PIFLAGSFIELD;                     04528000
TOS:=TOS.PIFLAGSFIELD&LSL(9);                                           04530000
ASMB(SCAN 0;DEL,LDXA);                                                  04532000
X:=PCBPT+PIINFONIMPPINWORDNUM;                                          04534000
IF S0 >= PCB(X).PSIMFIELD THEN PCB(PCBPT+PROCSTATEWORDNUM)              04536000
.PIFLAGSFIELD:=0 <<MORE URGENT SOFT INTERRUPT IS PENDING>> ELSE         04538000
   BEGIN                                                                04540000
   <<IF HK,SK OR STOP, CLEAR FATHER AND SON WAIT FLAGS>>                04542000
   IF S0 < 3 THEN SPCBABORTWAKE:=0;                            <<03041>>04544000
   IF TOS=5 AND LOG(SPCBWAKESOFT) THEN <<C Y PREEMPT PAUSE/IO>><<03041>>04546000
      SPCBNONCRITWAIT:=0;                                      <<03041>>04548000
   IF LOGICAL(PCB(PCBPT+RESABORTINFOWORDNUM)).HASSIRFLAG                04550000
   OR LOGICAL(PCB(PCBPT+RESABORTINFOWORDNUM)).CRITFLAG                  04552000
   OR LOGICAL(PCB(PCBPT+WAKEMASKWORDNUM)).IMPEDEDWAITFLAG               04554000
   OR LOGICAL(PCB(PCBPT+STKINFOWORDNUM)).INSYSTEMFLAG THEN              04556000
      BEGIN <<PSEUDO-INTERRUPT MUST BE DELAYED>>                        04558000
      DELAY:=TRUE;                                                      04560000
      PCB(PCBPT+RESABORTINFOWORDNUM).PIOVRFLAG:=1;                      04562000
      END;                                                              04564000
   END;                                                                 04566000
                                                                        04568000
CLEAR'PSIF:                                                             04570000
                                                                        04572000
IF NOT SETTING THEN                                                     04574000
   BEGIN  <<CLEARING>>                                                  04576000
   DISABLE;                                                             04578000
   X:=PCBPT+PROCSTATEWORDNUM;                                           04580000
   TOS:=PCB(X):=LOGICAL(PCB(X)) LAND NOT FLAG.PIFLAGSFIELD;             04582000
   IF TOS.PIFLAGSFIELD = 0                                              04584000
   THEN PCB(PCBPT+RESABORTINFOWORDNUM).PIOVRFLAG:=0;                    04586000
   END;                                                                 04588000
                                                                        04590000
READYPROCESS(PCBPT);                                           <<03041>>04592000
END  <<PROCEDURE SET'PSIF>>;                                            04596000
$PAGE "SOFTWARE INTERRUPTS.  DATA STRUCTURES."                          04598000
<<                                                                      04600000
                                                                        04602000
Soft Interrupt Queue Structure.                                         04604000
                                                                        04606000
                   Msg Harbor                                           04608000
   ...........    ............                                          04610000
   .         .    .Port zero .    ........    ........   ........       04612000
   .  PCB    .    ............    .System.    .System.   .System.       04614000
   .         .--->.Port one  .--->.Soft  .--->.Soft  .-->.Soft  .       04616000
   ...........    ............    .Int 0 .    .Int 1 .   .Int 2 .       04618000
                  .Port two  .-   ........    ........   ........       04620000
                  ............                                          04622000
                               -                                        04624000
                                                                        04626000
                                - ........    ........                  04628000
                                  .User  .    .User  .                  04630000
                                 >.Soft  .--->.Soft  .                  04632000
                                  .Int 0 .    .Int 1 .                  04634000
                                  ........    ........                  04636000
                                                                        04638000
                                                                        04640000
Soft Interrupt Queue Entry Format.                                      04642000
                                                                        04644000
     ...............................                                    04646000
   0 . Soft int msg word zero      . 0                                  04648000
     ...............................                                    04650000
   1 . Soft int msg word one       . 1                                  04652000
     ...............................                                    04654000
   2 . Int handler's plabel        . 2                                  04656000
     ...............................                                    04658000
   3 . Soft int subtype            . 3                                  04660000
     ...............................                                    04662000
                                                                        04664000
>>                                                                      04666000
$PAGE "PCB FIELDS USED BY SOFTWARE INTERRUPTS."                         04668000
<<                                                                      04670000
                                                                        04672000
Process Control Block Fields.                                           04674000
----------------------------                                            04676000
                                                                        04678000
                                                                        04680000
Field name    Location      New  Description                            04682000
------------- ------------  ---- --------------------------------       04684000
                                                                        04686000
SPCBCritSir    PCB.(2:2)     No   Nonzero if the process is             04688000
                                  critical or with sir.                 04690000
                                                                        04692000
SPCBPIOvrFlag  PCB.(4:1)     No   Set when the execution of the         04694000
                                  soft interrupt must be postponed      04696000
                                  due to the process's being            04698000
                                  critical, with sir, or impeded.       04700000
                                  Tells the appropriate kernel          04702000
                                  procedure to enter PSEUDOINT.         04704000
                                                                        04706000
SPCBDelaySoft  PCB.(14:1)    Yes  Set when the execution of the         04708000
                                  soft interrupt must be delayed -      04710000
                                  critical, impeded, with sir,          04712000
                                  system code, or privileged code.      04714000
                                  This bit tells the bounds             04716000
                                  violation procedure in ININ that      04718000
                                  a soft interrupt is pending.          04720000
                                  The Dispatcher ignores this bit.      04722000
                                                                        04724000
SPCBWaitField  PCB(4).(0:12) No   Indicates which events (if any)       04726000
                                  that the user process is waiting      04728000
                                  on.  Does not include system          04730000
                                  events such as memory wait.           04732000
                                                                        04734000
SPCBImpede     PCB(4).(12:1) No   Set when the process is impeded.      04736000
                                                                        04738000
SPCBPSim       PCB(8).(0:3)  No   Current value of process's            04740000
                                  pseudo interrupt state.               04742000
                                                                        04744000
SPCBWakeSoft   PCB(8).(3:1)  Yes  Set on when the process will          04746000
                                  accept the soft interrupt even        04748000
                                  though it is waiting on other         04750000
                                  events.                               04752000
                                                                        04754000
SPCBSoftInt    PCB(9).(9:1)       Set when the Dispatcher (and          04756000
                                  PSEUDOINT) should be aware of a       04758000
                                  pending soft interrupt.               04760000
                                                                        04762000
SPCBPIFlags    PCB(9).(10:6) No   Specifies which of the six,           04764000
                                  independent pseudo interrupts         04766000
                                  may be pending against the            04768000
                                  process.                              04770000
                                                                        04772000
SPCBAllowSoft  PCB(13).(7:1) Yes  On implies that the process will      04774000
                                  process user soft interrupts.  A      04776000
                                  zero value postpones processing       04778000
                                  of user soft interrupts (but not      04780000
                                  system soft interrupts).  This        04782000
                                  bit is managed by the user            04784000
                                  through FINTSTATE and FINTEXIT.       04786000
>>                                                                      04788000
$PAGE "SOFTWARE INTERRUPT MMSTAT ENTRY FORMATS."                        04790000
<<                                                                      04792000
                                                                        04794000
MMSTAT Entry Formats.                                                   04796000
--------------------                                                    04798000
                                                                        04800000
MMSTAT tracing for the following types is enabled only if the           04802000
"monitoring" has been turned on by the MON command.                     04804000
                                                                        04806000
Type          Number  Word 0       Word 1        Word 2                 04808000
------------- ------- ------------ ------------- ---------------        04810000
                                                                        04812000
Cause soft    240     (0:4)  level Msg word one  Msg word two           04814000
interrupt             (4:2)  type                                       04816000
                      (6:2)  stype                                      04818000
                      (8:8)  pin                                        04820000
                                                                        04822000
Pseudoint     241     (0:8)  type  Msg word one  Msg word two           04824000
                      (8:8)  stype                                      04826000
                                                                        04828000
                                                                        04830000
Build stack   242     Plabel       Preg word of  Status word of         04832000
                                   prev marker   prev marker            04834000
                                                                        04836000
CHANGE STATE  243     (14:1) old   User's        User's status          04838000
                             state P register    register               04840000
                      (15:1) new                                        04842000
                             state                                      04844000
                                                                        04846000
TIMEOUT       244     Compltn type 16 msb of     16 lsb of              04848000
                      0 timeout    timeout (ms)  timeout (ms)           04850000
                      1 no trlx                                         04852000
                      2 control y                                       04854000
                        soft int                                        04856000
                                                                        04858000
where:                                                                  04860000
                                                                        04862000
   level          The current status of the interrupt/process           04864000
                                                                        04866000
                  0  process is dying (hard kill or soft kill)          04868000
                                                                        04870000
                  1  other soft interrupts are pending                  04872000
                                                                        04874000
                  2  user interrupts are disabled                       04876000
                                                                        04878000
                  3  process is impeded, critical, and/or with          04880000
                     sir                                                04882000
                                                                        04884000
                  4  interrupt was against own process                  04886000
                                                                        04888000
                  5  process was either waiting or ready to             04890000
                     execute                                            04892000
                                                                        04894000
                  6  process would have been readied but wasn't         04896000
                     due to caller's specification                      04898000
                                                                        04900000
                  7  process was readied                                04902000
                                                                        04904000
   type           The type of the soft interrupt.                       04906000
                                                                        04908000
                  0  user                                               04910000
                                                                        04912000
                  1  system                                             04914000
                                                                        04916000
   stype          The subtype of the soft interrupt.                    04918000
                                                                        04920000
                  user type                                             04922000
                                                                        04924000
                    0  no preprocessing                                 04926000
                    1  file system interrupt                            04928000
                                                                        04930000
                  system type                                           04932000
                                                                        04934000
                    0  no preprocessing                                 04936000
                    1  debug invocation                                 04938000
                                                                        04940000
   old state      Previous state of user soft interrupts                04942000
                                                                        04944000
                  0  disabled                                           04946000
                                                                        04948000
                  1  enabled                                            04950000
                                                                        04952000
   new state      New state of user soft interrupts                     04954000
                                                                        04956000
                  0  disabled                                           04958000
                                                                        04960000
                  1 enabled                                             04962000
                                                                        04964000
>>                                                                      04966000
$PAGE "SOFTWARE INTERRUPTS.  PROLOGUE."                                 04968000
<<                                                                      04970000
                                                                        04972000
Software Interrupts                                                     04974000
-------------------                                                     04976000
                                                                        04978000
Software interrupts provide a mechanism to interrupt the                04980000
executing sequence of a selected process, and to cause that             04982000
process to execute a specified sequence of code.  When the soft         04984000
interrupt code completes, the state of the interrupted process is       04986000
restored to that preceding the soft interrupt, and thus the             04988000
process resumes its normal execution.  Multiple simultaneous            04990000
interrupts will be executed in a fifo manner.                           04992000
                                                                        04994000
Soft interrupts may be initiated from any environment; including        04996000
the ICS, since invoking soft interrupts does not wait the caller.       04998000
                                                                        05000000
                                                                        05002000
a) Causing software interrupts.                                         05004000
                                                                        05006000
   The kernel procedure which issues soft interrupts against a          05008000
   target process is CAUSESOFTINT.  Currently it recognizes two         05010000
   types of soft interrupts:                                            05012000
                                                                        05014000
     1) User soft interrupts.                                           05016000
                                                                        05018000
        These interrupts are only processed while in the user's         05020000
        code.  Additionally the user may enable/disable them with       05022000
        the FINTSTATE intrinsic.  File system soft interrupts are       05024000
        are included in this type of interrupt.                         05026000
                                                                        05028000
     2) System soft interrupts.                                         05030000
                                                                        05032000
        System interrupts may execute while in system code (but         05034000
        not while critical, with sir, impeded, or waiting).  The        05036000
        user may not disable them.                                      05038000
                                                                        05040000
                                                                        05042000
   The subtype and plabel of the soft interrupt handler is              05044000
   supplied as an input parameter to CAUSESOFTINT.  This plabel         05046000
   must specify code which is within the interrupted process's          05048000
   code address space.  A short control message (max of two             05050000
   words) may be sent along with the soft interrupt for use by          05052000
   the soft interrupt handler.                                          05054000
                                                                        05056000
   CAUSESOFTINT first checks that the target process is healthy         05058000
   (not in soft or hard kill mode).  It then sends a message to         05060000
   the process's appropriate soft interrupt queue.  Each queue is       05062000
   actually a kernel "in core" ipc port.  User interrupts are           05064000
   sent to port number one whereas system interrupts go to port         05066000
   number two.                                                          05068000
                                                                        05070000
   If this is the first message in the queue and there are no           05072000
   other soft interrupts pending then:                                  05074000
                                                                        05076000
     1. Process is not critical, with sir, impeded, or waiting.         05078000
                                                                        05080000
        The soft interrupt bit is set in its PCB.  Since it is not      05082000
        waiting, it must already be on the dispatcher queue so that     05084000
        no further action is required.                                  05086000
                                                                        05088000
     2. Process is not critical, with sir, or impeded; but it is        05090000
        waiting.                                                        05092000
                                                                        05094000
        If the "wake soft interrupt" bit is set in the PCB, then        05096000
        the process can handle the soft interrupt even though it is     05098000
        waiting on some other event.  The wake-soft-int bit is reset    05100000
        (thus signaling the process that it was awakened by a           05102000
        soft interrupt).  Additionally its wait field is cleared and    05104000
        the "delay soft interrupt" bit is set in the PCB.               05106000
                                                                        05108000
        Processes which are waiting and do not have the                 05110000
        wake-soft-interrupt bit set must be allowed to                  05112000
        finish their processing before the soft interrupt occurs.       05114000
        Thus they should not be awakened until whatever they            05116000
        specified in their wait field occurs.  When the process         05118000
        is ready to launch, the Dispatcher will notice the soft         05120000
        bit and launch the process into PSEUDOINT.                      05122000
                                                                        05124000
     2. The process has some combination of critical, with sir,         05126000
        or impede.                                                      05128000
                                                                        05130000
        The delayed-soft-int bit and the pseudo-interrupt               05132000
        overflow bits are set in the PCB.  This cuts the                05134000
        Dispatcher out of the picture but leaves marks such             05136000
        that when the inhibiting conditions are removed,                05138000
        PSEUDOINT will be invoked.  That is, RELSIR and                 05140000
        RESETCRITICAL both look at the pseudoint overflow flag in       05142000
        the PCB and call PSEUDOINT if the flag is set.                  05144000
                                                                        05146000
b) Servicing soft interrupts                                            05148000
                                                                        05150000
   This subsection describes the action the target process takes        05152000
   to process a software interrupt.                                     05154000
                                                                        05156000
   Dispatcher                                                           05158000
                                                                        05160000
      When the process is about to be launched by the dispatcher,       05162000
      the PCB soft interrupt bit is checked.  If it is set and          05164000
      the process is not critical or with sir, PSEUDOINT is             05166000
      invoked.  Note that RELSIR and RESETCRITICAL will invoke          05168000
      PSEUDOINT later if the process was with sir or critical,          05170000
      respectively.                                                     05172000
                                                                        05174000
   First PSEUDOINT invocation.                                          05176000
                                                                        05178000
      Backing out of PAUSE/IOWAIT.                                      05180000
                                                                        05182000
         If the process was awakened by a soft interrupt instead        05184000
         of the expected event, then the kernel WAIT procedure          05186000
         will note this before exiting to its caller.  It notifies      05188000
         the caller with a CCG condition code.                          05190000
                                                                        05192000
         IOWAIT and PAUSE will note that a soft interrupt               05194000
         occurred, undo any processing they had done (for               05196000
         example, PAUSE will cancel its timeout), set the               05198000
         caller's stack marker to recall the intrinsic, and             05200000
         invoke PSEUDOINT by causing a bounds violation through         05202000
         ININ on the intrinsic's exit (for a complete description       05204000
         of this way, see the paragraph of the delayed PSEUDOINT        05206000
         execution below).                                              05208000
                                                                        05210000
      System soft interrupts.                                           05212000
                                                                        05214000
         As a general rule these interrupts are executed straight       05216000
         away.  They are "pcaled" rather than being exited into.        05218000
                                                                        05220000
         These interrupt procedures must be coded in one of three       05222000
         ways:                                                          05224000
                                                                        05226000
            1. procedure INTHANDLER;                                    05228000
                                                                        05230000
            2. procedure INTHANDLER(Msg)                                05232000
               value Msg;                                               05234000
               integer MSG;                                             05236000
                                                                        05238000
            3. procedure INTHANDLER(Msg0,Msg1);                         05240000
               value Msg0,Msg1;                                         05242000
               integer Msg0,Msg1;                                       05244000
                                                                        05246000
         The above procedure head declarations are for zero, one,       05248000
         and two message parameters, respectively.                      05250000
                                                                        05252000
         Software interrupts with nonzero subtype values will           05254000
         have subtype-specific preprocessing done for them.             05256000
         Since system soft interrupts have their own queue, they        05258000
         are not delayed if user soft interrupts are delayed.           05260000
         All system interrupts are processed before user                05262000
         interrupts are considered.  Note also that system              05264000
         interrupts occur without the process's user code being         05266000
         aware of it.                                                   05268000
                                                                        05270000
      User soft interrupts                                              05272000
                                                                        05274000
         PSEUDOINT checks that the user has soft interrupts             05276000
         enabled.  If not then PSEUDOINT returns to the interrupted     05278000
         code.  When the user reenables soft interrupts with            05280000
         either FINTSTATE or FINTEXIT, they will check for any          05282000
         pending soft interrupts by testing the user soft               05284000
         interrupt port.                                                05286000
                                                                        05288000
         Next it is determined if the interrupt can be executed         05290000
         right away.  That is, the process cannot be executing in       05292000
         system code and if we are interrupting privileged user         05294000
         code, the user interrupt procedure must be privileged.         05296000
         If the procedure is compatible then the code described         05298000
         in "Second PSEUDOINT invocation" is executed.  Delayed         05300000
         execution is effected by setting the delayed soft              05302000
         interrupt bit in the PCB and by setting bit zero of the        05304000
         P register save word of the first eligible stack marker.       05306000
         The exit instruction against this stack marker will            05308000
         cause a bounds violation trap to ININ, which will note         05310000
         that a soft interrupt is pending and invoke PSEUDOINT at       05312000
         its secondary entry point, DELAYEDINT.                         05314000
                                                                        05316000
      Second PSEUDOINT invocation.                                      05318000
                                                                        05320000
         PSEUDOINT gets the interrupt's first in-core ipc message       05322000
         and:                                                           05324000
                                                                        05326000
           1. performs any required preprocessing (subtype <> 0),       05328000
                                                                        05330000
           2. disables user soft interrupts,                            05332000
                                                                        05334000
           3. builds the stack marker for the interrupt handler,        05336000
                                                                        05338000
           4. and exits through it.                                     05340000
                                                                        05342000
>>                                                                      05344000
$PAGE "DATA STRUCTURE INDEPENDENT INFORMATION PROCEDURES"      <<01644>>05346000
$PAGE "SOFT INTERRUPTS. BUILDSTACKMARKER PROCEDURE."                    05348000
PROCEDURE BUILDSTACKMARKER(LOC,PLABEL);                        <<03041>>05350000
VALUE LOC,PLABEL;                                                       05352000
                                                                        05354000
<<FUNCTION                                                              05356000
  BUILDS A STACK MARKER BASED ON THE PLABEL PARAMETER.>>                05358000
                                                                        05360000
<<INPUT>>                                                               05362000
  INTEGER                                                               05364000
    LOC;                  <<LOCATION OF THE DESIRED STACK MARKER        05366000
                            RELATIVE TO THE CALLER'S Q.  IT             05368000
                            IS THE NUMBER OF WORDS FROM THE             05370000
                            CALLER'S Q+0 TO THE FIRST WORD              05372000
                            OF THE STACK MARKER (X REGISTER SAVE).      05374000
                            THIS WORD MUST BE POSITIVE.>>               05376000
  LOGICAL                                                               05378000
    PLABEL;               <<TRAP PROCEDURE'S PLABEL.>>                  05380000
                                                                        05382000
<<OUTPUT                                                                05384000
  THE DESIRED STACK MARKER>>                                            05386000
                                                                        05388000
OPTION PRIVILEGED,UNCALLABLE;                                           05390000
                                                                        05392000
BEGIN                                                                   05394000
INTEGER                                                                 05396000
   DELTAQ=Q+0,INDEX,CSTN;                                               05398000
ARRAY                                                                   05400000
   STACK(*)=Q+0;                                                        05402000
DEFINE                                                                  05404000
   PRIVINTERRUPTEE = LOG(STACK(-STACK-1).(0:1))#;                       05406000
                                                                        05408000
                                                                        05410000
<<INITIALIZE>>                                                          05412000
INDEX:=LOC-DELTAQ;                                                      05414000
IF GLOBALTRACEFLAG THEN                                                 05416000
   MMSTAT(MMBUILDMARKER,PLABEL,STACK(-DELTAQ-2),STACK(X+1));            05418000
                                                                        05420000
<<CONFIGURE THE STATUS WORD>>                                           05422000
TOS:=CSTN:=PLABEL.(8:8);                                                05424000
TOS.(1:1):=1;  <<ENABLE INTERRUPTS>>                                    05426000
IF PRIVINTERRUPTEE THEN  <<INTERRUPTEE PRIVILEGED?>>                    05428000
   TOS.(0:1):=1  <<YES, THEN SO SHALL THE TRAP PROCEDURE>>              05430000
ELSE                                                                    05432000
   BEGIN  <<NO, GET TRAP HANDLER'S TRUE MODE FROM THE CST>>             05434000
   IF CSTN > %300 THEN                                                  05436000
      BEGIN  <<PROCEDURE IS IN THE EXTENDED CST>>                       05438000
      X:=1;                                                             05440000
      CSTN:=CSTN-%300;                                                  05442000
      END                                                               05444000
   ELSE                                                                 05446000
      X:=0;                                                             05448000
   TOS.(0:1):=ABS(ABS(X)+CSTN&LSL(2))&CSL(2);                           05450000
   END;                                                                 05452000
STACK(INDEX+2):=TOS;  <<STATUS REGISTER>>                               05454000
                                                                        05456000
<<CONFIGURE REMAINDER OF THE MARKER>>                                   05458000
STACK(INDEX):=0;  <<X REGISTER>>                                        05460000
STACK(INDEX+1):=CONVEXTLABELTODELTAP(PLABEL.(1:15));  <<P-REGISTER>>    05462000
STACK(INDEX+3):=LOC+3;  <<DELTA Q>>                                     05464000
                                                                        05466000
<<HOOK INTO THE NEW MARKER>>                                            05468000
DELTAQ:=DELTAQ-LOC-3;                                                   05470000
END;  <<BUILDSTACKMARKER>>                                              05472000
$PAGE "SOFTWARE INTERRUPTS.  PSEUDOINT PROCEDURE."                      05474000
PROCEDURE PSEUDOINT;                                           <<03041>>05476000
                                                                        05478000
<<PROCESSES ALL PSEUDO INTERRUPTS AND SOFTWARE INTERRUPTS.  ASSUMES     05480000
  THAT IT IS CALLED PESUDODISABLED WITH INTERRUPTS OFF.  DB MAY BE      05482000
  AT ANY DATA SEGMENT (INCLUDING SYSTEM DB AND THE STACK).>>            05484000
                                                                        05486000
OPTION PRIVILEGED,UNCALLABLE;                                           05488000
                                                                        05490000
BEGIN                                                                   05492000
EQUATE                                                                  05494000
   RETURN0        = %31400,                                             05496000
   STDINLOGDEV    = 3,                                                  05498000
   ABTYP          = [8/1,8/5],  <<HARD KILL ABORT CODE>>                05500000
   ENABLELAUNCH   = TRUE,                                               05502000
   NOPENABLE      = FALSE,                                              05504000
   PRIMARYENTRY   = TRUE,                                               05506000
   NOWAITDONE     = -1,                                                 05508000
   PRIVMODE       = FALSE;                                              05510000
                                                                        05512000
EQUATE                                                                  05514000
   SOFTINTERRUPT  = 7;                                                  05516000
                                                                        05518000
ENTRY                                                                   05520000
   DELAYEDINT;                                                          05522000
INTEGER                                                                 05524000
   CUTBACK:=0;  <<MUST BE AT Q+1>>                                      05526000
DOUBLE                                                                  05528000
  MSG0,MSG1;  <<MUST BE AT Q+2>>                                        05530000
INTEGER                                                                 05532000
   NEWINTERRUPT,SON,NEXT,MAIN,V,T,STACKMARKERNUM,DEPTHLIMIT,            05534000
   PROC,I,PCBXLOC,X=X,DELTAQ,MARKERNUM,PCBPT,PLABEL=MSG1+1,             05536000
   SVALUE;                                                              05538000
LOGICAL                                                                 05540000
   PROCESSREQUEST;                                                      05542000
                                                                        05544000
                                                                        05546000
SUBROUTINE PEXIT(ENABLELAUNCH);                                         05548000
VALUE ENABLELAUNCH;                                                     05550000
LOGICAL ENABLELAUNCH;                                                   05552000
   BEGIN                                                                05554000
   IF ENABLELAUNCH THEN PENABLE;                                        05556000
   TOS:=RETURN0+CUTBACK;                                                05558000
   ASMB(XEQ);                                                           05560000
   END;  <<PEXIT>>                                                      05562000
SUBROUTINE INITIALIZE;                                                  05564000
   BEGIN  <<INITIALIZE LOCAL VARIABLES>>                                05566000
   PROC:=ABS(CPCB);                                                     05568000
   PCBPT:=PROC-ABS(PCBP);                                               05570000
   PXFIXED;                                                             05572000
   END;  <<INITIALIZE>>                                                 05574000
                                                                        05576000
                                                                        05578000
LOGICAL SUBROUTINE FINDTARGETMARKER(NONPRIV);                           05580000
VALUE NONPRIV;                                                          05582000
                                                                        05584000
<<SCANS BACKWARD THROUGH THE STACK UNTIL IT FINDS THE FIRST             05586000
  SUITABLE USER STACK MARKER.>>                                         05588000
                                                                        05590000
<<INPUT>>                                                               05592000
  LOGICAL                                                               05594000
    NONPRIV;          <<TRUE IF USER PROCEDURE MUST BE EXECUTING        05596000
                        IN NON-PRIVILEGED MODE.>>                       05598000
                                                                        05600000
<<OUTPUT                                                                05602000
  FINDTARGETMARKER      TRUE  - MARKER WAS THE ONE AT Q+0               05604000
                        FALSE - MARKER WAS FURTHER BACK, BIT ZERO       05606000
                                OF THE P-REGISTER SAVE WORD IS SET      05608000
                                TO FORCE THE EXIT INTO ININ (WITH       05610000
                                BOUNDS VIOLATION).>>                    05612000
                                                                        05614000
   BEGIN                                                                05616000
   PUSH(Q,DL);                                                          05618000
   DEPTHLIMIT:=TOS-TOS;   <<SET MAXIMUM STACK DEPTH LIMIT>>             05620000
   I:=-1; MARKERNUM:=0;                                                 05622000
                                                                        05624000
   <<LOCATE THE MARKER.  CANNOT BE:                                     05626000
     1. IN SYSTEM SL                                                    05628000
     2. HAVE SYSTEM BIT SET ON IN CST                                   05630000
     3. PRIVILEGED, IF TRAP PROCEDURE IS USER MODE>>                    05632000
   WHILE STACK(I).(8:8)<%300 AND LOG(SL(STACK(I).(8:8)                  05634000
   &LSL(2)+1).SYSTEMFLAG) OR NONPRIV AND STACK(I)&CSL(1) DO             05636000
      BEGIN  <<INDEX BACK TO THE NEXT MARKER>>                          05638000
      MARKERNUM:=MARKERNUM+1;                                           05640000
      DELTAQ:=STACK(I+1);                                               05642000
      IF DELTAQ < 4 OR -(I:=I-DELTAQ) > DEPTHLIMIT THEN                 05644000
         ABORT(MARKERNUM&LSL(8),22,0);  <<BAD MARKER IN STACK>>         05646000
      END;                                                              05648000
                                                                        05650000
   <<TALLY THE RESULT>>                                                 05652000
   IF MARKERNUM = 0 THEN                                                05654000
      FINDTARGETMARKER:=TRUE                                            05656000
   ELSE                                                                 05658000
      STACK(I-1).(0:1):=1;  <<CAUSE TRAP TO ININ UPON USER MODE>>       05660000
   END;  <<FINDTARGETMARKER>>                                           05662000
SUBROUTINE SPECIALSYSTEMTRAP(PLABEL);                                   05664000
VALUE PLABEL;                                                           05666000
LOGICAL PLABEL;                                                         05668000
                                                                        05670000
<<CAUSES TRAP TO OCCUR ON THE FIRST USER STACK MARKER.                  05672000
  NOTE - IF SUCCESSFUL, IT EXITS THIS PROCEDURE.>>                      05674000
                                                                        05676000
   BEGIN                                                                05678000
   IF FINDTARGETMARKER(PRIVMODE) THEN                                   05680000
      BEGIN  <<CAN EXECUTE THE INTERRUPT NOW>>                          05682000
      IF LOG(PORTSTATUS(SYSTEMSGPORT))                                  05684000
      OR LOG(PORTSTATUS(USERMSGPORT)) AND LOG(SPCBALLOWSOFT) THEN       05686000
         BEGIN  <<ANOTHER SOFT INTERRUPT IS PENDING>>                   05688000
         STACK(-1).(0:1):=1;  <<TRAP TO ININ ON SI PROC'S EXIT>>        05690000
         SPCBDELAYSOFT:=1;                                              05692000
         END;                                                           05694000
      X:=PLABEL;                                                        05696000
      RECEIVEMSG(SYSTEMSGPORT,MAXMSGLEN,DELETEMSG);                     05698000
      BUILDSTACKMARKER(1,X); CUTBACK:=0;                                05700000
      PEXIT(NOPENABLE);                                                 05702000
      END                                                               05704000
   ELSE                                                                 05706000
      BEGIN  <<MUST POSTPONE THE EXECUTION>>                            05708000
      DISABLE;                                                          05710000
      SPCBDELAYSOFT:=1;                                                 05712000
      ENABLE;                                                           05714000
      END;                                                              05716000
   END;  <<SPECIALSYSTEMTRAP>>                                          05718000
INTEGER SUBROUTINE PROCESSYSOFTINT;                                     05720000
                                                                        05722000
<<EAT AWAY AT THE PROCESS'S SYSTEM SOFT INTERRUPT QUEUE UNTIL           05724000
  EITHER:                                                               05726000
                                                                        05728000
   1. THE QUEUE IS EXHAUSTED (RETURNS TRUE),                            05730000
                                                                        05732000
   2. OR THE HEAD INTERRUPT IS STALLED (RETURNS FALSE).                 05734000
                                                                        05736000
  MESSAGE FORMAT (S-REGISTER RELATIVE)                                  05738000
  S0    - REQUEST DEPENDENT PROCESSING TYPE                             05740000
  S1    - INTERRUPT PROCEDURE'S PLABEL                                  05742000
  S2,S3 - INTERRUPT-TYPE DEPENDENT                                      05744000
                                                                        05746000
  NOTE - THE GENERAL CASE IS PCAL THE TRAP PROCEDURE FROM THIS          05748000
         SUBROUTINE (RATHER THAN BUILDING A STACK MARKER AND            05750000
         EXITING THROUGH IT.>>                                          05752000
                                                                        05754000
   BEGIN                                                                05756000
   <<INITIALIZE>>                                                       05758000
   PROCESSREQUEST:=TRUE;                                                05760000
                                                                        05762000
   WHILE PROCESSREQUEST                                                 05764000
   AND (PROCESSYSOFTINT:=PORTSTATUS(-1)) = SYSTEMSGPORT DO              05766000
      BEGIN  <<HAVE AN INTERRUPT TO PROCESS>>                           05768000
      PUSH(S); SVALUE:=TOS; <<TRAP PROCS MAY NOT DELETE THEIR PARAMS>>  05770000
      ASMB(ADDS MAXMSGLEN);  <<SO SAVE THE PROPER S VALUE.>>            05772000
      RECEIVEMSG(SYSTEMSGPORT,MAXMSGLEN,SAVEMSG);                       05774000
      IF <> THEN SUDDENDEATH(UGLYPSEUDOINT);                            05776000
      IF GLOBALTRACEFLAG THEN                                           05778000
         MMSTAT(MMPROCESS,SYSOFTINT CAT S0(0:8:8),S3,S2);               05780000
      CASE TOS OF                                                       05782000
         BEGIN  <<REQUEST DEPENDENT PROCESSING>>                        05784000
         ;                    <<0 - NO OPERATION>>                      05786000
         BEGIN                <<1 - DEBUG>>                             05788000
         SPECIALSYSTEMTRAP(LOG(@DEBUG));                                05790000
         PROCESSREQUEST:=FALSE;                                         05792000
         END;                                                           05794000
         END;  <<CASE>>                                                 05796000
      IF PROCESSREQUEST THEN                                            05798000
         BEGIN  <<INVOKE THE TRAP'S HANDLER>>                           05800000
         RECEIVEMSG(SYSTEMSGPORT,MAXMSGLEN,DELETEMSG); DEL;             05802000
         IF S0 <> 0 THEN ASMB(PCAL 0);                                  05804000
         END;                                                           05806000
      TOS:=SVALUE; SET(S);                                              05808000
      END;                                                              05810000
                                                                        05812000
   END;  <<PROCESSYSOFTINT>>                                            05814000
                                                                        05816000
                                                                        05818000
SUBROUTINE PROCESSOFTINT;                                               05820000
                                                                        05822000
<<PROCESS ALL THE PROCESS'S SOFTWARE INTERRUPTS.>>                      05824000
                                                                        05826000
   BEGIN                                                                05828000
   DISABLE; SPCBSOFTINT:=0; SPCBDELAYSOFT:=0; ENABLE;                   05830000
   IF PROCESSYSOFTINT = USERMSGPORT AND LOG(SPCBALLOWSOFT) THEN         05832000
      BEGIN  <<OK TO PROCESS USER MODE SOFT INTERRUPTS>>                05834000
      <<GET HEAD SOFT INTERRUPT                                         05836000
        MESSAGE FORMAT                                                  05838000
        S0    - REQUEST DEPENDENT PROCESSING TYPE                       05840000
        S1    - INTERRUPT PROCEDURE'S PLABEL                            05842000
        S2,S3 - INTERRUPT-TYPE DEPENDENT>>                              05844000
      ASMB(ADDS 4);                                                     05846000
      RECEIVEMSG(USERMSGPORT,4,SAVEMSG);                                05848000
      IF <> THEN SUDDENDEATH(UGLYPSEUDOINT);                            05850000
      IF GLOBALTRACEFLAG THEN                                           05852000
         MMSTAT(MMPROCESS,USERSOFTINT CAT S0(0:8:8),S3,S2);             05854000
      IF FINDTARGETMARKER(S1.(0:1)) THEN                                05856000
         BEGIN  <<WILL EXIT INTO THE TRAP PROCEDURE>>                   05858000
         RECEIVEMSG(USERMSGPORT,4,DELETEMSG);                           05860000
         SPCBALLOWSOFT:=0;                                              05862000
         CASE TOS OF                                                    05864000
            BEGIN  <<REQUEST DEPENDENT PROCESSING>>                     05866000
            ;                                     <<0 - NO ACTION>>     05868000
            BEGIN                                 <<1 - MSG FILE>>      05870000
            FCPREPAFT(S1,NOWAITDONE);                                   05872000
            TOS:=DQM3; TOS:=DQM1;  <<REMOVE CUTBACK PARMS (ININ CALL)>> 05874000
            X:=-CUTBACK+1;         <<BUT LEAVE ROOM FOR FILE NUMBER>>   05876000
            STACK(X):=TOS-CUTBACK+1; STACK(X:=X-1):=TOS;                05878000
            STACK(X:=X-1):=TOS; STACK(X:=X-1):=TOS;                     05880000
            PUSH(Q); TOS:=TOS+X+3; SET(Q); INITIALIZE;                  05882000
            QM4:=S1;  <<RETURN FILE NUMBER>>                            05884000
            END;                                                        05886000
            END;  <<CASE>>                                              05888000
         BUILDSTACKMARKER(1,S0); CUTBACK:=0;                            05890000
         DEL; DDEL;                                                     05892000
         END                                                            05894000
      ELSE                                                              05896000
         BEGIN  <<MUST DEFER PROCESSING OF THE INTERRUPT>>              05898000
         DISABLE; SPCBDELAYSOFT:=1; ENABLE;                             05900000
         ASMB(SUBS 4);                                                  05902000
         END;                                                           05904000
      END;                                                              05906000
   END;  <<PROCESSOFTINT>>                                              05908000
                                                                        05910000
                                                                        05912000
SUBROUTINE PROCESSBREAK;                                                05914000
   BEGIN                                                                05916000
   <<GET LOGICAL DEVICE NUMBER FOR $STDIN>>                             05918000
   PUSH(Q,DL);                                                          05920000
   ASMB(XCH,SUB;DUP,STAX;DECX);                                         05922000
   TOS:=-Q0ARRAY(X);                                                    05924000
   ASMB(ADD,DUP);                                                       05926000
   T:=TOS;                                                              05928000
   TOS:=TOS+STDINLOGDEV;                                                05930000
   ASMB(STAX);                                                          05932000
   TOS:=Q0ARRAY(X).(8:8);                                               05934000
   IF ABS(PROC+RESABORTINFOWORDNUM).RITBRKFLAG <> 0 THEN                05936000
      BEGIN                                                             05938000
      DISABLE;                                                          05940000
      ABS(PROC+PIINFONIMPPINWORDNUM).OAFIELD:=0;                        05942000
      ENABLE;                                                           05944000
      END;                                                              05946000
   ATTACHIO(S0,0,0,0,30,0,1,0,%13); <<SETTMODE>>                        05948000
   SYSBREAK;                                                            05950000
   ATTACHIO(S0,0,0,0,30,0,0,0,%13); <<RESETTMODE>>                      05952000
   DEL;                                                                 05954000
   PDISABLE;                                                            05956000
   ABS(PROC+PIINFONIMPPINWORDNUM).PSIMFIELD:=7;                         05958000
                                                                        05960000
   SON:=ABS(PROC+5).(8:8);     <<PIN OF SON OF MAIN>>                   05962000
   IF = THEN                                                            05964000
      BEGIN  <<NO EXISTING SON>>                                        05966000
      IF ABS(PROC+RESABORTINFOWORDNUM).RITBRKFLAG <> 0 THEN             05968000
         BEGIN  <<RIT BREAK>>                                           05970000
         ABS(X).RITBRKFLAG:=0;                                          05972000
         IF ABS(PROC+PIINFONIMPPINWORDNUM).OAFIELD <> 3 THEN            05974000
            BEGIN                                                       05976000
            PENABLE;                                                    05978000
            WAIT(%40,0);                                                05980000
            PEXIT(NOPENABLE);                                           05982000
            END                                                         05984000
         ELSE                                                           05986000
            PEXIT(ENABLELAUNCH);                                        05988000
         END                                                            05990000
      ELSE                                                              05992000
         PEXIT(ENABLELAUNCH);                                           05994000
      END;                                                              05996000
                                                                        05998000
   V:=ABS(PCBP);                                                        06000000
   MAIN:=NEXT:=(PROC-V)/PCBSIZE;                                        06002000
   WHILE (NEXT:=FAMILY(NEXT,MAIN))<>MAIN DO                             06004000
      CLEAR'PSIF(NEXT*PCBSIZE,4);                                       06006000
   END;  <<PROCESSBREAK>>                                               06008000
                                                                        06010000
                                                                        06012000
SUBROUTINE ANALYZEINTERRUPT;                                            06014000
                                                                        06016000
<<GETS THE HIGHEST PRIORITY PENDING PSEUDO/SOFT INTERRUPT.              06018000
  RETURNS THE INTERRUPT TYPE IN "NEWINTERRUPT.">>                       06020000
                                                                        06022000
   BEGIN                                                                06024000
   TOS:=ABS(PROC+PROCSTATEWORDNUM)&LSL(10);  <<PI BITS INTO MSB OF TOS>>06026000
   IF <> THEN                                                           06028000
      BEGIN  <<PSEUDO INTERRUPT OCCURRED>>                              06030000
      SPCBPIFLAGS:=0;                                                   06032000
      ASMB(SCAN 0); DEL;                                                06034000
      NEWINTERRUPT:=X+1;                                                06036000
      IF NEWINTERRUPT >= SPCBPSIM THEN                                  06038000
         PEXIT(ENABLELAUNCH); <<ALREADY HAVE MORE IMPORTANT PSEUDO INT>>06040000
      SPCBPSIM:=                                                        06042000
       IF NEWINTERRUPT=HARDKILLVALUE THEN NORMALVALUE ELSE NEWINTERRUPT;06044000
      IF NEWINTERRUPT <= SOFTKILL THEN                                  06046000
         BEGIN  <<PROCESS IS DYING, FORGET SOFT INTERRUPTS>>            06048000
         SPCBDELAYSOFT:=0;                                              06050000
         SPCBSOFTINT:=0;                                                06052000
         END;                                                           06054000
      END                                                               06056000
   ELSE                                                                 06058000
      BEGIN  <<ASSUME SOFT INTERRUPT OCCURRED>>                         06060000
      DEL;                                                              06062000
      IF SPCBPSIM < CONTROLYVALUE THEN                                  06064000
         BEGIN  <<ALREADY EXECUTING A PSEUDO INTERRUPT>>                06066000
         IF SPCBPSIM < SOFTKILL THEN                                    06068000
            BEGIN  <<PROCESS IS DYING, FORGET SOFT INT>>                06070000
            SPCBSOFTINT:=0;                                             06072000
            SPCBDELAYSOFT:=0;                                           06074000
            PEXIT(ENABLELAUNCH);                                        06076000
            END;                                                        06078000
         END;                                                           06080000
      NEWINTERRUPT:=SOFTINTERRUPT;                                      06082000
      END;                                                              06084000
   END;  <<ANALYZEINTERRUPT>>                                           06086000
IF ABSOLUTE(ABSOLUTE(CPCB)+PROCSTATEWORDNUM).STOVFLAG <> 0     <<04128>>06088000
   THEN ABORT([8/2,8/4],0,0);                                  <<04128>>06090000
IF PRIMARYENTRY THEN                                                    06092000
   BEGIN  <<* * PRI ENTRY (CAUSESOFTINT,DISPATCH,RESETCRITICAL,RELSIR>> 06094000
   INITIALIZE;                                                          06096000
   SPCBPIOVRFLAG:=0;                                                    06098000
   ANALYZEINTERRUPT;                                                    06100000
   PENABLE; ENABLE;                                                     06102000
   END                                                                  06104000
ELSE                                                                    06106000
   BEGIN  <<* * SECONDARY ENTRY (ININ), ENABLED & PSEUDOENABLED>>       06108000
   DELAYEDINT:                                                          06110000
   PUSH(Q); TOS:=TOS-STACK; SET(Q);  <<DELETE ININ'S STACK MARKER>>     06112000
   INITIALIZE;                                                          06114000
   <<GET CAUSE OF INTERRUPT>>                                           06116000
   PXDELAYCONTROLY:=0;                                                  06118000
   IF <> AND (PXCONTROLYLABEL <> 0) THEN                                06120000
      NEWINTERRUPT:=CONTROLYVALUE                                       06122000
   ELSE IF LOG(SPCBDELAYSOFT) THEN                                      06124000
      NEWINTERRUPT:=SOFTINTERRUPT                                       06126000
   ELSE                                                                 06128000
      PEXIT(NOPENABLE);                                                 06130000
   END;                                                                 06132000
                                                                        06134000
<<PROCESS THE PSEUDOINTERRUPT>>                                         06136000
CASE NEWINTERRUPT-1 OF                                                  06138000
   BEGIN                                                                06140000
   BEGIN  <<** HARD KILL>>                                              06142000
   <<PROCESS KILLED BY UCOP, QUITPROG SITUATION>>                       06144000
   MMSTAT(MMPROCESS,HARDKILLER,0,0);                                    06146000
   ABORT(ABTYP,0,0);                                                    06148000
   END;                                                                 06150000
                                                                        06152000
   BEGIN  <<** SOFT KILL>>                                              06154000
   MMSTAT(MMPROCESS,SOFTKILLER,0,0);                                    06156000
   TERMINATE;                                                           06158000
   END;                                                                 06160000
                                                                        06162000
   BEGIN  <<** STOP>>                                                   06164000
   SUDDENDEATH(UGLYPSEUDOINT);                                          06166000
   END;                                                                 06168000
                                                                        06170000
   BEGIN  <<** HYBERNATE>>                                              06172000
   SUDDENDEATH(UGLYPSEUDOINT);                                          06174000
   END;                                                                 06176000
                                                                        06178000
   BEGIN  <<** CONTROL Y>>                                              06180000
   PROCESSYSOFTINT;                                                     06182000
   PLABEL:=PXCONTROLYLABEL;                                             06184000
   IF SPCBWAKESOFT = 0 THEN                                             06186000
      BEGIN                                                             06188000
      MMSTAT(MMPROCESS,CONTROLY,0,0);;                                  06190000
      IF FINDTARGETMARKER(PLABEL.(0:1)) THEN                            06192000
         BEGIN                                                          06194000
         PXOLDSISTATE:=SPCBALLOWSOFT;                                   06196000
         DISABLE; SPCBALLOWSOFT:=0; ENABLE; <<DISABLE USER SOFT INT>>   06198000
         BUILDSTACKMARKER(2,PLABEL); CUTBACK:=0;                        06200000
         END                                                            06202000
      ELSE                                                              06204000
         PXDELAYCONTROLY:=1;  <<UNABLE TO BUILD THE MARKER>>            06206000
      END                                                               06208000
   ELSE                                                                 06210000
      BEGIN                                                    <<03787>>06212000
      SPCBWAKESOFT := 0;                                       <<03787>>06214000
      PXDELAYCONTROLY:=1;  <<PAUSE/IOWAIT MUST FIRST CLEAN UP>>         06216000
      END;                                                     <<03787>>06218000
   END;                                                                 06220000
                                                                        06222000
   BEGIN  <<** BREAK>>                                                  06224000
   MMSTAT(MMPROCESS,BREAKER,0,0);                                       06226000
   PROCESSBREAK;                                                        06228000
   <<CUT OFF TWO STACK MARKERS>>                                        06230000
   TOS:=@STACK-INTEGER(STACK)-INTEGER(STACK(-STACK));                   06232000
   TOS:=S0;                                                             06234000
   SET(Q,S);                                                            06236000
   WAIT(2,0);  <<WAIT FOR SON ACTIVATION>>                              06238000
   END;                                                                 06240000
                                                                        06242000
   BEGIN  <<** SOFT INTERRUPT>>                                         06244000
   PROCESSOFTINT;                                                       06246000
   END;                                                                 06248000
   END;  <<CASE>>                                                       06250000
                                                                        06252000
PEXIT(NOPENABLE);                                                       06254000
END;   <<PSEUDOINT>>                                                    06256000
$PAGE "SOFTWARE INTERRUPTS.  CAUSESOFTINT PROCEDURE."                   06258000
PROCEDURE CAUSESOFTINT(PIN,TYPE,SUBTYPE,PLABEL,MSGLEN,FLAGS);  <<03041>>06260000
VALUE PIN,TYPE,SUBTYPE,PLABEL,MSGLEN,FLAGS;                             06262000
                                                                        06264000
<<FUNCTION                                                              06266000
  CAUSES A SOFT INTERRUPT TO OCCUR ON THE TARGET PROCESS.>>             06268000
                                                                        06270000
<<INPUT>>                                                               06272000
  INTEGER                                                               06274000
    PIN,                   <<PROCESS ID NUMBER OF TARGET PROCESS.       06276000
                             ZERO IMPLIES OWN PROCESS.>>                06278000
    TYPE,                  <<TYPE OF SOFT INTERRUPT                     06280000
                             0 - INTERRUPTS PROCESSED ONLY WHEN         06282000
                                 USER INTERRUPTS ARE ENABLED AND THE    06284000
                                 PROCESS IS EXECUTING IN USER CODE      06286000
                                 (I.E., EXECUTING IN %3XX CODE OR USER  06288000
                                 SL).                                   06290000
                             1 - INTERRUPTS PROCESSED IN CURRENT STATE  06292000
                                 UNLESS THE TARGET PROCESS:             06294000
                                 1) IS WAITING,                         06296000
                                 2) HAS A SIR,                          06298000
                                 3) IS IMPEDED,                         06300000
                                 4) IS CRITICAL,                        06302000
                                 5) OR PSEUDO INTERRUPT LEVEL           06304000
                                    IS LESS THAN CONTROL Y.             06306000
                             NOTE THAT THE ABOVE CONDITIONS ONLY        06308000
                             DELAY THE SOFT INTERRRUPT, ONCE THEY       06310000
                             GO AWAY THE SOFT INTERRUPT WILL OCCUR.     06312000
                             MULTIPLE, SIMULTANEOUS SOFT INTERRUPTS     06314000
                             ARE SERVICED IN A FIFO MANNER.  ALL TYPE   06316000
                             ONES ARE SERVICED BEFORE TYPE ZEROES.>>    06318000
    SUBTYPE,               <<TYPE OF PREPROCESSING TO BE DONE BY        06320000
                             PSEUDOINT PROCEDURE.  A ZERO IMPLIES       06322000
                             NO PREPROCESSING.>>                        06324000
    PLABEL,                <<INTERRUPT PROCEDURE'S PLABEL.              06326000
                             (0:1) - DESCRIBES EXECUTION CONTEXT OF     06328000
                                     USER MODE PROCEDURES               06330000
                                     0 - ABLE TO EXEC IN PRIV USER CODE 06332000
                                     1 - CAN ONLY EXEC IN NONPRIV USER  06334000
                                         CODE                           06336000
                             (1:15)- PLABEL VALUE.  ZERO IMPLIES NO     06338000
                                     PROCEDURE>>                        06340000
    MSGLEN;                <<# WORDS IN THE MESSAGE (MAX OF 2 WORDS)    06342000
                             NOTE: THE MESSAGE IS ASSUMED TO BE         06344000
                                   LOCATED IN THE STACK, JUST ABOVE     06346000
                                   THE PIN PARAMETER.  IT WILL BE       06348000
                                   DELETED BY THIS PROCEDURE.>>         06350000
  LOGICAL                                                               06352000
    FLAGS;                 <<(0:14) - RESERVED FOR FUTURE USE, MUST     06354000
                                      BE SET TO ZERO.                   06356000
                             (0:1)  - 0 - IF APPROPRIATE PLACE PROCESS  06358000
                                          ON THE READY LIST.            06360000
                                      1 - DO NOT PUT ON READY LIST>>    06362000
  <<DB                       MAY BE ANYWHERE.>>                         06364000
                                                                        06366000
<<OUTPUT                                                                06368000
    CONDITION CODE                                                      06370000
       CCE                   SOFT INTERRUPT WAS SET UP.                 06372000
       CCL                   PROCESS IS DYING, NO ACTION WAS TAKEN.     06374000
       CCG                   ONLY RETURNED WHEN FLAGS PARAMETER         06376000
                             SPECIFIES NO WAKE, CCG IMPLIES THAT        06378000
                             THE PROCESS WOULD HAVE BEEN PLACED         06380000
                             ON THE READY LIST HAD IT NOT BEEN          06382000
                             FOR THE FLAGS SPECIFICATION.>>             06384000
                                                                        06386000
OPTION PRIVILEGED,UNCALLABLE;                                           06388000
                                                                        06390000
BEGIN                                                                   06392000
EQUATE                                                                  06394000
   RETURN6        = %31406,                                             06396000
   NOLAUNCH       = %100000,                                            06398000
   HYBERNATE      = 4,                                                  06400000
   SOFTINTBASE    = 1,                                                  06402000
   UGLYPSEUDOINT  = 4,                                                  06404000
   MAXMSGLEN      = 2;                                                  06406000
DEFINE                                                                  06408000
   USERSOFTINT    = (TYPE = 0)#,                                        06410000
   LAUNCHPROCESS  = (NOT FLAGS.(15:1))#;                                06412000
                                                                        06414000
EQUATE  <<MMSTAT DEFINITIONS>>                                          06416000
   PROCESSDEAD    = 0,                                                  06418000
   OTHERSOFTINTS  = 1,                                                  06420000
   INTDISABLED    = 2,                                                  06422000
   IMPEDECRITSIR  = 3,                                                  06424000
   OWNPROCESS     = 4,                                                  06426000
   PROCESSWAITRDY = 5,                                                  06428000
   DELAYLAUNCH    = 6,                                                  06430000
   LAUNCHED       = 7;                                                  06432000
DEFINE                                                                  06434000
   TLEVEL         = TMISC.(0:4)#,                                       06436000
   TTYPE          = TMISC.(4:2)#,                                       06438000
   TSUBTYPE       = TMISC.(6:2)#,                                       06440000
   TPIN           = TMISC.(8:8)#;                                       06442000
                                                                        06444000
DOUBLE                                                                  06446000
   MSG=PIN-2;                                                           06448000
INTEGER                                                                 06450000
   PCBPT;                                                               06452000
INTEGER                                                                 06454000
  MSG0=MSG,MSG1=MSG+1,TMISC,LEVEL:=OTHERSOFTINTS;                       06456000
                                                                        06458000
                                                                        06460000
SUBROUTINE LEAVETRACKS;                                                 06462000
                                                                        06464000
<<FUNCTION                                                              06466000
  LEAVE TRACKS IN PROCESS'S PCB SO THAT SOFT INT WILL BE                06468000
  PROCESSED AT A LATER TIME.>>                                          06470000
                                                                        06472000
   BEGIN                                                                06474000
   LEVEL:=IMPEDECRITSIR;                                                06476000
   SPCBPIOVRFLAG:=1;                                                    06478000
   SPCBDELAYSOFT:=1;                                                    06480000
   END;  <<LEAVE TRACKS>>                                               06482000
                                                                        06484000
                                                                        06486000
SUBROUTINE INTERRUPTSELF;                                               06488000
                                                                        06490000
<<FUNCTION                                                              06492000
  PROCESS SOFT INTERRUPT GENERATED AGAINST OURSELF.>>                   06494000
                                                                        06496000
   BEGIN                                                                06498000
   LEVEL:=OWNPROCESS;                                                   06500000
   SPCBDELAYSOFT:=1;                                                    06502000
   ENABLE;                                                              06504000
   PSEUDOINT;                                                           06506000
   END;  <<INTERRUPTSELF>>                                              06508000
                                                                        06510000
                                                                        06512000
SUBROUTINE WAKEPROCESS;                                                 06514000
                                                                        06516000
<<FUNCTION                                                              06518000
  WAKE THE TARGET PROCESS.>>                                            06520000
                                                                        06522000
   BEGIN                                                                06524000
   SPCBNONCRITWAIT:=0;                                                  06526000
   SPCBDELAYSOFT:=1;                                                    06528000
   ENABLE;                                                              06530000
   IF SPCBPSIM > HYBERNATE THEN                                         06532000
      BEGIN  <<CONTROL Y, BREAK, OR NORMAL>>                            06534000
      IF LAUNCHPROCESS THEN                                             06536000
         BEGIN                                                          06538000
         LEVEL:=LAUNCHED;                                               06540000
         READYPROCESS(PCBPT)                                            06542000
         END                                                            06544000
      ELSE                                                              06546000
         BEGIN                                                          06548000
         LEVEL:=DELAYLAUNCH;                                            06550000
         CC:=CCG;                                                       06552000
         END;                                                           06554000
      END;                                                              06556000
   END;  <<WAKEPROCESS>>                                                06558000
                                                                        06560000
                                                                        06562000
SUBROUTINE SENDSOFTINT;                                                 06564000
                                                                        06566000
<<DOES THE MECHANICS OF QUEUEING THE SOFT INT AND INFORMING             06568000
  THE TARGET PROCESS.>>                                                 06570000
                                                                        06572000
   BEGIN                                                                06574000
   CC:=CCE;                                                             06576000
                                                                        06578000
   <<SEND THE MSG TO THE PROPER IPC PORT>>                              06580000
   TOS:=MSG;                                                            06582000
   TOS:=PLABEL;                                                         06584000
   TOS:=SUBTYPE;                                                        06586000
   SENDMSG(PIN,TYPE+SOFTINTBASE,MSGLEN+2,NOLAUNCH);                     06588000
                                                                        06590000
   <<CHECK IF THE PROCESS NEEDS TO BE NOTIFIED OF THE INTERRUPT>>       06592000
   IF NOT LOG(SPCBSOFTINT) AND NOT LOG(SPCBDELAYSOFT) THEN              06594000
      BEGIN  <<NO OTHER SOFT INTERRUPTS PENDING>>                       06596000
      DISABLE;  <<MUST DISABLE INT BECAUSE OF MULTI-FIELD PCB WORDS>>   06598000
      IF LOG(SPCBALLOWSOFT) OR NOT USERSOFTINT THEN                     06600000
         BEGIN  <<PROCESS IS INTERESTED>>                               06602000
         IF (SPCBCRITSIR<>0) OR (SPCBIMPEDE<>0) THEN                    06604000
            LEAVETRACKS  <<PROCESS CAN'T EXEC INT RIGHT NOW>>           06606000
         ELSE                                                           06608000
            BEGIN  <<PROCESS WILL PROCESS INT, CHECK IF SHOULD WAKE>>   06610000
            IF (PCBPT = ABS(CPCB)-ABS(PCBP)) THEN                       06612000
               INTERRUPTSELF  <<CALLER SPECIFIED HIMSELF>>              06614000
            ELSE                                                        06616000
               BEGIN  <<INTERRUPT IS ON PROCESS OTHER THAN OURS>>       06618000
               SPCBWAKESOFT:=0;                                         06620000
               IF <> THEN                                               06622000
                  WAKEPROCESS  <<PROC ASLEEP, OK TO WAKE ON SOFT INT>>  06624000
               ELSE                                                     06626000
                  BEGIN  <<PROCESS IS EITHER 1) ON RDY LIST (NO NEED>>  06628000
                         <<TO WAKE) OR 2) WAITING ON ANOTHER EVENT>>    06630000
                  LEVEL:=PROCESSWAITRDY;                                06632000
                  SPCBSOFTINT:=1;                                       06634000
                  END;                                                  06636000
               END;                                                     06638000
            END;                                                        06640000
         END;                                                           06642000
      ENABLE;                                                           06644000
      END                                                               06646000
   ELSE                                                                 06648000
      LEVEL:=INTDISABLED;                                               06650000
   END;  <<SENDSOFTINT>>                                                06652000
                                                                        06654000
                                                                        06656000
<<INITIALIZE>>                                                          06658000
IF (FLAGS > 1) OR (MSGLEN > MAXMSGLEN) OR NOT (0 <= TYPE <= 1) THEN     06660000
   SUDDENDEATH(UGLYPSEUDOINT);                                          06662000
IF PIN = 0 THEN PIN:=(ABS(CPCB)-ABS(PCBP))/PCBSIZE;                     06664000
PCBPT:=PIN*PCBSIZE;                                                     06666000
PDISABLE;                                                               06668000
                                                                        06670000
<<PROCESS SOFT INTERRUPT>>                                              06672000
IF SPCBPSIM > SOFTKILLVALUE THEN                                        06674000
   SENDSOFTINT                                                          06676000
ELSE                                                                    06678000
   BEGIN  <<DYING PROCESS, REJECT THE INTERRUPT>>                       06680000
   LEVEL:=PROCESSDEAD;                                                  06682000
   CC:=CCL;                                                             06684000
   END;                                                                 06686000
PENABLE;                                                                06688000
                                                                        06690000
<<EMIT MMSTAT EVENT>>                                                   06692000
IF GLOBALTRACEFLAG THEN                                                 06694000
   BEGIN  <<MONITORING IS ENABLED>>                                     06696000
   TPIN:=PIN; TTYPE:=TYPE; TSUBTYPE:=SUBTYPE; TLEVEL:=LEVEL;            06698000
   MMSTAT(MMCAUSE,TMISC,MSG0,MSG1);                                     06700000
   END;                                                                 06702000
                                                                        06704000
<<RETURN TO THE CALLER>>                                                06706000
TOS:=RETURN6+MSGLEN;                                                    06708000
ASMB(XEQ);                                                              06710000
END;  <<CAUSESOFTINT>>                                                  06712000
$PAGE "SOFTWARE INTERRUPTS.  CHANGEINTSTATE PROCEDURE."                 06714000
LOGICAL PROCEDURE CHANGEINTSTATE(NEWSTATE);                    <<03041>>06716000
VALUE NEWSTATE;                                                         06718000
                                                                        06720000
<<FUNCTION                                                              06722000
  ENABLES/DISABLES USER SOFT INTERRUPTS AGAINST THE PROCESS.>>          06724000
                                                                        06726000
<<INPUT>>                                                               06728000
  LOGICAL                                                               06730000
    NEWSTATE;            <<(15:1):  0 - DISABLE THE INTERRUPT           06732000
                                    1 - ENABLE USER INTERRUPTS          06734000
                           (0:15):  IGNORED.>>                          06736000
<<OUTPUT                                                                06738000
    CHANGEINTSTATE         OLD VALUE OF THE USER INTERRUPT STATE.       06740000
    PREGISTER.(0:1)        SET TO ONE IF NEWSTATE = TRUE AND USER       06742000
    AT CALLER'S Q-2.       SOFT INTERRUPT IS PENDING.  THIS CAUSES      06744000
                           A BOUNDS VIOLATION TO ININ WHEN THE          06746000
                           CALLING PROCEDURE EXITS.                     06748000
                                                                        06750000
  NOTE: THIS PROCEDURE ASSUMES THAT THE USER'S STACK MARKER IS AT       06752000
        Q-0 OF THE CALLING PROCEDURE.  IF THIS IS NOT SO, THEN          06754000
        AN EXTRA CALL TO PSEUDOINT (VIA ININ BOUNDS VIOLATION) WILL     06756000
        RESULT.>>                                                       06758000
                                                                        06760000
OPTION PRIVILEGED,UNCALLABLE;                                           06762000
                                                                        06764000
   BEGIN                                                                06766000
   DEFINE                                                               06768000
      TOLDSTATE   = TMISC.(14:1)#,                                      06770000
      TNEWSTATE   = TMISC.(15:1)#;                                      06772000
   INTEGER                                                              06774000
      OLDSTATE=CHANGEINTSTATE,TMISC:=0,PCBXLOC,PCBPT;                   06776000
                                                                        06778000
   <<INITIALIZE>>                                                       06780000
   PXFIXED;                                                             06782000
   PCBPT:=ABS(CPCB)-ABS(PCBP);                                          06784000
                                                                        06786000
   <<UPDATE INTERRUPT STATE>>                                           06788000
   CHANGEINTSTATE:=SPCBALLOWSOFT;                                       06790000
   DISABLE; SPCBALLOWSOFT:=NEWSTATE; ENABLE;                            06792000
   PXOLDSISTATE:=NEWSTATE;                                              06794000
                                                                        06796000
   IF NEWSTATE AND LOG(PORTSTATUS(USERMSGPORT)) THEN                    06798000
      BEGIN  <<GOT AT LEAST ONE PENDING INTERRUPT>>                     06800000
      DISABLE; SPCBDELAYSOFT:=1; ENABLE;                                06802000
      Q0ARRAY(-DELTAQ-2).(0:1):=1;<<CAUSE TRAP TO ININ ON EXIT TO USER>>06804000
      END;                                                              06806000
                                                                        06808000
   IF GLOBALTRACEFLAG THEN                                              06810000
      BEGIN  <<MONITORING IS ON>>                                       06812000
      TNEWSTATE:=NEWSTATE; TOLDSTATE:=OLDSTATE;                         06814000
      MMSTAT(MMCHANGESTATE,TMISC,Q0ARRAY(-DELTAQ-2),Q0ARRAY(-DELTAQ-1));06816000
      END;                                                              06818000
   END;  <<CHANGEINTSTATE>>                                             06820000
$PAGE "DATA STRUCTURE INDEPENDENT INFORMATION PROCEDURES"      <<03041>>06822000
                                                               <<03041>>06824000
LOGICAL PROCEDURE STACKCHECK(DSTNUMBER);                       <<03041>>06826000
VALUE DSTNUMBER;                                               <<03041>>06828000
INTEGER DSTNUMBER;                                             <<03041>>06830000
OPTION PRIVILEGED,UNCALLABLE;                                  <<03041>>06832000
                                                               <<03041>>06834000
COMMENT                                                        <<03041>>06836000
                                                               <<03041>>06838000
RETURNS TRUE IS SPECIFIED DATA SEG IS A STACK ELSE FALSE       <<03041>>06840000
                                                               <<03041>>06842000
;                                                              <<03041>>06844000
                                                               <<03041>>06846000
BEGIN                                                          <<03041>>06848000
STACKCHECK:=DST(DSTNUMBER&LSL(2)+1).STKFLAG;                   <<03041>>06850000
END <<STACKCHECK>>;                                            <<03041>>06852000
                                                               <<01644>>06856000
LOGICAL PROCEDURE CHECKALIVE(PIN);                             <<01644>>06858000
VALUE PIN;                                                     <<01644>>06860000
INTEGER PIN;                                                   <<01644>>06862000
OPTION PRIVILEGED,UNCALLABLE;                                  <<01644>>06864000
                                                               <<01644>>06866000
COMMENT                                                        <<01644>>06868000
                                                               <<01644>>06870000
RETURNS FALSE IF PIN WITH PCB INDEX PCBPT IS UNASSIGNED ELSE TR<<01644>>06872000
                                                               <<01644>>06874000
;                                                              <<01644>>06876000
                                                               <<01644>>06878000
BEGIN                                                          <<01644>>06880000
IF PCB(PIN*PCBSIZE+PQPTRWORDNUM)=-1 THEN CHECKALIVE:=FALSE     <<01644>>06882000
ELSE CHECKALIVE:=TRUE;                                         <<01644>>06884000
END <<CHECKALIVE>> ;                                           <<01644>>06886000
                                                               <<01644>>06888000
PROCEDURE LOCKSEG'(SEGIDENT,BLOCKEDLOCK);                               06890000
VALUE SEGIDENT,BLOCKEDLOCK;                                             06892000
INTEGER SEGIDENT;                                                       06894000
LOGICAL BLOCKEDLOCK;                                                    06896000
OPTION PRIVILEGED,UNCALLABLE;                                           06898000
                                                                        06900000
COMMENT                                                                 06902000
                                                                        06904000
LOCKSEG' IS CALLED TO LOCK A SEGMENT IN MAIN MEMORY ON BEHALF           06906000
OF THE CALLING PROCESS. WHEN LOCKSEG' RETURNS TO THE CALLER,            06908000
THE SEGMENT IS IN MAIN MEMORY AND CANNOT BE RELEASED UNTIL THE          06910000
LOCK COUNT FALLS TO ZERO.  THE SEGMENT MAY BE MOVED ABOUT IN            06912000
MAIN MEMORY THOUGH, PROVIDED IT HAS NOT BEEN FROZEN.  THE BLOCKED       06914000
LOCK PARAMETER INDICATES WHETHER THE CALLER INTENDS TO FREEZE           06916000
THE SEGMENT DOWN FOR AN EXTENDED PERIOD AFTER LOCKING IT. IF TRUE,      06918000
LOCKSEG' WILL NOT RETURN UNTIL THE SEGMENT HAS MIGRATED TO A            06920000
BOUNDARY. IF FALSE, LOCKSEG' RETURNS AS SOON AS THE SEG IS              06922000
MADE PRESENT.                                                           06924000
                                                                        06926000
ENTRY FREEZESEG' IS CALLED TO FREEZE A SEGMENT IN MAIN MEMORY ON BEHALF 06928000
OF THE CALLING PROCESS.  ONCE THE SEGMENT IS PRESENT, IT WILL           06930000
NOT BE RELEASED FROM MAIN MEMORY OR MOVED WITHIN MAIN MEMORY            06932000
UNTIL THE FREEZECOUNT IN THE SEGMENT'S REGION HEADER FALLS TO           06934000
ZERO. THE BLOCKEDLOCK FLAG IS IGNORED FOR FREEZESEG' CALLS.             06936000
                                                                        06938000
;                                                                       06940000
                                                                        06942000
BEGIN                                                                   06944000
INTEGER DESCSTINX;                                                      06946000
LOGICAL FREEZE;                                                         06948000
ENTRY FREEZESEG';                                                       06950000
                                                                        06952000
FREEZE:=FALSE;                                                          06954000
GO OVER;                                                                06956000
                                                                        06958000
FREEZESEG':                                                             06960000
FREEZE:=TRUE;                                                           06962000
                                                                        06964000
OVER:                                                                   06966000
                                                                        06968000
DISABLE;                                                                06970000
X:=DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                               06972000
IF NOT LOGICAL(DST(X:=X+1)).SEGRESIDENTFLAG THEN                        06974000
   BEGIN  <<NOT RESIDENT>>                                              06976000
   TOS:=%1000D;                                                         06978000
   ASMB(XCHD);                                                          06980000
   X:=ABSOLUTE(CPCB)-SYSBASE;                                           06982000
   TOS:=SLLPTR;                                                         06984000
   TOS:=SEGIDENT;                                                       06986000
   TOS:=0;                                                              06988000
   TOS.SETMEMREQPTRFLAG:=1;                                             06990000
   IF FREEZE THEN TOS.SETFZFLAG:=1 ELSE IF BLOCKEDLOCK THEN             06992000
      TOS.SETBLKLKFLAG:=1 ELSE TOS.SETLOCKFLAG:=1;                      06994000
   ADDTOLOCALITY(*,*,*);                                                06996000
   ASMB(XCHD);                                                          06998000
   WAIT(MEMORYWAITCODE,MEMTRAP);                                        07000000
   X:=DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                            07002000
   END;                                                                 07004000
IF DST(DESCSTINX).ABSENTFLAG=0 THEN CC:=CCE ELSE CC:=CCL;               07006000
END  <<LOCKSEG'>>;                                                      07008000
                                                                        07010000
                                                                        07012000
$TITLE "UNCALLABLE UTILITIES : UNLOCKSEG'"                              07014000
                                                                        07016000
PROCEDURE UNLOCKSEG'(SEGIDENT);                                         07018000
VALUE SEGIDENT;                                                         07020000
INTEGER SEGIDENT;                                                       07022000
OPTION PRIVILEGED,UNCALLABLE;                                           07024000
                                                                        07026000
BEGIN                                                                   07028000
LOGICAL UNFREEZE;                                                       07030000
INTEGER COUNT,                                                          07032000
        TYPE,       <<FOR MMSTAT>>                             <<01571>>07034000
        DESCSTINX;                                                      07036000
ENTRY UNFREEZESEG';                                                     07038000
                                                                        07040000
TYPE.(12:4) := 5;   <<UNLOCK TYPE>>                            <<01571>>07042000
UNFREEZE:=FALSE;                                                        07044000
GO OVER;                                                                07046000
                                                                        07048000
TYPE.(12:4) := 4;   <<UNFREEZE TYPE>>                          <<01571>>07050000
UNFREEZESEG':                                                           07052000
UNFREEZE:=TRUE;                                                         07054000
                                                                        07056000
OVER:                                                                   07058000
DISABLE;                                                                07060000
DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                                  07062000
IF DST(DESCSTINX) < 0 THEN SUDDENDEATH(606);<<ABSENT>>         <<01644>>07064000
IF DST(X:=DESCSTINX+1).SEGRESIDENTFLAG<>1 THEN                          07066000
   BEGIN <<SEG NOT CORE RESIDENT>>                                      07068000
   TOS:=DST(X:=X+1);   <<SEGDESCBANK>>                                  07070000
   TOS:=DST(X:=X+1);                                                    07072000
   TOS:=TOS+RBTOLKFZCNTDISP;                                            07074000
   ASMB(LSEA);                                                          07076000
   COUNT:=TOS;                                                          07078000
   IF UNFREEZE THEN COUNT.FZCNTFIELD:=COUNT.FZCNTFIELD-1                07080000
   ELSE COUNT.LKCNTFIELD:=COUNT.LKCNTFIELD-1;                           07082000
   TOS:=COUNT;                                                          07084000
   ASMB(SSEA);                                                          07086000
   IF COUNT.FZCNTFIELD=0 AND UNFREEZE OR COUNT.LKCNTFIELD=0 AND NOT     07088000
   UNFREEZE THEN                                                        07090000
      BEGIN <<SEG IS COMPLETELY UNLOCKED OR UNFROZEN>>                  07092000
      TOS:=TOS+LKFZCNTTORASDISP;                                        07094000
      ASMB(LSEA);                                                       07096000
      IF UNFREEZE THEN TOS.REGFZFLAG:=0 ELSE TOS.REGLKDFLAG:=0;         07098000
      IF = THEN SUDDENDEATH(606);                              <<01644>>07100000
      ASMB(SSEA);                                                       07102000
      END;                                                              07104000
   END;                                                                 07106000
MMSTAT(2,SEGIDENT,TYPE,COUNT);                                 <<01571>>07108000
END  <<UNFREEZE>>;                                                      07110000
                                                                        07112000
$TITLE "UNCALLABLE UTILITIES : LOCKSEG"                                 07114000
                                                                        07116000
PROCEDURE LOCKSEG(ENTRYNUMBER,FLAGS,PINX);                              07118000
VALUE ENTRYNUMBER,FLAGS,PINX;                                           07120000
INTEGER ENTRYNUMBER,PINX;                                               07122000
LOGICAL FLAGS;                                                          07124000
OPTION PRIVILEGED,UNCALLABLE;                                           07126000
                                                                        07128000
COMMENT                                                                 07130000
                                                                        07132000
EMULATES PREV IOFREEZE,IOUNFREEZE,LOCKSEG,FREEZE. WEED OUT CALLS TO IT. 07134000
                                                                        07136000
;                                                                       07138000
BEGIN                                                                   07140000
LOGICAL LOCKCALL:=FALSE;                                                07142000
INTEGER SEGIDENT,                                                       07144000
        SEGTYPE;                                                        07146000
LOGICAL FREEZECALL,                                                     07148000
        IOFZCALL,                                                       07150000
        IOUNFZCALL,                                                     07152000
        UNFREEZECALL,                                                   07154000
        UNLOCKCALL;                                                     07156000
ENTRY FREEZE,UNFREEZE,UNLOCKSEG,IOFREEZE,IOUNFREEZE;                    07158000
IOFZCALL:=IOUNFZCALL:=UNLOCKCALL:=UNFREEZECALL:=FREEZECALL:=FALSE;      07160000
LOCKCALL:=TRUE;                                                         07162000
GO OVER;                                                                07164000
FREEZE:                                                                 07166000
FREEZECALL:=TRUE;                                                       07168000
IOFZCALL:=IOUNFZCALL:=LOCKCALL:=UNFREEZECALL:=UNLOCKCALL:=FALSE;        07170000
GO OVER;                                                                07172000
UNFREEZE:                                                               07174000
UNFREEZECALL:=TRUE;                                                     07176000
IOFZCALL:=IOUNFZCALL:=LOCKCALL:=UNLOCKCALL:=FREEZECALL:=FALSE;          07178000
GO OVER;                                                                07180000
UNLOCKSEG:                                                              07182000
UNLOCKCALL:=TRUE;                                                       07184000
IOFZCALL:=IOUNFZCALL:=LOCKCALL:=UNFREEZECALL:=FREEZECALL:=FALSE;        07186000
GO OVER;                                                                07188000
IOFREEZE:                                                               07190000
IOFZCALL:=TRUE;                                                         07192000
UNLOCKCALL:=IOUNFZCALL:=LOCKCALL:=UNFREEZECALL:=FREEZECALL:=FALSE;      07194000
GO OVER;                                                                07196000
IOUNFREEZE:                                                             07198000
IOFZCALL:=UNLOCKCALL:=LOCKCALL:=UNFREEZECALL:=FREEZECALL:=FALSE;        07200000
IOUNFZCALL:=TRUE;                                                       07202000
GO OVER;                                                                07204000
OVER:                                                                   07206000
TOS:=ABSOLUTE(CPCB);                                                    07208000
IF = AND NOT IOFZCALL AND NOT IOUNFZCALL                       <<01644>>07210000
THEN SUDDENDEATH(607);                                         <<01644>>07212000
TOS:=TOS-ABSOLUTE(PCBP);                                                07214000
IF PINX = 0 THEN PINX:=TOS ELSE ASMB(DEL);                              07216000
IF FLAGS THEN SEGTYPE:=0 <<DATA SEG>> ELSE IF ENTRYNUMBER < %300        07218000
THEN SEGTYPE:=1 <<SL SEG>> ELSE SEGTYPE:=2;                             07220000
SEGIDENT:=BUILDSEGID(SEGTYPE,ENTRYNUMBER,PINX/PCBSIZE);                 07222000
IF FREEZECALL THEN                                                      07224000
   BEGIN                                                                07226000
   FREEZESEG'(SEGIDENT,0);                                              07228000
   CC:=CCE;                                                             07230000
   END                                                                  07232000
ELSE IF UNFREEZECALL THEN                                               07234000
   BEGIN                                                                07236000
   UNFREEZESEG'(SEGIDENT);                                              07238000
   CC:=CCE;                                                             07240000
   END                                                                  07242000
ELSE IF UNLOCKCALL THEN                                                 07244000
   BEGIN                                                                07246000
   UNLOCKSEG'(SEGIDENT);                                                07248000
   CC:=CCE;                                                             07250000
   END                                                                  07252000
ELSE IF LOCKCALL THEN                                                   07254000
   BEGIN                                                                07256000
   LOCKSEG'(SEGIDENT,0);  <<FOR NOW ALL UNBLOCKED>>                     07258000
   IF = THEN CC:=CCE ELSE CC:=CCL;                                      07260000
   END                                                                  07262000
<<   IF NOT FLAGS.(13:1) AND NOT FLAGS.(14:1) THEN                      07264000
      BEGIN                                                             07266000
      LOCKSEG'(SEGIDENT,-1)   DEFAULT BLOCKED LOCK                      07268000
      CC:=CCE;                                                          07270000
      END                                                               07272000
   ELSE CC:=CCLCAN'T SPECIFY LOCATION>>                                 07274000
ELSE IF IOFZCALL THEN                                                   07276000
   BEGIN                                                                07278000
   IOFREEZE'(SEGIDENT);                                                 07280000
   IF < THEN CC:=CCL ELSE IF = THEN CC:=CCE ELSE IF > THEN CC:=CCG;     07282000
   END                                                                  07284000
ELSE IF IOUNFZCALL THEN                                                 07286000
   BEGIN                                                                07288000
   IOUNFREEZE'(SEGIDENT);                                               07290000
   IF < THEN CC:=CCL ELSE IF = THEN CC:=CCE ELSE IF > THEN CC:=CCG;     07292000
   END;                                                        <<01644>>07294000
END <<LOCKSEG>>;                                                        07296000
                                                                        07298000
$TITLE "UNCALLABLE UTILITIES : UPDATE DISC COPY"                        07300000
PROCEDURE UPDATEDISCCOPY(DSTENTRY);                                     07302000
VALUE DSTENTRY;                                                         07304000
INTEGER DSTENTRY;                                                       07306000
OPTION PRIVILEGED,UNCALLABLE;                                           07308000
                                                                        07310000
COMMENT                                                                 07312000
                                                                        07314000
UPDATEDISCCOPY ISSUES A BLOCKED ATTACHIO ON BEHALF OF THE PROCESS       07316000
TO WRITE THE CONTENTS OF THE DATA SEGMENT TO THE COPY OF THE SEGMENT    07318000
IN VIRTUAL MEMORY.  IF THE DISC COPY IS                                 07320000
ALREADY VALID, CONTROL RETURNS IMMEDIATELY TO THE CALLING PROCESS.      07322000
                                                                        07324000
;                                                                       07326000
                                                                        07328000
BEGIN                                                                   07330000
DEFINE RTYPE=(14:2)#;                                                   07332000
ENTRY WRITEDSEG;                                                        07334000
INTEGER HODA,                                                           07336000
        LDEVNUM,                                                        07338000
        DESCSTINX,                                                      07340000
        CNT,                                                            07342000
        LODA;                                                           07344000
WRITEDSEG:      <<RENAMED TO UPDATEDISCCOPY>>                           07346000
DESCSTINX:=DSTENTRY&LSL(2);                                             07348000
DISABLE;  <<WHILE FIGURING OUT THE DISC ADDRESS>>                       07350000
IF NOT LOGICAL(DST(X:=DESCSTINX+1)).DISCCOPYVALIDFLAG THEN              07352000
   BEGIN                                                                07354000
   CNT:=(DST(DESCSTINX).DATASIZEFIELD)&LSL(2);                          07356000
   TOS:=DST(X:=DESCSTINX+2);                                            07358000
   TOS:=DST(X:=X+1);                                                    07360000
   IF NOT LOGICAL(DST(DESCSTINX)).ABSENTFLAG                            07362000
   OR LOGICAL(DST(DESCSTINX+1)).IMIFLAG                                 07364000
   OR LOGICAL(DST(DESCSTINX+1)).ROCFLAG THEN                            07366000
      BEGIN <<DISC ADDRESS IS IN MEMORY HEADER>>                        07368000
      TOS:=TOS+RBTOHODADISP;                                            07370000
      ASMB(LDEA);                                                       07372000
      END;                                                              07374000
   ENABLE;                                                              07376000
   LODA:=TOS;                                                           07378000
   HODA:=S0.(8:8);                                                      07380000
   LDEVNUM:=TOS.(0:8);  <<LDEVN>>                                       07382000
   TOS:=ATTACHIO(LDEVNUM,0,DSTENTRY,0,WRITEREQ,CNT,HODA,LODA,1);        07384000
   IF S1.(13:3) <> 1 THEN SUDDENDEATH(654);                    <<01644>>07386000
   END;                                                                 07388000
END  <<UPDATEDISCCOPY>>;                                                07390000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS"                           07392000
                                                                        07394000
                                                                        07396000
                                                                        07398000
PROCEDURE ABORTPROCESS(PROCSYSDBINX,ABORTCODE);                         07400000
VALUE PROCSYSDBINX,ABORTCODE;                                           07402000
INTEGER PROCSYSDBINX,ABORTCODE;                                         07404000
OPTION PRIVILEGED,UNCALLABLE;                                           07406000
                                                                        07408000
BEGIN                                                                   07410000
SUDDENDEATH(608); <<NOT YET SUPPORTED>>                        <<01644>>07412000
END  <<ABORTPROC>>;                                                     07414000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS : QUEUEPROC"               07418000
PROCEDURE QUEUEPROC(PROCSYSDBINX,QUEUENAME,LOCATION);                   07420000
VALUE PROCSYSDBINX,QUEUENAME,LOCATION;                                  07422000
INTEGER PROCSYSDBINX,QUEUENAME,LOCATION;                                07424000
OPTION PRIVILEGED,UNCALLABLE;                                           07426000
                                                                        07428000
COMMENT                                                                 07430000
                                                                        07432000
QUEUEPROC REMOVES A PROCESS FROM ITS CURRENT QUEUE                      07434000
AND MERGES IT INTO THE QUEUE SPECIFIED BY QUEUENAME.                    07436000
LOCATION INDICATES WHETHER THE PROCESS IS TO BE QUEUED                  07438000
AT THE FRONT OR END OF ITS URGENCY CLASS SUBQUEUE FOR                   07440000
THE DISPQ.                                                              07442000
                                                                        07444000
THE PARAMETERS FOLLOW THE FOLLOWING CONVENTIONS:                        07446000
                                                                        07448000
PROCSSYSDBINX IS THE SYSDB INDEX OF THE PROCESS' PCB ENTRY.             07450000
                                                                        07452000
QUEUENAME = 1 ==> QUEUE INTO DISPATCHING QUEUE,                         07454000
          = 0 ==> DON'T PUT ON ANY QUEUE                                07456000
                                                                        07458000
LOCATION = 1 ==> QUEUE AT FRONT OF CLASS SUBQUEUE                       07460000
         = 0 ==> QUEUE AT END OF CLASS SUBQUEUE.                        07462000
                                                                        07464000
DB MUST BE SET AT SYSDB WHEN ENTERING THE PROCEDURE.                    07466000
                                                                        07468000
;                                                                       07470000
                                                                        07472000
                                                                        07474000
BEGIN                                                                   07476000
                                                                        07478000
INTEGER PROCINX:=0,                                                     07480000
        PREV;                                                           07482000
LOGICAL PROCPRI,                                                        07484000
        DISPQ:=FALSE,                                                   07486000
        NOTQUEUED:=FALSE;                                               07488000
                                                                        07490000
<< CHECK RANGE OF PCB >>                                                07492000
                                                                        07494000
TOS:=PROCSYSDBINX-PCBSYSBASEINX;                                        07496000
IF <= OR LS0 > LOGICAL(PCB(0)*PCB(1)) THEN SUDDENDEATH(608);   <<01644>>07498000
ASMB(DEL);                                                              07500000
                                                                        07502000
<<FIND OUT IF PROCESS IS ALREADY ON A QUEUE>>                           07504000
                                                                        07506000
X:=PROCSYSDBINX;                                                        07508000
DISABLE;                                                                07510000
QUEUEINGINFO.DISPQFLAG:=0;                                              07512000
IF <> THEN DISPQ:=TRUE ELSE NOTQUEUED:=TRUE;                            07514000
                                                                        07516000
IF DISPQ THEN                                                           07518000
   BEGIN  <<PROC IS ON A QUEUE, SO TAKE IT OFF>>                        07520000
   TOS:=PQPTR;                                                          07522000
   IF = THEN                                                            07524000
      BEGIN  <<FIRST PROC IN Q>>                                        07526000
      TOS:=NQPTR;                                                       07528000
      IF = THEN                                                         07530000
         BEGIN  <<ONLY PROC IN Q>>                                      07532000
         DISPQHEAD:=TOS;                                                07534000
         DISPQTAIL:=TOS;                                                07536000
         END                                                            07538000
      ELSE                                                              07540000
         BEGIN  <<SOMEBODY BEHIND HIM/HER>>                             07542000
         NQPTR:=0;                                                      07544000
         X:=TOS;                                                        07546000
         PQPTR:=TOS;  <<ZERO OUT NEXT'S PQP>>                           07548000
         DISPQHEAD:=X;                                                  07550000
         END;                                                           07552000
      END                                                               07554000
   ELSE                                                                 07556000
      BEGIN  <<NOT FIRST IN Q>>                                         07558000
      PQPTR:=0;                                                         07560000
      TOS:=NQPTR;                                                       07562000
      NQPTR:=0;                                                         07564000
      ASMB(DUP);                                                        07566000
      IF = THEN                                                         07568000
         BEGIN <<LAST PROC IN QUEUE>>                                   07570000
         ASMB(DEL);                                                     07572000
         X:=S1;                                                         07574000
         NQPTR:=TOS; <<ZERO OUT PREVIOUS' NQP>>                         07576000
         DISPQTAIL:=TOS;                                                07578000
         END                                                            07580000
      ELSE                                                              07582000
         BEGIN <<PROC IN MIDDLE OF QUEUE>>                              07584000
         X:=TOS;                                                        07586000
         ASMB(XCH);                                                     07588000
         ASMB(DUP);                                                     07590000
         PQPTR:=TOS;                                                    07592000
         X:=TOS;                                                        07594000
         NQPTR:=TOS;                                                    07596000
         END;                                                           07598000
      END;                                                              07600000
   END;                                                                 07602000
                                                                        07604000
X:=PROCSYSDBINX;                                                        07606000
IF QUEUENAME <> 0  THEN                                                 07608000
   BEGIN <<MERGE INTO DISPQ>>                                           07610000
   QUEUEINGINFO.DISPQFLAG:=1;                                           07612000
   PROCPRI:=QUEUEINGINFO.PRIFIELD;                                      07614000
   X:=DISPQHEAD;                                                        07616000
   IF = THEN DISPQHEAD:=DISPQTAIL:=PROCSYSDBINX ELSE                    07618000
      BEGIN  <<Q IS NON-EMPTY>>                                         07620000
      IF LOGICAL(LOCATION) THEN                                         07622000
         BEGIN <<QUEUE IN FRONT OF URGENCY SUBQ>>                       07624000
         WHILE X <> 0 DO                                                07626000
            BEGIN                                                       07628000
            IF QUEUEINGINFO.PRIFIELD < PROCPRI THEN X:=NQPTR ELSE       07630000
               BEGIN <<INSERT IN FRONT OF THIS PCB>>                    07632000
               PROCINX:=X;                                              07634000
               X:=0; <<TO TERMINATE WHILE LOOP>>                        07636000
               END;                                                     07638000
            END;                                                        07640000
         END                                                            07642000
      ELSE                                                              07644000
         BEGIN  <<AT END OF CLASS SUBQ>>                                07646000
         WHILE X <> 0 DO                                                07648000
            BEGIN                                                       07650000
            IF QUEUEINGINFO.PRIFIELD <= PROCPRI THEN X:=NQPTR ELSE      07652000
               BEGIN <<INSERT IN FRONT OF THIS PCB>>                    07654000
               PROCINX:=X;                                              07656000
               X:=0; <<TO TERMINATE WHILE LOOP>>                        07658000
               END;                                                     07660000
            END;                                                        07662000
         END;                                                           07664000
      X:=PROCINX;                                                       07666000
      IF = THEN                                                         07668000
         BEGIN  <<BELONGS AT END OF QUEUE>>                             07670000
         TOS:=DISPQTAIL;                                                07672000
         DISPQTAIL:=PROCSYSDBINX;                                       07674000
         X:=PROCSYSDBINX;                                               07676000
         PQPTR:=S0;                                                     07678000
         ASMB(XAX);                                                     07680000
         NQPTR:=TOS;                                                    07682000
         END                                                            07684000
      ELSE                                                              07686000
         BEGIN <<BELONGS IN FRONT OF THAT PCB>>                         07688000
         PREV:=PQPTR;                                                   07690000
         PQPTR:=PROCSYSDBINX;                                           07692000
         X:=PREV;                                                       07694000
         IF = THEN                                                      07696000
            BEGIN  <<GOES AT FRONT OF Q>>                               07698000
            X:=DISPQHEAD:=PROCSYSDBINX;                                 07700000
            NQPTR:=PROCINX;                                             07702000
            END                                                         07704000
         ELSE                                                           07706000
            BEGIN  <<MERGE INTO MIDDLE>>                                07708000
            NQPTR:=PROCSYSDBINX;                                        07710000
            X:=PROCSYSDBINX;                                            07712000
            PQPTR:=PREV;                                                07714000
            NQPTR:=PROCINX;                                             07716000
            END;                                                        07718000
         END;                                                           07720000
      END;                                                              07722000
   END;                                                                 07724000
END  <<PROCEDURE QUEUEPROC>>;                                           07726000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS : RESETDISPQ"              07728000
PROCEDURE RESETDISPQ;                                                   07730000
OPTION PRIVILEGED,UNCALLABLE;                                           07732000
                                                                        07734000
COMMENT                                                                 07736000
                                                                        07738000
RESETDISPQ IS CALLED BY THE TUNE COMMAND EXECUTOR TO PLACE ALL          07740000
PROCESSES AT THE BASE OF THEIR SCHEDULING CLASSES IN THE DISPQ.         07742000
                                                                        07744000
THIS INITIALIZATION IS NECESSARY IN ORDER TO RESPOND QUICKLY TO         07746000
THE NEWLY DESIRED SCHEDULING CONDITIONS, AND TO KEEP FROM STRANDING     07748000
PROCESSES WHICH MAY HAVE BEEN FILTERED BEYOND THE NEW LIMITS.           07750000
                                                                        07752000
IN ORDER NOT TO HAVE TO HOLD OFF INTERRUPTS TOO LONG, THE DISPQ         07754000
IS SCANNED UNTIL A PROCESS IS FOUND THAT IS NOT AT THE APPROPRIATE      07756000
SCHEDULING BASE.  THIS PROCESS IS QUEUED TO THE PROPER PLACE, THEN      07758000
INTERRUPTS ARE ENABLED, AND THE QUEUE SCAN STARTS OVER.  THE SYSTEM     07760000
IS PDISABLED THROUGHOUT.                                                07762000
                                                                        07764000
;                                                                       07766000
                                                                        07768000
BEGIN                                                                   07770000
                                                                        07772000
DOUBLE SAVEDB;                                                          07774000
                                                                        07776000
LOGICAL CBASE,                                                          07778000
        DBASE,                                                          07780000
        EBASE;                                                          07782000
                                                                        07784000
PDISABLE;                                                               07786000
                                                                        07788000
<<PUT DB AT SYSDB>>                                                     07790000
                                                                        07792000
TOS:=%1000D;                                                            07794000
ASMB(XCHD);                                                             07796000
SAVEDB:=TOS;                                                            07798000
                                                                        07800000
<<GET THE NEW SCHEDULING BASES FROM THE ICS>>                           07802000
                                                                        07804000
CBASE:=ICS(-ICS'CSCHEDBASECELL);                                        07806000
DBASE:=ICS(-ICS'DSCHEDBASECELL);                                        07808000
EBASE:=ICS(-ICS'ESCHEDBASECELL);                                        07810000
                                                                        07812000
<<MOVE ALL THE PROCESSES ON DISPQ TO THEIR SCHEDULING BASES>>           07814000
                                                                        07816000
DISABLE;                                                                07818000
X:=DISPQHEAD;                                                           07820000
WHILE <> DO                                                             07822000
   BEGIN <<LOCATE FIRST PROCESS AT WRONG PLACE AND MOVE IT>>            07824000
   IF QUEUEINGINFO.LSCHEDFLAG THEN X:=NQPTR <<HE'S OK>>                 07826000
   ELSE IF QUEUEINGINFO.CSCHEDFLAG=1 AND QUEUEINGINFO.PRIFIELD=CBASE    07828000
   THEN X:=NQPTR <<HE'S OK>>                                            07830000
   ELSE IF QUEUEINGINFO.DSCHEDFLAG=1 AND QUEUEINGINFO.PRIFIELD=DBASE    07832000
   THEN X:=NQPTR   <<HE'S OK>>                                          07834000
   ELSE IF QUEUEINGINFO.ESCHEDFLAG=1 AND QUEUEINGINFO.PRIFIELD=EBASE    07836000
   THEN X:=NQPTR <<HE'S OK>> ELSE                                       07838000
      BEGIN  <<THIS GUY IS OUT OF ORDER>>                               07840000
      IF QUEUEINGINFO.CSCHEDFLAG THEN QUEUEINGINFO.PRIFIELD:=CBASE ELSE 07842000
      IF QUEUEINGINFO.DSCHEDFLAG THEN QUEUEINGINFO.PRIFIELD:=DBASE ELSE 07844000
      IF QUEUEINGINFO.ESCHEDFLAG THEN QUEUEINGINFO.PRIFIELD:=EBASE;     07846000
      QUEUEPROC(X,DISPATCHINGQ,ENDOFCLASS);                             07848000
      ENABLE;                                                           07850000
      DISABLE;                                                          07852000
      X:=DISPQHEAD;  <<START THE SCAN OVER>>                            07854000
      END;                                                              07856000
   END;                                                                 07858000
                                                                        07860000
<<PUT DB BACK TO THE RIGHT PLACE>>                                      07862000
                                                                        07864000
TOS:=SAVEDB;                                                            07866000
ASMB(XCHD);                                                             07868000
                                                                        07870000
PENABLE;                                                                07872000
                                                                        07874000
END  <<RESETDISPQ>>;                                                    07876000
                                                                        07878000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS : WAIT"                    07880000
PROCEDURE WAIT(EVENTMASK,SPECIALINFO);                                  07882000
VALUE EVENTMASK,SPECIALINFO;                                            07884000
INTEGER EVENTMASK;                                                      07886000
LOGICAL SPECIALINFO;                                                    07888000
OPTION PRIVILEGED,UNCALLABLE;                                           07890000
                                                                        07892000
COMMENT                                                                 07894000
                                                                        07896000
WAIT IS CALLED BY THE SYSTEM WHENEVER THE CALLING PROCESS MUST          07898000
BLOCK UNTIL AN EVENT OCCURS. THE EVENTMASK PARAMETER SPECIFIES          07900000
THE EVENT TYPES WHICH THE PROCESS WISHES TO BE AWAKENED ON. THE         07902000
CALLER MAY REQUEST THAT CONTROL BE RETURNED IMMEDIATELY IF AN           07904000
AWAKE ON ONE OF THE EVENT TYPES HAS ALREADY OCCURRED BY PASSING THE     07906000
EVENTMASK AS A NEGATIVE EVENTMASK.                                      07908000
                                                                        07910000
THE SPECIALINFO PARAMETER PASSES ALONG INFORMATION ON THE PROCESS'      07912000
CAUSE OF BLOCKING, ESTIMATES ON HOW LONG THE PROCESS MIGHT BE           07914000
EXPECTED TO STAY BLOCKED, ESTIMATES ON WHETHER THE LOCALITY             07916000
MIGHT BE EXPECTED TO REMAIN ABOUT THE SAME OR UNDERGO A RADICAL         07918000
TRANSITION WHEN THE PROCESS CONTINUES.                                  07920000
                                                               <<03041>>07922000
SPECIALINFO.(3:1) <= 1 ENABLES EITHER SOFT INTERRUPTS OR THE   <<03041>>07924000
SPECIFIED WAIT EVENTS TO WAKE UP THE PROCESS.  WAIT RETURNS A  <<03041>>07926000
CCE CONDITION CODE IF AWAKENED BY A WAIT EVENT, A CCG IS       <<03041>>07928000
RETURNED FOR THE SOFT INTERRUPT CASE.                          <<03041>>07930000
                                                                        07932000
;                                                                       07934000
                                                                        07936000
BEGIN                                                                   07938000
DEFINE                                                         <<03041>>07940000
   ALLOWSOFTINT     = SPECIALINFO.(3:1)#;                      <<03041>>07942000
DOUBLE SAVEDB;                                                          07944000
INTEGER SAVEX;                                                          07946000
INTEGER PCBXLOC;                                               <<03041>>07948000
                                                                        07950000
TURNOFFTRAPS;                                                  <<01860>>07952000
CC:=CCE;                                                       <<03041>>07954000
                                                               <<01860>>07956000
DISABLE;                                                                07958000
IF ALLOWSOFTINT THEN                                           <<03041>>07960000
   BEGIN  <<CHECK IF A SOFT INT HAS OCCURRED>>                 <<03041>>07962000
   PXFIXED;                                                    <<03041>>07964000
   IF LOG(CPCBDELAYSOFT) OR LOG(PXDELAYCONTROLY) THEN          <<03041>>07966000
      BEGIN  <<SOFT INT HAS ALREADY HAPPENED>>                 <<03041>>07968000
      CC:=CCG;                                                 <<03041>>07970000
      RETURN;                                                  <<03041>>07972000
      END;                                                     <<03041>>07974000
   CPCBWAKESOFT:=1;                                            <<03041>>07976000
   END;                                                        <<03041>>07978000
                                                                        07980000
TOS:=%1000D;                                                            07982000
X:=ABSOLUTE(CPCB)-S0;  <<PROCSYSDBINX>>                                 07984000
ASMB(XCHD);                                                             07986000
SAVEDB:=TOS;                                                            07988000
                                                                        07990000
DISABLE;                                                                07992000
IF EVENTMASK < 0 THEN                                                   07994000
   BEGIN <<CALLER WANTS WWS CHECKED>>                                   07996000
   EVENTMASK:=-EVENTMASK;                                               07998000
   IF SPECIALINFO.(2:1) THEN                                            08000000
      BEGIN  <<NEW VERSION OF WAIT>>                                    08002000
      IF EVENTFLAGS LAND LOGICAL(EVENTMASK&CSL(4)) <> 0 THEN            08004000
         BEGIN  <<AN EVENT WHICH THE PROCESS IS                         08006000
                  WAITING FOR HAS ALREADY OCCURRED>>                    08008000
         SUDDENDEATH(604);                                     <<01644>>08010000
         WAITTODISPMSG.PHASETRANSFLAG:=0;                               08012000
         WAITTODISPMSG.DISCWAITFLAG:=0;                                 08014000
         ICS(-ICS'PDISCNTCELL):=0;                                      08016000
         TOS:=SAVEDB;                                                   08018000
         ASMB(XCHD);                                                    08020000
         RETURN;                                                        08022000
         END;                                                           08024000
      END                                                               08026000
   ELSE                                                                 08028000
      BEGIN  <<OLD VERSION>>                                            08030000
      IF EVENTFLAGS.WWS <> 0   <<CHECK WWS>>                   <<02826>>08032000
       THEN                                                    <<02826>>08034000
         BEGIN   <<EVENT ALREADY OCCURRED-RETURN TO PROCESS>>           08036000
         WAITTODISPMSG.PHASETRANSFLAG:=0;                               08038000
         EVENTFLAGS := 0;   <<CLEAR AWAKE SEMAPHORES>>         <<02826>>08040000
         WAITTODISPMSG.DISCWAITFLAG:=0;                                 08042000
         TOS:=SAVEDB;                                                   08044000
         ASMB(XCHD);                                                    08046000
         ICS(-ICS'PDISCNTCELL):=0;                                      08048000
         RETURN;                                                        08050000
         END;                                                           08052000
      END;                                                              08054000
   END;                                                                 08056000
IF EVENTMASK = 0 THEN                                                   08058000
   BEGIN <<BETTER BE AN IMPEDE OR SHUTDOWN>>                            08060000
   SPECIALINFO.IMPTRAPFLAG:=0;                                          08062000
   IF <> THEN                                                           08064000
      BEGIN                                                             08066000
      EVENTMASK:=IMPWAITCODE;                                           08068000
      SAVEX:=X; <<SAVEX>>                                               08070000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  08072000
         BEGIN  <<MEASURE IMPEDE PROCESS STOP EVENT>>                   08074000
         TOS:=MEASSTATXDSBANK;                                          08076000
         TOS:=MEASSTATXDSBASE;                                          08078000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPIMPEDE;               <<RAY.V>>08080000
         ASMB(LSEA);                                                    08082000
         TOS:=TOS+1;                                                    08084000
         ASMB(SSEA;DDEL);                                               08086000
         END;                                                           08088000
      IF GCLASSENABLEDMASK.CLASS15 THEN                        <<01812>>08090000
         BEGIN <<MEASURE STOP FOR IMPEDE>>                     <<01812>>08092000
         TOS:=MEASPROCXDSBANK;                                 <<01812>>08094000
         TOS:=MEASPROCXDSBASE;                                 <<01812>>08096000
         TOS:=TOS+((ABS(CPCB)-ABS(PCBP))/PCBSIZE)*             <<01812>>08098000
              CLASS15'SUB0SIZE+CP'STOPIMPEDE;                  <<01812>>08100000
         ASMB(LSEA);                                           <<01812>>08102000
         TOS:=TOS+1;                                           <<01812>>08104000
         ASMB(SSEA;DDEL);                                      <<01812>>08106000
         END;                                                  <<01812>>08108000
      <<STUFF AWAY REASON STOPPED IN PCBX OF IMPEDED PROCESS>> <<01812>>08110000
      <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>  <<01812>>08112000
      TOS:=ICS(-ICS'STKBANKCELL);                              <<01812>>08114000
      TOS:=ICS(-ICS'STKBASECELL);                              <<01812>>08116000
      TOS:=TOS+SBTOMEASSTOPREASON;                             <<01812>>08118000
      TOS:=STOPIMPEDE;                                         <<01812>>08120000
      ASMB(SSEA;DDEL);                                         <<01812>>08122000
      X:=SAVEX;                                                         08124000
      END                                                      <<01799>>08126000
   ELSE QUEUEPROC(X,NOQUEUE,0); <<TOSS FOR EVER>>              <<01799>>08128000
   END;                                                                 08130000
EVENTFLAGS := 0;    <<CLEAR AWAKE SEMAPHORES>>                 <<02826>>08132000
WAKEMASK:=EVENTMASK&CSL(4); <<PRIME FOR AWAKE>>                         08134000
IF WAKEMASK.FATHERSONWAKEFLAGS <> 0                                     08136000
THEN WAITTODISPMSG.TRANSCOMPFLAG:=1;                                    08138000
WAITTODISPMSG:=WAITTODISPMSG LOR SPECIALINFO;  <<PASS ALONG INFO>>      08140000
ICS(-ICS'PDISCNTCELL):=0;                                               08142000
TOS:=SAVEDB;                                                            08144000
ASMB(XCHD);                                                             08146000
ASMB (DISP);                                                            08148000
IF ABSOLUTE(X:=ABSOLUTE(4)+PROCSTATEWORDNUM).STOVFLAG = 1               08150000
   AND NOT LOGICAL(ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM <<04486>>08152000
   )).STOVABORTFLAG                                            <<04486>>08154000
AND NOT LOGICAL(ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM))                08156000
.INSYSTEMFLAG AND NOT LOGICAL(ABSOLUTE(ABSOLUTE(CPCB)+                  08158000
RESABORTINFOWORDNUM)).CRITFLAG AND NOT ABSOLUTE(X).HASSIRFLAG THEN      08160000
   BEGIN <<WAS DISABLED OR PDISABLED WHEN OVERFLOWED, NOT IN SYSTEM>>   08162000
      ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM)             <<04486>>08164000
         .STOVABORTFLAG := 1;   << PROCESSING ABORT FOR STOV >><<04486>>08166000
      ABORT([8/1,8/4],0,0);                                    <<04486>>08168000
   END;                                                                 08170000
                                                               <<03041>>08172000
IF ALLOWSOFTINT THEN                                           <<03041>>08174000
   BEGIN  <<CHECK IF WERE AWAKENED BY A SOFT INTERRUPT>>       <<03041>>08176000
   CPCBWAKESOFT:=0;                                            <<03041>>08178000
   IF = THEN CC:=CCG;  <<WERE AWAKENED BY A SOFT INTERRUPT>>   <<03041>>08180000
   END;                                                        <<03041>>08182000
END  <<PROCEDURE WAIT>>;                                                08184000
                                                                        08186000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS : AWAKE"                   08188000
PROCEDURE AWAKE (PCBPT,WAKECODE,WAITFLAGS);                             08190000
VALUE PCBPT,WAKECODE,WAITFLAGS;                                         08192000
INTEGER PCBPT,WAITFLAGS;                                                08194000
LOGICAL WAKECODE;                                                       08196000
OPTION PRIVILEGED,UNCALLABLE;                                           08198000
                                                                        08200000
COMMENT                                                                 08202000
                                                                        08204000
AWAKE IS CALLED TO AWAKEN A PROCESS ON A GIVEN EVENT TYPE.              08206000
THE CALLER MAY OPTIONALLY REQUEST THAT HE BE WAITED UPON                08208000
THE SUCCESSFUL ACTIVATION OF THE SPECIFIED PROCESS. THE                 08210000
AWAKENED PROCESS IS NOTIFIED OF THE ATTEMPTED AWAKE THROUGH             08212000
THE WAKE UP SEMAPHORES OF THE PCB.                                      08214000
                                                                        08216000
THE CONDITION CODE IS SET AS FOLLOWS:                                   08218000
   IF THE PROCESS IS ALREADY ACTIVE CC:=CCG.                            08220000
   IF THE PROCESS IS WAITING BUT NOT ON THE EVENT                       08222000
      TYPE SPECIFIED CC:=CCL.                                           08224000
   IF THE PROCESS IS WAITING ON THE SPECIFDIED EVENT                    08226000
      TYPE, CC:=CCE.                                                    08228000
;                                                                       08230000
                                                                        08232000
BEGIN                                                                   08234000
                                                                        08236000
INTEGER STATUS=Q-1,                                                     08238000
        PROCINX;                                                        08240000
LOGICAL EVENTMASK;                                                      08242000
DOUBLE SAVEDB;                                                          08244000
                                                                        08246000
TURNOFFTRAPS;                                                  <<01860>>08248000
                                                               <<01860>>08250000
PDISABLE;  <<CAUSE WE'LL PUT DB AT SYSDB FAST>>                         08252000
TOS:=%1000D;                                                            08254000
EXCHDB;                                                                 08256000
SAVEDB:=TOS;                                                            08258000
X:=PROCINX:=PCBPT+PCBSYSBASEINX;                                        08260000
EVENTMASK:=WAKECODE&CSL(4);                                             08262000
DISABLE;                                                                08264000
                                                                        08266000
IF (LOGICAL(PCBPT) LAND %17) <> 0 OR PQPTR = -1 THEN           <<02716>>08268000
    SUDDENDEATH(623);   <<INVALID OR UNASSIGNED>>              <<02716>>08270000
IF WAKECODE=MEMORYWAITCODE AND RESABORTINFO.SARFLAG THEN RETURN;<<CLK>> 08272000
IF WAKECODE <> MEMORYWAITCODE THEN                             <<02826>>08274000
EVENTFLAGS:=EVENTFLAGS LOR EVENTMASK;  <<EVENTS SINCE LAST CHECKED>>    08276000
IF (WAKEMASK LAND EVENTMASK) = 0 THEN                                   08278000
   BEGIN  <<PROCESS ISN'T WAITING FOR THIS EVENT>>                      08280000
   IF EVENTMASK.CRITEVENTFIELD <> 0 and wakecode <> impwaitcode         08282000
      THEN SUDDENDEATH(610);                                   <<01644>>08284000
   <<AWAKE FOR A CRITICAL EVENT WHICH THE                               08286000
     PROCESS WASN'T EXPECTING>>                                         08288000
   EVENTFLAGS.WWS:=1;                                                   08290000
   IF WAKEMASK.NONCRITEVENTFIELD = 0 THEN                               08292000
      BEGIN  <<PROCESS IS ACTIVE>>                                      08294000
      TOS:=SAVEDB;                                                      08296000
      EXCHDB;                                                           08298000
      PENABLE;                                                          08300000
      CC:=CCG;                                                          08302000
      TOS:=WAITFLAGS;                                                   08304000
      IF <> THEN WAIT(*,NOINFO);                                        08306000
      END                                                               08308000
   ELSE                                                                 08310000
      BEGIN                                                             08312000
      CC:=CCL;                                                          08314000
      TOS:=SAVEDB;                                                      08316000
      EXCHDB;                                                           08318000
      PENABLE;                                                          08320000
      END;                                                              08322000
   END                                                                  08324000
ELSE                                                                    08326000
   BEGIN <<PROCESS WAITING FOR THIS EVENT TYPE>>                        08328000
   CC:=CCE;                                                             08330000
   <<SET ORIGIN OF ACTIVATION>>                                         08332000
   TOS:=EVENTMASK.FATHERSONWAKEFLAGS;                                   08334000
   IF = THEN ASMB(DEL) ELSE PIINFONIMPPIN.OAFIELD:=TOS;                 08336000
   <<CLEAR WAKEMASK FLAGS CORRESPONDING TO EVENT TYPES OCCURRED>>       08338000
   TOS:=WAKEMASK XOR EVENTMASK; <<NO LONGER WAITING ON THIS>>           08340000
   WAKEMASK:=WAKEMASK LAND TOS;                                         08342000
   IF EVENTMASK.NONCRITEVENTFIELD <> 0                                  08344000
   THEN WAKEMASK.NONCRITEVENTFIELD:=0; <<ONLY NEEDS ONE OF THESE>>      08346000
   IF NOT WAKEMASK.IMPEDEDWAITFLAG                                      08348000
   AND NOT QUEUEINGINFO.DISPQFLAG                              <<01799>>08350000
   THEN QUEUEPROC(X,DISPATCHINGQ,ENDOFCLASS);                           08352000
   IF WAITFLAGS <> 0 THEN                                               08354000
      BEGIN << WAIT CALLER >>                                           08356000
      TOS:=SAVEDB;                                                      08358000
      EXCHDB;                                                           08360000
      PENABLE;                                                          08362000
      WAIT(WAITFLAGS,NOINFO);                                           08364000
      END                                                               08366000
   ELSE                                                                 08368000
      BEGIN                                                             08370000
      ENABLE;                                                           08372000
      DISABLE;                                                          08374000
      IF DISPTOAWAKEMSG.DISPRUNNINGFLAG THEN                            08376000
         BEGIN  <<DISPATCHER IS RUNNING>>                               08378000
         IF DISPTOAWAKEMSG.PAUSEDFLAG THEN                              08380000
            BEGIN <<DISPATCHER IS PAUSED>>                              08382000
            TOS:=SAVEDB;                                                08384000
            EXCHDB;                                                     08386000
            PENABLE;                                                    08388000
            ASMB (DISP);                                                08390000
            END                                                         08392000
         ELSE                                                           08394000
            BEGIN                                                       08396000
            X:=PROCINX;                                                 08398000
            TOS:=QUEUEINGINFO.PRIFIELD;                                 08400000
            IF AWAKETOSCHEDMSG <= LS0 THEN ASMB(DEL)                    08402000
            ELSE AWAKETOSCHEDMSG:=TOS;                                  08404000
            TOS:=SAVEDB;                                                08406000
            EXCHDB;                                                     08408000
            PENABLE;                                                    08410000
            END;                                                        08412000
         END                                                            08414000
      ELSE                                                              08416000
                                                               <<02827>>08418000
         <<There is a current process - consider preemption>>  <<02827>>08420000
         <<only if new process is in a more urgent queue or>>  <<02827>>08422000
         <<if dispatcher has specifically enabled preemption>> <<02827>>08424000
         <<Then preemption will be based on priority>>         <<02827>>08426000
         BEGIN  <<Should we preempt curr proc?>>               <<02827>>08428000
         IF DISPTOAWAKEMSG.PREEMPTOKFLAG OR                    <<02827>>08430000
         DISPTOAWAKEMSG.CURPROCQUEUE < QUEUEINGINFO.QUEUEFIELD <<02827>>08432000
         THEN      <<preempt ok flag set or>>                  <<02827>>08434000
            BEGIN  <<curr proc queue less urgent than new q?>> <<02827>>08436000
            IF QUEUEINGINFO.PRIFIELD <                         <<02827>>08438000
                  DISPTOAWAKEMSG.CURPROCPRI THEN               <<02827>>08440000
               BEGIN <<really more urgent?, yes!>>             <<02827>>08442000
               IF GCLASSENABLEDMASK.CLASS0 THEN                         08444000
                  BEGIN  <<MEASURE PREEMPTION EVENT>>                   08446000
                  TOS:=MEASSTATXDSBANK;                                 08448000
                  TOS:=MEASSTATXDSBASE;                                 08450000
                  TOS:=TOS+C0SUB0'SEGRELOFF+C'PREEMPT;         <<RAY.V>>08452000
                  ASMB(LSEA);                                           08454000
                  TOS:=TOS+1;                                           08456000
                  ASMB(SSEA;DDEL);                                      08458000
                  END;                                                  08460000
               IF GCLASSENABLEDMASK.CLASS15 THEN               <<01812>>08462000
                  BEGIN <<PROCESS LEVEL PREEMPTION>>           <<01812>>08464000
                  TOS:=MEASPROCXDSBANK;                        <<01812>>08466000
                  TOS:=MEASPROCXDSBASE;                        <<01812>>08468000
                  TOS:=TOS+((ABS(CPCB)-ABS(PCBP))/PCBSIZE)*    <<01812>>08470000
                       CLASS15'SUB0SIZE+CP'STOPPREEMPTED;      <<01812>>08472000
                  ASMB(LSEA);                                  <<01812>>08474000
                  TOS:=TOS+1;                                  <<01812>>08476000
                  ASMB(SSEA;DDEL);                             <<01812>>08478000
                  END;                                         <<01812>>08480000
      <<STUFF AWAY REASON STOPPED IN PCBX OF IMPEDED PROCESS>> <<01812>>08482000
      <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>  <<01812>>08484000
               WAITTODISPMSG.PREEMPTEDFLAG:=1;                 <<04774>>08486000
               TOS:=SAVEDB;                                             08490000
               EXCHDB;                                                  08492000
               PENABLE;                                                 08494000
               ASMB(DISP);                                              08496000
               END                                                      08498000
            ELSE                                                        08500000
               BEGIN                                                    08502000
               TOS:=SAVEDB;                                             08504000
               EXCHDB;                                                  08506000
               PENABLE;                                                 08508000
               END;                                                     08510000
            END                                                         08512000
         ELSE                                                           08514000
            BEGIN <<CURRENT PROCESS NOT PREEMPTABLE>>                   08516000
            TOS:=SAVEDB;                                                08518000
            EXCHDB;                                                     08520000
            PENABLE;                                                    08522000
            END;                                                        08524000
         END;                                                           08526000
      END;                                                              08528000
   END;                                                                 08530000
END  <<AWAKE>>;                                                         08532000
                                                                        08534000
$PAGE "PROCESS CONTROL UNCALLABLE INTRINSICS"                           08536000
                                                                        08538000
PROCEDURE IMPEDE(PCBPT);                                                08540000
VALUE PCBPT;                                                            08542000
INTEGER PCBPT;                                                          08544000
OPTION PRIVILEGED, UNCALLABLE;                                          08546000
                                                                        08548000
COMMENT                                                                 08550000
ELIMINATE CALLS TO THIS PROCEDURE. REPLACE WITH CALLS                   08552000
TO WAIT WITH A SPECIFIC WAIT EVENT TYPE.                                08554000
;                                                                       08556000
                                                                        08558000
BEGIN                                                                   08560000
IF PCBPT = 0 THEN                                                       08562000
   BEGIN <<IMPEDING SELF>>                                              08564000
   TOS:=0D;                                                             08566000
   TOS.IMPTRAPFLAG:=1;                                                  08568000
   WAIT(*,*);                                                           08570000
   END                                                                  08572000
ELSE                                                                    08574000
   BEGIN <<IMPEDING SOMEONE ELSE!>>                                     08576000
   DISABLE;                                                             08578000
   PCB(PCBPT+WAKEMASKWORDNUM).IMPEDEDWAITFLAG:=1;                       08580000
   ENABLE;                                                              08582000
   END;                                                                 08584000
END  <<PROCEDURE IMPEDE>>;                                              08586000
                                                                        08588000
                                                                        08590000
PROCEDURE BUMPQPRI(HOLDERPIN,HEADPIN);                                  08592000
VALUE HOLDERPIN,HEADPIN;                                                08594000
INTEGER HOLDERPIN,HEADPIN;                                              08596000
OPTION PRIVILEGED,UNCALLABLE;                                           08598000
                                                                        08600000
BEGIN                                                                   08602000
                                                                        08604000
INTEGER MYPRI;                                                          08606000
INTEGER NEXTPIN;                                                        08608000
DOUBLE SAVEDB;                                                          08610000
INTEGER MYPIN;                                                          08612000
                                                                        08614000
SUBROUTINE BUMPPRI;                                                     08616000
BEGIN                                                                   08618000
X:=NEXTPIN*PCBSIZE+PCBSYSBASEINX;                                       08620000
RESABORTINFO.HOLDIMPPRIFLAG:=1;                                         08622000
IF INTEGER(QUEUEINGINFO).PRIFIELD > MYPRI THEN                          08624000
   BEGIN                                                                08626000
   QUEUEINGINFO.PRIFIELD:=MYPRI;                                        08628000
   IF QUEUEINGINFO.DISPQFLAG THEN                                       08630000
   QUEUEPROC(X,DISPATCHINGQ,ENDOFQUEUE);                                08632000
   END;                                                                 08634000
END;                                                                    08636000
                                                                        08638000
DISABLE;                                                                08640000
TOS:=%1000D;                                                            08642000
ASMB(XCHD);                                                             08644000
SAVEDB:=TOS;                                                            08646000
                                                                        08648000
MYPRI:=ABSOLUTE(ABSOLUTE(CPCB)+QUEUEINGINFOWORDNUM).PRIFIELD;           08650000
MYPIN:=(ABSOLUTE(CPCB)-ABSOLUTE(PCBP))/PCBSIZE;                         08652000
NEXTPIN:=HOLDERPIN;                                                     08654000
BUMPPRI;                                                                08656000
NEXTPIN:=HEADPIN;                                                       08658000
DO                                                                      08660000
   BEGIN                                                                08662000
   IF HEADPIN=MYPIN THEN NEXTPIN:=MYPIN ELSE                            08664000
      BEGIN                                                             08666000
      BUMPPRI;                                                          08668000
      X:=NEXTPIN*PCBSIZE+PCBSYSBASEINX;                                 08670000
      NEXTPIN:=PIINFONIMPPIN.NIMPPINFIELD;                              08672000
      END;                                                              08674000
   END                                                                  08676000
UNTIL NEXTPIN=MYPIN;                                                    08678000
TOS:=SAVEDB;                                                            08680000
ASMB(XCHD);                                                             08682000
END  <<BUMPQPRI>>;                                                      08684000
                                                                        08686000
                                                                        08688000
                                                                        08690000
PROCEDURE IMPAIRED(HOLDER'SPIN,RESINDEX,P3);                            08692000
VALUE HOLDER'SPIN,RESINDEX,P3;                                          08694000
INTEGER HOLDER'SPIN,RESINDEX,P3;                                        08696000
OPTION PRIVILEGED,UNCALLABLE;                                           08698000
                                                                        08700000
BEGIN                                                                   08702000
INTEGER HOLDER'SPRI,                                                    08704000
        IMPEDER'SPRI;                                                   08706000
INTEGER POINTER RESPOINTER;                                             08708000
                                                                        08710000
@RESPOINTER:=RESINDEX;                                                  08712000
BUMPQPRI(HOLDER'SPIN,RESPOINTER(1).(8:8));                              08714000
IMPEDE(0);                                                              08716000
END;                                                                    08718000
                                                                        08720000
PROCEDURE UNIMPEDE(PCBPT);                                              08722000
VALUE PCBPT;                                                            08724000
INTEGER PCBPT;                                                          08726000
OPTION PRIVILEGED,UNCALLABLE;                                           08728000
                                                                        08730000
BEGIN                                                                   08732000
AWAKE(PCBPT,IMPWAITCODE,NOWAIT);                                        08734000
END  <<PROCEDURE UNIMPEDE>>;                                            08736000
                                                                        08738000
                                                                        08740000
PROCEDURE DELAY(INTERVAL);                                              08742000
VALUE INTERVAL;                                                         08744000
DOUBLE INTERVAL;                                                        08746000
OPTION PRIVILEGED,UNCALLABLE;                                           08748000
                                                                        08750000
COMMENT                                                                 08752000
                                                                        08754000
DELAY GETS AN ENTRY IN THE TIMER REQUEST LIST ON BAHALF                 08756000
OF THE CALLING PROCESS, AND WAITS THE CALLING PROCESS                   08758000
UNTIL THE ENTRY IS SERVICED.  THIS WILL OCCUR IN                        08760000
(INTERVAL +/- 100) MS.                                                  08762000
                                                                        08764000
;                                                                       08766000
                                                                        08768000
BEGIN                                                                   08770000
INTEGER PCBPT;                                                          08772000
LOGICAL SAVECRITICAL;                                                   08774000
                                                                        08776000
DISABLE;                                                                08778000
PCBPT:=ABSOLUTE(CPCB)-ABSOLUTE(PCBP);                                   08780000
SAVECRITICAL:=SETCRITICAL;                                              08782000
TOS:=TIMEREQ(5,PCBPT,INTERVAL);                                         08784000
<<                                                                      08786000
TOS:=TIMERWAITCODE                                                      08788000
TOS:=0                                                                  08790000
TOS.TRANSCOMPFLAG:=1                                                    08792000
WAIT(*,*)                                                               08794000
>>                                                                      08796000
IMPEDE(0);                                                              08798000
ENABLE;                                                                 08800000
ABORTTIMEREQ(*);                                                        08802000
RESETCRITICAL(SAVECRITICAL);                                            08804000
END <<PROCEDURE DELAY>>;                                                08806000
LOGICAL PROCEDURE TIMEOUT(DELAY,ALLOWSOFTINT);                 <<03041>>08808000
VALUE DELAY,ALLOWSOFTINT;                                               08810000
                                                                        08812000
<<FUNCTION                                                              08814000
  DELAYS A PROCESS FOR N MILLISECONDS.>>                                08816000
                                                                        08818000
<<INPUT>>                                                               08820000
  DOUBLE                                                                08822000
    DELAY;               <<# MILLISECONDS TO DELAY, -1D IMPLIES         08824000
                           INFINITY>>                                   08826000
  LOGICAL                                                               08828000
    ALLOWSOFTINT;        <<TRUE - SOFT INTERRUPTS OR CONTROL Y MAY      08830000
                                  ABORT THE TIMEOUT                     08832000
                           FALSE- WAIT FOR THE ENTIRE DURATION>>        08834000
                                                                        08836000
<<OUTPUT                                                                08838000
    TIMEOUT                REASON FOR RETURNING                         08840000
                           0 - TIMEOUT OCCURRED                         08842000
                           1 - NO TRLX ENTRIES AVAILABLE                08844000
                           2 - CONTROL Y/SOFT INTERRUPT IS PENDING>>    08846000
                                                                        08848000
OPTION PRIVILEGED,UNCALLABLE;                                           08850000
                                                                        08852000
   BEGIN                                                                08854000
   LOGICAL                                                              08856000
      DONE;                                                             08858000
   INTEGER                                                              08860000
      PCBPT,PCBXLOC,TRLX:=0,RESULT:=TIMEOUTOCCURRED,DELAY0=DELAY,       08862000
      DELAY1=DELAY+1;                                                   08864000
   LOGICAL                                                              08866000
      SPECIALINFO;                                                      08868000
   DEFINE                                                               08870000
      INFINITY    = -1D#;                                               08872000
   EQUATE                                                               08874000
      TIMEOUTCODE = 10,                                                 08876000
      TIMEOUTWAIT = -%10,                                               08878000
      ALLOWSOFT   = %10000,                                             08880000
      LONGWAIT    = 1;                                                  08882000
                                                                        08884000
                                                                        08886000
   SUBROUTINE TEXIT(RETURNVALUE);                                       08888000
   VALUE RETURNVALUE;                                                   08890000
   INTEGER RETURNVALUE;                                                 08892000
      BEGIN                                                             08894000
      TIMEOUT:=RETURNVALUE;                                             08896000
      IF GLOBALTRACEFLAG THEN                                           08898000
         MMSTAT(MMTIMEOUT,RETURNVALUE,DELAY0,DELAY1);                   08900000
      ASMB(EXIT 3);                                                     08902000
      END;  <<TEXIT>>                                                   08904000
   <<INITIALIZE>>                                                       08906000
   SPECIALINFO:=LONGWAIT+(IF ALLOWSOFTINT THEN ALLOWSOFT ELSE 0);       08908000
   PXFIXED;                                                             08910000
   PCBPT:=ABS(CPCB)-ABS(PCBP);                                          08912000
                                                                        08914000
   IF DELAY <> 0D THEN                                                  08916000
      BEGIN                                                             08918000
      IF DELAY <> INFINITY THEN                                         08920000
         BEGIN  <<USER DESIRES A DELAY>>                                08922000
         DISABLE;                                                       08924000
         IF NOT CHEKTRLFREE THEN                                        08926000
            BEGIN                                                       08928000
            ENABLE;                                                     08930000
            TEXIT(TRLXEXHAUSTED);                                       08932000
            END;                                                        08934000
         PXTIMEOUTRLX:=TRLX:=TIMEREQ(TIMEOUTCODE,PCBPT,DELAY);          08936000
         ENABLE;                                                        08938000
         END;                                                           08940000
                                                                        08942000
      <<WAIT LOOP>>                                                     08944000
      DO                                                                08946000
         BEGIN  <<DO UNTIL TIMEOUT/SOFT INT PENDING>>                   08948000
         DONE:=TRUE;                                                    08950000
         WAIT(TIMEOUTWAIT,SPECIALINFO);                                 08952000
         IF > THEN                                                      08954000
            RESULT:=SOFTINTOCCURRED                                     08956000
         ELSE                                                           08958000
            BEGIN  <<CHECK IF WAIT RETURNED BECAUSE OF PCB WWS>>        08960000
            IF TRLX=0 OR TRL((4*TRLX)+1) <> 0 THEN                      08962000
               DONE:=FALSE;  <<ANOTHER EVENT SET THE WWS>>              08964000
            END                                                         08966000
         END UNTIL DONE;                                                08968000
                                                                        08970000
      <<RETURN THE TIMER REQUEST ENTRY>>                                08972000
      IF TRLX <> 0 THEN                                                 08974000
         BEGIN                                                          08976000
         PDISABLE;  <<PSEUDO DISABLE SO THAT CAN'T BE ABORTED>>         08978000
         ABORTTIMEREQ(TRLX);                                            08980000
         PXTIMEOUTRLX:=0;                                               08982000
         PENABLE;                                                       08984000
         END;                                                           08986000
      END;                                                              08988000
                                                                        08990000
   TEXIT(RESULT);                                                       08992000
   END;  <<TIMEOUT>>                                                    08994000
$PAGE "RESOURCE EXCLUSION AND PROTECTION : SET / RESET CRITICAL"        08996000
                                                                        08998000
                                                                        09000000
                                                                        09002000
LOGICAL PROCEDURE SETCRITICAL;                                          09004000
OPTION PRIVILEGED,UNCALLABLE;                                  <<01696>>09006000
                                                                        09008000
COMMENT                                                                 09010000
SETCRITICAL SETS THE FLAG IN THE PCB WHICH KEEP THE PROCESS             09012000
FROM BEING ABORTED.  THE VALUE OF SETCRITICAL RETURNED TO THE           09014000
CALLER INDICATES WHETHER THE PROCESS WAS ALREADY IN A CRITICAL          09016000
STATE, AND THIS VALUE MUST BE RETURNED WHEN RESETCRITICAL IS            09018000
CALLED SO THAT THE PROCESS MAY BE PROTECTED EVEN THOUGH NESTED          09020000
CALLS TO SETCRITICAL MAY HAVE BEEN MADE.                                09022000
;                                                                       09024000
                                                                        09026000
BEGIN                                                                   09028000
DISABLE;                                                                09030000
SETCRITICAL:=ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM).CRITFLAG;     09032000
ABSOLUTE(X).CRITFLAG:=1;                                                09034000
END;  <<PROCEDURE SETCRITICAL>>                                         09036000
                                                                        09038000
PROCEDURE RESETCRITICAL(OLDCRITICAL);                                   09040000
VALUE OLDCRITICAL;                                                      09042000
LOGICAL OLDCRITICAL;                                                    09044000
OPTION PRIVILEGED,UNCALLABLE;                                           09046000
                                                                        09048000
                                                                        09050000
COMMENT                                                                 09052000
RESETCRITICAL RESTORES THE PROCESS TO AN ABORTABLE STATE                09054000
UNLESS THE PROCESS HAD NESTED CALLS TO SETCRITICAL.  IF                 09056000
AN ABORT IS PENDING AGAINST THE PROCESS AND IT IS NO                    09058000
LONGER CRITICAL, PSEUDOINT IS CALLED.                                   09060000
;                                                                       09062000
                                                                        09064000
BEGIN                                                                   09066000
INTEGER PCBRESABORTABSADDR;                                             09068000
IF NOT OLDCRITICAL THEN                                                 09070000
   BEGIN                                                                09072000
   DISABLE;                                                             09074000
   X:=PCBRESABORTABSADDR:=ABSOLUTE(CPCB)+RESABORTINFOWORDNUM;           09076000
   ABSOLUTE(X).CRITFLAG:=0;                                             09078000
   ABSOLUTE(X).HOLDIMPPRIFLAG:=0;                                       09080000
   IF LOGICAL(ABSOLUTE(X)).PIOVRFLAG THEN                               09082000
      BEGIN                                                             09084000
      IF NOT LOGICAL(ABSOLUTE(X)).HASSIRFLAG THEN                       09086000
         BEGIN                                                          09088000
         ABSOLUTE(PCBRESABORTABSADDR).PIOVRFLAG:=0;                     09090000
         IF ICS(-ICS'PDISCNTCELL) > 0                                   09092000
         OR STATUS.(1:1) = 0 <<PDISABLED OR DISABLED>>                  09094000
         THEN ASMB(DISP) <<DELAY SERVICE TILL NEXT LAUNCH>> ELSE        09096000
            BEGIN                                                       09098000
            X:=ABSOLUTE(CPCB)+PROCSTATEWORDNUM;                         09100000
            IF LOGICAL(ABSOLUTE(X)).HYBERNATEFLAG                       09102000
            OR LOGICAL(ABSOLUTE(X)).STOPFLAG THEN ASMB(DISP) ELSE       09104000
               BEGIN                                                    09106000
               PDISABLE;                                                09108000
               ENABLE;                                                  09110000
               PSEUDOINT;                                               09112000
               END;                                                     09114000
            END;                                                        09116000
         END;                                                           09118000
      END;                                                              09120000
   IF ABSOLUTE(X:=ABSOLUTE(4)+PROCSTATEWORDNUM).STOVFLAG = 1            09122000
   AND NOT LOGICAL(ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM <<04486>>09124000
   )).STOVABORTFLAG                                            <<04486>>09126000
   AND NOT LOGICAL(ABSOLUTE(ABSOLUTE(CPCB)+STKINFOWORDNUM))             09128000
   .INSYSTEMFLAG AND NOT LOGICAL(ABSOLUTE(ABSOLUTE(CPCB)+               09130000
   RESABORTINFOWORDNUM)).HASSIRFLAG THEN                                09132000
      BEGIN <<WAS DISABLED OR PDISABLED WHEN OVERFLOWED, NOT IN SYSTEM>>09134000
      ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM)             <<04486>>09136000
         .STOVABORTFLAG := 1;   << PROCESSING ABORT FOR STOV >><<04486>>09138000
      ABORT([8/1,8/4],0,0);                                    <<04486>>09140000
      END;                                                              09142000
   END;                                                                 09144000
END  <<PROCEDURE RESETCRITICAL>>;                                       09146000
                                                                        09148000
$PAGE "RESOURCE EXCLUSION AND PROTECTION : GET SIR"                     09150000
                                                                        09152000
INTEGER PROCEDURE GETSIR(SIRNUMBER);                                    09154000
VALUE SIRNUMBER;                                                        09156000
INTEGER SIRNUMBER;                                                      09158000
OPTION PRIVILEGED,UNCALLABLE;                                           09160000
                                                                        09162000
COMMENT                                                                 09164000
                                                                        09166000
GETSIR IS CALLED TO OBTAIN EXCLUSIVE ACCESS TO A RESOURCE WHICH         09168000
IS PROTECTED BY THE QUEUEING SEMAPHORE PASSED AS PARAMETER.  IF         09170000
THE SIR IS BUSY, THE PROCESS IS QUEUED BY PRIORITY THROUGH A            09172000
DOUBLY LINKED LIST STRUNG THROUGH PCB ENTRIES.  IF THE HOLDER OF        09174000
THE RESOURCE IS OF LESS URGENT PRIORITY THAN THE REQUESTOR, THE         09176000
HOLDER'S PRIORITY IS TEMPORARILY BUMPED UNTIL HE RELEASES THE           09178000
RESOURCE.                                                               09180000
                                                                        09182000
THE RETURN VALUE INDICATES WHETHER THE PROCESS ALREADY HOLDS A          09184000
SIR, AND WHETHER THE CALLER ALREADY HOLDS THE SIR IT'S CURRENTLY        09186000
REQUESTING.  THIS VALUE SHOULD BE SAVED AND PASSED ALONG TO             09188000
RELSIR SO THAT PROPER ACCOUNTING CAN BE MAINTAINED.                     09190000
                                                                        09192000
   GETSIR = 1 ==> PROCESS ALREADY HELD SOME SIR                         09194000
   GETSIR = 3 ==> PROCESS ALREDAY HOLDS THE SIR ITS REQUESTING          09196000
   GETSIR = 0 ==> PROCESS IS ACQUIRING ITS FIRST SIR                    09198000
                                                                        09200000
;                                                                       09202000
                                                                        09204000
BEGIN                                                                   09206000
INTEGER SIRTABINX,                                                      09208000
        QUEUELENGTH,                                                    09210000
        REQPCBPT,                                                       09212000
        REQPIN,                                                         09214000
        REQPRI,                                                         09216000
        REQPROCINX,                                                     09218000
        HOLDERPIN,                                                      09220000
        HEADPIN,                                                        09222000
        HEADPROCINX,                                                    09224000
        PREVPIN,                                                        09226000
        PREVPROCINX,                                                    09228000
        NEXTPIN,                                                        09230000
        NEXTPROCINX;                                                    09232000
DOUBLE SAVEDB;                                                          09234000
INTEGER SIRN=SIRNUMBER;                                                 09236000
                                                                        09240000
TURNOFFTRAPS;                                                  <<01860>>09242000
                                                               <<01860>>09244000
TOS:=ABSOLUTE(CPCB)-ABSOLUTE(PCBP);                                     09246000
REQPCBPT:=S0;                                                           09248000
REQPIN:=TOS/PCBSIZE;                                                    09250000
PDISABLE;                                                      <<01846>>09252000
HOLDERPIN:=SIRTAB(X:=SIRTABINX:=SIRNUMBER*SIRTABENTRYLENGTH).(0:8);     09254000
IF HOLDERPIN=REQPIN THEN                                       <<01846>>09256000
   BEGIN <<REQUESTOR ALREADY HOLDS SIR>>                       <<01846>>09258000
   GETSIR:=3; <<SO WE CAN DISTINGUISH AT RELEASE TIME>>        <<01846>>09260000
   PENABLE;                                                    <<01846>>09262000
   END                                                         <<01846>>09264000
ELSE                                                           <<01846>>09266000
   BEGIN  <<GO FOR IT>>                                        <<01846>>09268000
   TOS:=PCB(REQPCBPT+RESABORTINFOWORDNUM);                              09270000
   ASSEMBLE(TBC HASSIRBIT);                                             09272000
   IF <> THEN GETSIR:=1  <<INDICATES PROC ALREADY HELD A SIR>>          09274000
   ELSE GETSIR:=0;                                                      09276000
   IF HOLDERPIN = 0 THEN                                                09278000
      BEGIN  <<SIR IS AVAILABLE>>                                       09280000
      <<                                                                09282000
      IF SIRN < %50 THEN                                                09284000
         BEGIN                                                          09286000
         TOS:=%1000D;ASMB(XCHD);X:=SIRN*6+700+1;MEASBUF(X):=TIMER;      09288000
         X:=SIRN*6+700+5;                                               09290000
         MEASBUF(X):=MEASBUF(X)+1D;                                     09292000
         ASMB(XCHD;DDEL);                                               09294000
         END;                                                           09296000
      >>                                                                09298000
      SIRTAB(X:=SIRTABINX):=REQPIN&LSL(8);                              09300000
      PCB(REQPCBPT+RESABORTINFOWORDNUM).HASSIRFLAG:=1;                  09302000
      PENABLE;                                                          09304000
      END                                                               09306000
   ELSE                                                                 09308000
      BEGIN <<SIR IS BUSY, SO PROCESS MUST QUEUE FOR IT>>               09310000
      TOS:=%1000D;                                                      09312000
      X:=REQPROCINX:=ABSOLUTE(CPCB)-S0;                                 09314000
      ASSEMBLE(XCHD); <<FOR FAST ADDRESSING>>                           09316000
      SAVEDB:=TOS;                                                      09318000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  09320000
         BEGIN  <<MEASURE SIR BLOCK PROCESS STOP EVENT>>                09322000
         TOS:=MEASSTATXDSBANK;                                          09324000
         TOS:=MEASSTATXDSBASE;                                          09326000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPSIR;                  <<RAY.V>>09328000
         ASMB(LSEA);                                                    09330000
         TOS:=TOS+1;                                                    09332000
         ASMB(SSEA;DDEL);                                               09334000
         END;                                                           09336000
      <<                                                                09338000
      X:=SIRN*6+700+4;IF SIRN < %50 THEN                                09340000
      MEASBUF(X):=MEASBUF(X)+1D;  #BUSY SIR STOPS ON THIS SIR           09342000
      >>                                                                09344000
      X:=REQPROCINX;                                                    09346000
      REQPRI:=QUEUEINGINFO.PRIFIELD;                                    09348000
      QUEUELENGTH:=SIRTAB(SIRTABINX).(8:8)+1; <<BUMP Q LENGTH>>         09350000
      SIRTAB(X).(8:8):=QUEUELENGTH;                                     09352000
      HEADPIN:=SIRTAB(X:=X+1).(8:8);                                    09354000
      IF = THEN                                                         09356000
         BEGIN <<QUEUE IS EMPTY>>                                       09358000
         TOS:=REQPIN;                                                   09360000
         TOS.(0:8):=REQPIN; <<REQ AT HEAD AND TAIL>>                    09362000
         SIRTAB(X):=TOS;                                                09364000
         <<                                                             09366000
         IF SIRN < %50 THEN                                             09368000
            BEGIN                                                       09370000
            X:=SIRN*6+700;                                              09372000
            MEASBUF(X):=TIMER;                                          09374000
            END;                                                        09376000
         >>                                                             09378000
         X:=REQPROCINX;                                                 09380000
         PIINFONIMPPIN.NIMPPINFIELD:=0;                                 09382000
         PIMPPINBKLINK.(0:8):=0;                                        09384000
         END                                                            09388000
      ELSE                                                              09390000
         BEGIN    <<MUST MERGE INTO QUEUE>>                    <<02873>>09392000
         HEADPROCINX:=X:=HEADPIN*PCBSIZE+PCBSYSBASEINX;                 09394000
         WHILE X<>0 AND INTEGER(QUEUEINGINFO.PRIFIELD)<=REQPRI <<02873>>09396000
         DO                                                    <<02873>>09398000
           BEGIN                                               <<02873>>09400000
           TOS := PIINFONIMPPIN.NIMPPINFIELD;                  <<02873>>09402000
           IF = THEN ASMB(DEL, ZROX)                           <<02873>>09404000
           ELSE X:=TOS*PCBSIZE+PCBSYSBASEINX;                  <<02873>>09406000
           END;                                                <<02873>>09408000
         IF X = 0 THEN                                         <<02873>>09410000
            BEGIN   <<QUEUE TO TAIL>>                          <<02873>>09412000
            TOS:=SIRTAB(SIRTABINX+1);                                   09414000
            TOS:=S0.(0:8);                                              09416000
            PREVPIN:=S0;                                                09418000
            PREVPROCINX:=TOS*PCBSIZE+PCBSYSBASEINX;                     09420000
            TOS.(0:8):=REQPIN;                                          09422000
            SIRTAB(X:=SIRTABINX+1):=S0;                                 09424000
            X:=PREVPROCINX;                                             09426000
            PIINFONIMPPIN.(8:8):=REQPIN;                                09428000
            X:=REQPROCINX;                                              09430000
            PIMPPINBKLINK.(0:8):=PREVPIN;                               09432000
            PIINFONIMPPIN.NIMPPINFIELD:=0;                              09434000
            END                                                <<02873>>09438000
         ELSE                                                  <<02873>>09440000
            BEGIN    <<MUST INSERT>>                           <<02873>>09442000
            IF X = HEADPROCINX THEN                            <<02873>>09444000
               BEGIN    <<NEW HEAD>>                           <<02873>>09446000
               PIMPPINBKLINK.PIMPPINFIELD:=REQPIN;             <<02873>>09448000
               X:=REQPROCINX;                                  <<02873>>09450000
               PIINFONIMPPIN.NIMPPINFIELD:=HEADPIN;            <<02873>>09452000
               PIMPPINBKLINK.(0:8):=0;                         <<02873>>09454000
               SIRTAB(SIRTABINX+1).(8:8):=REQPIN;              <<02873>>09456000
               END                                             <<02873>>09458000
            ELSE                                               <<02873>>09460000
               BEGIN    <<INSERT IN FRONT OF X>>               <<02873>>09462000
               PREVPIN:=PIMPPINBKLINK.PIMPPINFIELD;            <<02873>>09464000
               PIMPPINBKLINK.PIMPPINFIELD:=REQPIN;             <<02873>>09466000
               X:=PREVPIN*PCBSIZE+PCBSYSBASEINX;               <<02873>>09468000
               NEXTPIN:=PIINFONIMPPIN.NIMPPINFIELD;            <<02873>>09470000
               PIINFONIMPPIN.NIMPPINFIELD:=REQPIN;             <<02873>>09472000
               X:=REQPROCINX;                                  <<02873>>09474000
               PIINFONIMPPIN.NIMPPINFIELD:=NEXTPIN;            <<02873>>09476000
               PIMPPINBKLINK.PIMPPINFIELD:=PREVPIN;            <<02873>>09478000
               END;                                            <<02873>>09480000
            END;                                               <<02873>>09482000
         END;                                                  <<02873>>09484000
      <<BUMP HOLDER'S PRIORITY?>>                              <<02873>>09486000
      X:=HOLDERPIN*PCBSIZE+PCBSYSBASEINX;                      <<02873>>09488000
      IF NOT QUEUEINGINFO.LSCHEDFLAG THEN                      <<02873>>09490000
         BEGIN                                                 <<02873>>09492000
         DISABLE;                                              <<02873>>09494000
         RESABORTINFO.HOLDSIRPRIFLAG:=1;                       <<02873>>09496000
         IF INTEGER(QUEUEINGINFO.PRIFIELD) > REQPRI THEN       <<02873>>09498000
            BEGIN                                              <<02873>>09500000
            QUEUEINGINFO.PRIFIELD:=REQPRI;                     <<02873>>09502000
            IF QUEUEINGINFO.DISPQFLAG                          <<02873>>09504000
            THEN QUEUEPROC(X,DISPATCHINGQ,ENDOFQUEUE);         <<02873>>09506000
            END;                                               <<02873>>09508000
         END;                                                           09510000
      TOS:=SAVEDB;                                                      09512000
      ASMB(XCHD);                                                       09514000
      WAIT(SIRWAITCODE,NOINFO);                                         09516000
      END;                                                              09518000
   END;                                                                 09520000
END  <<PROCEDURE GETSIR>>;                                              09522000
                                                                        09524000
                                                                        09526000
$PAGE "RESOURCE EXCLUSION AND PROTECTION : RELEASE SIR"                 09528000
                                                                        09530000
PROCEDURE RELSIR(SIRNUMBER,SAVEDVALUE);                                 09532000
VALUE SIRNUMBER,SAVEDVALUE;                                             09534000
INTEGER SIRNUMBER,SAVEDVALUE;                                           09536000
OPTION PRIVILEGED,UNCALLABLE;                                           09538000
                                                                        09540000
                                                                        09542000
COMMENT                                                                 09544000
                                                                        09546000
RELSIR RELEASES THE ACCESS LOCK TO THE SYSTEM RESOURCE PROTECTED        09548000
BY THE QUEUEING SEMAPHORE PASSED AS PARAMETER.  THE VALUE RETURNED      09550000
FROM GETSIR IS PASSED ALONG AS PARAMETER, AND IS USED TO DETERMINE      09552000
IF THE PROCESS HAD NESTED CALLS TO THE SAME SIR (IN WHICH CASE THE      09554000
SIR LOCK IS NOT RELEASED) AND WHETHER THE PROCESS IS RELEASING          09556000
ITS LAST SIR (IN WHICH CASE IT CAN FIELD NASTY PSEUDO-INTERRUPTS        09558000
WHICH COULD RESULT IN THE PROCESS BEING ABORTED).                       09560000
                                                                        09562000
THE RESOURCE IS GIVEN TO THE HEAD OF THE SIR QUEUE, WHICH IS THE        09564000
MOST URGENT PROCESS WAITING ON THE SIR DUE TO THE QUEUE'S PRIORITY      09566000
STRUCTURE.                                                              09568000
                                                                        09570000
IF THE PROCESS HAD ITS PRIORITY BUMPED DUE TO MORE URGENT PROCESSES     09572000
QUEUEING FOR THE RESOURCE, THE NEXT RESCHEDULING WILL PUT IT BACK       09574000
WHERE IT BELONGS.                                                       09576000
                                                                        09578000
;                                                                       09580000
                                                                        09582000
BEGIN                                                                   09584000
INTEGER SIRTABINX,                                                      09586000
        HEADPIN,                                                        09588000
        HEADPROCINX,                                                    09590000
        TAILPIN,                                                        09592000
        TAILPROCINX,                                                    09594000
        RELPIN,                                                         09596000
        RELPCBPT,                                                       09598000
        RELPROCINX,                                                     09600000
        PREVPIN,                                                        09602000
        PREVPROCINX,                                                    09604000
        NEXTPIN,                                                        09606000
        NEXTPROCINX;                                                    09608000
INTEGER QLENGTH;                                                        09610000
INTEGER SIRN=SIRNUMBER;                                                 09612000
                                                               <<01860>>09614000
TURNOFFTRAPS;                                                  <<01860>>09616000
                                                               <<01860>>09618000
IF SAVEDVALUE <> 3  THEN                                                09620000
   BEGIN <<PROCESS SHOULD GIVE UP THE SIR>>                             09622000
   PDISABLE;                                                            09624000
   TOS:=ABSOLUTE(CPCB)-ABSOLUTE(PCBP);                                  09626000
   RELPCBPT:=S0;                                                        09628000
   TOS:=TOS/PCBSIZE;                                                    09630000
   RELPIN:=S0;                                                          09632000
   TOS:=SIRTAB(SIRTABINX:=SIRNUMBER*SIRTABENTRYLENGTH).(0:8);           09634000
   ASSEMBLE(CMP);                                                       09636000
   IF <> THEN ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM)              09638000
            .HASSIRFLAG:=SAVEDVALUE ELSE                                09640000
      BEGIN <<CALLER HAD THE SIR>>                                      09642000
      SIRTAB(X).(0:8):=0;                                               09644000
      <<GIVE THE SIR TO THE HEAD OF THE QUEUE>>                         09646000
      TOS:=SIRTAB(X:=SIRTABINX+1);                                      09648000
      IF = THEN                                                         09650000
         BEGIN <<QUEUE EMPTY-MEAS END OF BUSY INTERVAL>>                09652000
            <<                                                          09654000
         IF SIRN < %50 THEN                                             09656000
            BEGIN                                                       09658000
            TOS:=%1000D;                                                09660000
            ASMB(XCHD);                                                 09662000
            X:=700+SIRN*6+1;                                            09664000
            TOS:=TIMER-MEASBUF(X);                                      09666000
            X:=700+SIRN*6+2;                                            09668000
            MEASBUF(X):=MEASBUF(X)+TOS;                                 09670000
            ASMB(XCHD;DDEL);                                            09672000
            END;                                                        09674000
            >>                                                          09676000
         END                                                            09678000
      ELSE                                                              09680000
         BEGIN  <<QUEUE IS NON-EMPTY>>                                  09682000
         HEADPIN:=S0.(8:8); <<NEW HOLDER'S PIN>>                        09684000
         HEADPROCINX:=HEADPIN*PCBSIZE;                                  09686000
         TAILPIN:=S0&LSR(8);                                            09688000
         QLENGTH:=SIRTAB(SIRTABINX).(8:8)-1;                            09690000
         TOS:=HEADPIN&LSL(8);                                           09692000
         TOS.(8:8):=QLENGTH;                                            09694000
         SIRTAB(X):=TOS;                                                09696000
            <<                                                          09698000
         IF SIRN < %50 AND HEADPIN=TAILPIN THEN                         09700000
            BEGIN                                                       09702000
            TOS:=%1000D;                                                09704000
            ASMB(XCHD);                                                 09706000
            X:=700+SIRN*6;                                              09708000
            TOS:=TIMER-MEASBUF(X);                                      09710000
            X:=700+SIRN*6+3;                                            09712000
            MEASBUF(X):=MEASBUF(X)+TOS;                                 09714000
            ASMB(XCHD;DDEL);                                            09716000
            END;                                                        09718000
            >>                                                          09720000
         IF HEADPIN=TAILPIN THEN SIRTAB(SIRTABINX+1):=0 ELSE            09722000
            BEGIN <<MORE THAN ONE IN QUEUE>>                            09724000
            TOS:=PCB(HEADPROCINX+PIINFONIMPPINWORDNUM).NIMPPINFIELD;    09726000
            SIRTAB(SIRTABINX+1).(8:8):=S0; <<NEW HEAD>>                 09728000
            PCB(S0*PCBSIZE+PIMPPINBKLINKWORDNUM).PIMPPINFIELD:=0;       09730000
            END;                                                        09732000
         PCB(HEADPROCINX+PIINFONIMPPINWORDNUM).NIMPPINFIELD:=0;         09734000
         X:=ABSOLUTE(PCBP)+RESABORTINFOWORDNUM+HEADPROCINX;             09736000
         ABSOLUTE(X).HASSIRFLAG:=1;                                     09738000
         ABSOLUTE(X).HOLDSIRPRIFLAG:=1;                                 09740000
         AWAKE(HEADPIN*PCBSIZE,SIRWAITCODE,NOWAIT);                     09742000
         END;                                                           09744000
      IF NOT LOGICAL(SAVEDVALUE) THEN                                   09746000
         BEGIN <<PROCESS GIVING UP ITS LAST SIR>>                       09748000
         TOS:=ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM);             09750000
         TOS.HOLDSIRPRIFLAG:=0;                                         09752000
         TOS.HASSIRFLAG:=0;                                             09754000
         ABSOLUTE(X):=S0;                                               09756000
         ASSEMBLE(TBC PIOVRBIT);                                        09758000
         IF <> THEN                                                     09760000
            BEGIN                                                       09762000
            ASSEMBLE(TBC CRITBIT);                                      09764000
            IF = THEN                                                   09766000
               BEGIN                                                    09768000
               ABSOLUTE(ABSOLUTE(CPCB)+RESABORTINFOWORDNUM)             09770000
               .PIOVRFLAG:=0;                                           09772000
               IF ICS(-ICS'PDISCNTCELL) > 1                             09774000
               OR STATUS.(1:1) = 0 <<PDISABLED OR DISABLED>>            09776000
               THEN ASMB(DISP) <<DELAY SERVICE TILL NEXT LAUNCH>> ELSE  09778000
                  BEGIN                                                 09780000
                  X:=ABSOLUTE(CPCB)+PROCSTATEWORDNUM;                   09782000
                  IF LOGICAL(ABSOLUTE(X)).HYBERNATEFLAG                 09784000
                  OR LOGICAL(ABSOLUTE(X)).STOPFLAG THEN ASMB(DISP) ELSE 09786000
                     BEGIN                                              09788000
                     ENABLE;                                            09790000
                     PSEUDOINT;                                         09792000
                     PDISABLE;                                          09794000
                     END;                                               09796000
                  END;                                                  09798000
               END;                                                     09800000
            END;                                                        09802000
         END;                                                           09804000
      END;                                                              09806000
   PENABLE;                                                             09808000
   END;                                                                 09810000
END  <<PROCEDURE RELSIR>>;                                              09812000
                                                                        09814000
                                                                        09816000
                                                                        09818000
$PAGE "DB MANIPULATION PROCEDURES"                                      09820000
                                                                        09822000
COMMENT                                                                 09824000
                                                                        09826000
DB MAY BE PLACED AT THE STACK DB, THE BASE OF AN EXTRA DATA SEGMENT,    09828000
OR AT AN ABSOLUTE LOCATION.                                             09830000
                                                                        09832000
TO PLACE DB AT SYSDB, CALL PROCEDURE SETSYSDB, THEN CALL RESETDB        09834000
PASSING THE VALUE RETURNED BY SETSYSDB IN ORDER TO RESTORE THE          09836000
PREVIOUS ENVIRONMENT.                                                   09838000
                                                                        09840000
TO PLACE DB AT AN ABSOLUTE LOCATION IN BANK 0 OTHER THAN AT SYS DB,     09842000
FIRST CALL SETSYSDB, THEN CALL RESETDB WITH THE DESIRED VALUE.          09844000
WHEN DONE, CALL RESETDB WITH THE VALUE RETURNED FROM                    09846000
SETSYSDB.                                                               09848000
                                                                        09850000
TO PLACE DB AT A SPECIFIC DATA SEGMENT, CALL EXCHANGEDB SUPPLYING       09852000
THE DESIRED DATA SEGMENT'S NUMBER (0 IF CALLER'S STACK).  SAVE THE      09854000
VALUE RETURNED AND SUPPLY THIS ON THE CALL TO EXCHANGEDB WHICH IS TO    09856000
RESTORE THE PREVIOUS ENVIRONMENT.                                       09858000
                                                                        09860000
;                                                                       09862000
$PAGE "DB MANIPULATION PROCEDURES : SETSYSDB"                           09864000
LOGICAL PROCEDURE SETSYSDB;                                             09866000
OPTION PRIVILEGED,UNCALLABLE;                                           09868000
                                                                        09870000
COMMENT                                                                 09872000
SETSYSDB LOADS THE DB REGISTER WITH THE SYSBASE VALUE AND               09874000
SETS A FLAG IN THE CALLING PROCESS' PCB TO INDICATE THAT                09876000
DB POINTS AT AN ABSOLUTE LOCATION.                                      09878000
                                                                        09880000
SETSYSDB RETURNS A VALUE WHICH THE CALLER SHOULD SAVE AND PASS AS       09882000
PARAMETER TO RESETDB SO THAT THE PREVIOUS ENVIRONMENT MAY BE            09884000
PROPERLY RESTORED.  THE RETURNED VALUE IS -1 IF DB WAS NOT              09886000
ALREADY SET TO AN ABSOLUTE LOCATION, AND IS THE PREVIOUS DB VALUE       09888000
IF DB WAS AT AN ABSOLUTE LOCATION.                                      09890000
                                                                        09892000
;                                                                       09894000
                                                                        09896000
BEGIN                                                                   09898000
PDISABLE;                                                               09900000
TOS:=ABSOLUTE(ABSOLUTE(CPCB)+DBXDSINFOWORDNUM);                         09902000
TOS.ABSDBFLAG :=1;                                                      09904000
ABSOLUTE(X):=TOS;                                                       09906000
IF = THEN                                                               09908000
   BEGIN                                                                09910000
   TOS:=0;                                                              09912000
   TOS:=SYSBASE;                                                        09914000
   EXCHDB;                                                              09916000
   SETSYSDB:=-1;                                                        09918000
   END                                                                  09920000
ELSE                                                                    09922000
   BEGIN <<ALREADY AT AN ABS LOCATION>>                                 09924000
   TOS:=0;                                                              09926000
   TOS:=SYSBASE;                                                        09928000
   ASMB(XCHD);                                                          09930000
   SETSYSDB:=TOS;                                                       09932000
   END;                                                                 09934000
PENABLE;                                                                09936000
END <<PROCEDURE SETSYSDB>>;                                             09938000
$PAGE "DB MANIPULATION PROCEDURES : RESETDB"                            09940000
                                                                        09942000
PROCEDURE RESETDB(WHERE);                                               09944000
VALUE WHERE;                                                            09946000
INTEGER WHERE;                                                          09948000
OPTION PRIVILEGED,UNCALLABLE;                                           09950000
                                                                        09952000
COMMENT                                                                 09954000
                                                                        09956000
RESETDB IS CALLED AFTER CALLING SETSYSDB TO RESTORE DB TO THE           09958000
VALUE THAT WAS EXPECTED UPON CALLING SETSYSDB.                          09960000
                                                                        09962000
THE VALUE RETURNED BY SETSYSDB SHOULD BE SUPPLIED AS THE                09964000
PARAMETER FOR RESETDB.                                                  09966000
                                                                        09968000
;                                                                       09970000
                                                                        09972000
BEGIN                                                                   09974000
INTEGER DSTNUMBER;                                                      09976000
                                                               <<01860>>09978000
TURNOFFTRAPS;                                                  <<01860>>09980000
                                                               <<01860>>09982000
TOS:=WHERE;                                                             09984000
IF = THEN SUDDENDEATH(611);                                    <<01644>>09986000
IF S0 <> -1 THEN                                                        09988000
   BEGIN <<PUT PASSED VALUE INTO DB>>                                   09990000
   TOS:=0;                                                              09992000
   ASMB(XCH;XCHD);                                                      09994000
   END                                                                  09996000
ELSE                                                                    09998000
   BEGIN  <<DB BACK TO PCB'S DBINFO>>                                   10000000
   DISABLE;<<PDIS IN MULIT-CPU>>                                        10002000
                                                                        10004000
   CHECKAGAIN:                                                          10006000
                                                                        10008000
   TOS:=ABSOLUTE(ABSOLUTE(CPCB)+DBXDSINFOWORDNUM);                      10010000
   TOS.ABSDBFLAG:=0;                                                    10012000
   ABSOLUTE(X):=S0;                                                     10014000
   DSTNUMBER:=TOS.XDSDSTFIELD;                                          10016000
   IF <> THEN                                                           10018000
      BEGIN <<XDS>>                                                     10020000
      IF LOGICAL(DST(DSTNUMBER&LSL(2))).ABSENTFLAG THEN                 10022000
         BEGIN <<CLOCK ATE IT UP>>                                      10024000
          QUEUEONSEGMENT(DSTNUMBER);                                    10026000
          GO CHECKAGAIN;                                                10028000
          END;                                                          10030000
      DST(X).REFERENCEDFLAG:=1;                                         10032000
      TOS:=DST(X:=X+2);                                                 10034000
      TOS:=DST(X:=X+1);                                                 10036000
      END                                                               10038000
   ELSE                                                                 10040000
      BEGIN  <<GOES BACK TO STK>>                                       10042000
      TOS:=ICS(-ICS'STKBANKCELL);                                       10044000
      TOS:=ICS(X:=X+1);                                                 10046000
      END;                                                              10048000
   ASMB(XCHD);                                                          10050000
   END;                                                                 10052000
END  <<PROCEDURE RESETDB>>;                                             10054000
                                                                        10056000
$PAGE "DB MANIPULATION PROCEDURES : EXCHANGEDB"                         10058000
LOGICAL PROCEDURE EXCHANGEDB(WHERE);                                    10060000
VALUE WHERE;                                                            10062000
INTEGER WHERE;                                                          10064000
OPTION PRIVILEGED,UNCALLABLE;                                           10066000
                                                                        10068000
                                                                        10070000
COMMENT                                                                 10072000
                                                                        10074000
EXCHANGEDB IS CALLED TO PUT DB AT THE BASE OF A DATA SEGMENT            10076000
OR TO RETURN DB TO THE CALLER'S STACK DB.  THE DESTINATION DATA         10078000
SEGMENT NUMBER IS SUPPLIED AS PARAMETER IF NOT RETURNING TO THE         10080000
STACK.  IF RETURNING TO THE STACK, SUPPLY 0 AS PARAMETER.               10082000
                                                                        10084000
EXCHANGEDB RETURNS THE DST NUMBER OF WHERE DB WAS (0 IF STACK).         10086000
THIS VALUE MAY BE SAVED AND RETURNED ON THE NEXT CALL TO EXCHANGEDB     10088000
TO RESTORE THE PREVIOUS ENVIRONMENT.                                    10090000
                                                                        10092000
;                                                                       10094000
                                                                        10096000
BEGIN                                                                   10098000
                                                                        10100000
LOGICAL DELTAP=Q-2;                                            <<01571>>10102000
LOGICAL STATUS=Q-1;                                            <<01571>>10104000
INTEGER PROCINX,                                                        10106000
        SEGIDENT,                                                       10108000
        DESCSTINX;                                                      10110000
                                                                        10112000
TURNOFFTRAPS;                                                  <<01860>>10114000
                                                               <<01860>>10116000
PDISABLE;                                                               10118000
<<MMSTAT(24,WHERE,DELTAP,STATUS);>>                            <<01679>>10120000
CPUNUM;                                                        <<04663>>10122000
IF TOS= SERIES64 THEN UPDATE'ICS'XDSEGBNKCELL;                 <<04663>>10124000
TOS:=%1000D;                                                            10126000
ASMB(XCHD);  <<FOR FAST ADDRESSING>>                                    10128000
PROCINX:=X:=ABSOLUTE(CPCB)-SYSBASE;                                     10130000
TOS:=DBXDSINFO;                                                         10132000
IF < THEN SUDDENDEATH(611); <<MUST RESET FIRST>>               <<01644>>10134000
EXCHANGEDB:=TOS.XDSDSTFIELD;                                            10136000
TOS:=WHERE;                                                             10138000
TOS.(0:1):=0;  <<DISCARD CLEAN BIT>>                                    10140000
DBXDSINFO.XDSDSTFIELD:=S0;                                              10142000
SEGIDENT:=S0;                                                           10144000
IF = THEN                                                               10146000
   BEGIN  <<DB GOES TO STK>>                                            10148000
   TOS:=ICS(-ICS'STKBANKCELL);                                          10150000
   TOS:=ICS(X:=X+1);                                                    10152000
   ASMB(XCHD);                                                          10154000
   END                                                                  10156000
ELSE                                                                    10158000
   BEGIN <<GOING TO AN XDS>>                                            10160000
      IF DST(0) < S0 THEN SUDDENDEATH(611); <<OUT OF RANGE>>   <<01644>>10162000
   DISABLE;                                                             10164000
   IF NOT LOGICAL(DST(DESCSTINX:=TOS&LSL(2))).ABSENTFLAG THEN           10166000
      BEGIN  <<NEW DB SEG IS PRESENT>>                                  10168000
      CPUNUM;           << GET CPU NUMBER >>                   <<04663>>10170000
      IF TOS= SERIES64 THEN                                    <<04663>>10172000
                                                               <<04663>>10174000
        BEGIN                                                  <<04663>>10176000
        GET'XDSEG'LIMITS;                                      <<04663>>10178000
        XFER'XDSEG'LIMITS;                                     <<04663>>10180000
        END;                                                   <<04663>>10182000
                                                               <<04663>>10184000
      TOS:=DST(X:=X+2);                                                 10186000
      TOS:=DST(X:=X+1);                                                 10188000
      ASMB(XCHD);                                                       10190000
      END                                                               10192000
   ELSE                                                                 10194000
      BEGIN <<NOT PRESENT>>                                             10196000
      ENABLE;                                                           10198000
      IF LOGICAL(DST(X:=X+1)).ROCFLAG THEN                              10200000
         BEGIN                                                          10202000
         IF GCLASSENABLEDMASK.CLASS0 THEN                               10204000
            BEGIN  <<MEASURE RECOVERY OF DATA SEG BY PROCESS>>          10206000
            TOS:=MEASSTATXDSBANK;                                       10208000
            TOS:=MEASSTATXDSBASE;                                       10210000
            TOS:=TOS+C0SUB0'SEGRELOFF+C'DATARECOVERY;          <<RAY.V>>10212000
            ASMB(LSEA);                                                 10214000
            TOS:=TOS+1;                                                 10216000
            ASMB(SSEA;DDEL);                                            10218000
            END;                                                        10220000
         RECOVEROC(SEGIDENT,DESCSTINX);                                 10222000
         END                                                            10224000
      ELSE                                                              10226000
         BEGIN  <<REALLY ABSENT>>                                       10228000
         IF GCLASSENABLEDMASK.CLASS0 THEN                               10230000
            BEGIN  <<MEASURE TRAP ON DATA SEG>>                         10232000
            TOS:=MEASSTATXDSBANK;                                       10234000
            TOS:=MEASSTATXDSBASE;                                       10236000
            TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPDATAFAULT;         <<RAY.V>>10238000
            ASMB(LSEA);                                                 10240000
            TOS:=TOS+1;                                                 10242000
            ASMB(SSEA;DDEL);                                            10244000
            END;                                                        10246000
         IF GCLASSENABLEDMASK.CLASS15 THEN                     <<01812>>10248000
            BEGIN <<PROCESS LEVEL DST FAULT>>                  <<01812>>10250000
            TOS:=MEASPROCXDSBANK;                              <<01812>>10252000
            TOS:=MEASPROCXDSBASE;                              <<01812>>10254000
            TOS:=TOS+((ABS(CPCB)-ABS(PCBP))/PCBSIZE)*          <<01812>>10256000
                 CLASS15'SUB0SIZE+CP'STOPDSTFAULT;             <<01812>>10258000
            ASMB(LSEA);                                        <<01812>>10260000
            TOS:=TOS+1;                                        <<01812>>10262000
            ASMB(SSEA;DDEL);                                   <<01812>>10264000
            END;                                               <<01812>>10266000
      <<STUFF AWAY REASON STOPPED IN PCBX OF IMPEDED PROCESS>> <<01812>>10268000
      <<DONE UNCONDITIONALLY FOR HISTORY FOR MEAS INTERFACE>>  <<01812>>10270000
      TOS:=ICS(-ICS'STKBANKCELL);                              <<01812>>10272000
      TOS:=ICS(-ICS'STKBASECELL);                              <<01812>>10274000
      TOS:=TOS+SBTOMEASSTOPREASON;                             <<01812>>10276000
      TOS:=STOPSEGFAULT;                                       <<01812>>10278000
      ASMB(SSEA;DDEL);                                         <<01812>>10280000
         QUEUEONSEGMENT(SEGIDENT);                                      10282000
         PDISABLE;                                                      10284000
         END;                                                           10286000
         X:= DESCSTINX;    << SET X = TO DST ENTRY >>          <<04663>>10288000
         CPUNUM;           << GET CPU NUMBER >>                <<04663>>10290000
         IF TOS= SERIES64 THEN                                 <<04663>>10292000
                                                               <<04663>>10294000
           BEGIN                                               <<04663>>10296000
           GET'XDSEG'LIMITS;                                   <<04663>>10298000
           XFER'XDSEG'LIMITS;                                  <<04663>>10300000
           END;                                                <<04663>>10302000
                                                               <<04663>>10304000
      TOS:= DST(X:= X+2);                                      <<04663>>10306000
      TOS:=DST(X:=X+1);                                                 10308000
      ASMB(XCHD);                                                       10310000
      END;                                                              10312000
   DST(DESCSTINX).REFERENCEDFLAG:=1;                                    10314000
   END;                                                                 10316000
PENABLE;                                                                10318000
END  <<PROCEDURE EXCHANGEDB>>;                                          10320000
$PAGE "DB MANIPULATION PROCEDURES : CHANGEDB"                  <<04324>>10322000
double procedure changedb(newdb);                              <<04324>>10324000
value                     newdb ;                              <<04324>>10326000
double                    newdb ;                              <<04324>>10328000
option privileged, uncallable;                                 <<04324>>10330000
begin                                                          <<04324>>10332000
                                                               <<04324>>10334000
COMMENT --George R. O'Connor. HP Boise Division (11/20/81).    <<04324>>10336000
                                                               <<04324>>10338000
Purpose:  Performs  an extended EXCHANGEDB  to handle DB being <<04324>>10340000
set to an absolute address, in bank zero.                      <<04324>>10342000
                                                               <<04324>>10344000
Error   reporting:   No  error  reporting  occurs  explicitly. <<04324>>10346000
SUDDENDEATH's  may result from some  of the KERNELC procedures <<04324>>10348000
which are called.                                              <<04324>>10350000
                                                               <<04324>>10352000
External references:                                           <<04324>>10354000
                     exchangedb                                <<04324>>10356000
                    ,fixed low memory                          <<04324>>10358000
                    ,pcb                                       <<04324>>10360000
                    ,resetdb                                   <<04324>>10362000
                    ,setsysdb                                  <<04324>>10364000
                                                               <<04324>>10366000
Input:                                                         <<04324>>10368000
     newdb  := A double word value which indicates where DB is <<04324>>10370000
to  be set to.  If newdb < 0d  then DB will be set to the data <<04324>>10372000
segment number -newdb.  If newdb = 0d then DB will be returned <<04324>>10374000
to  the process's stack location.  If  newdb = 1d then DB will <<04324>>10376000
be  returned  to the data segment or  stack location it was at <<04324>>10378000
before  being set to an absolute location.  If newdb > 1d then <<04324>>10380000
DB  will  be set to the absolute  address of newdb.  Note that <<04324>>10382000
this  permits  DB  to be set to  absolute locations outside of <<04324>>10384000
bank zero.                                                     <<04324>>10386000
                                                               <<04324>>10388000
Output:                                                        <<04324>>10390000
    changedb  :=  The  value which the  caller should save and <<04324>>10392000
pass  back to changedb so that the previous environment may be <<04324>>10394000
properly  restored.   If  DB  was  at  the  stack  then  0d is <<04324>>10396000
returned.   If  DB was set to the  base of a data segment then <<04324>>10398000
the negative data segment number is returned.  If DB was at an <<04324>>10400000
absolute  location  then  the  absolute  address  location  is <<04324>>10402000
returned.                                                      <<04324>>10404000
                                                               <<04324>>10406000
Side effects:                                                  <<04324>>10408000
     The  dbxdsinfo word of the  current process control block <<04324>>10410000
may be changed.                                                <<04324>>10412000
                                                               <<04324>>10414000
Special considerations:                                        <<04324>>10416000
     Highly privileged.                                        <<04324>>10418000
;                                                              <<04324>>10420000
$PAGE "PROCEDURE: CHANGEDB;  LOCAL DECLARATIONS"               <<04324>>10422000
define                                                         <<04324>>10424000
                                                               <<04324>>10426000
       cpcb            = 4 # <<absolute address of the>>       <<04324>>10428000
                             <<current PCB>>                   <<04324>>10430000
      ,db'xds'info     = 2 #                                   <<04324>>10432000
;                                                              <<04324>>10434000
integer                                                        <<04324>>10436000
        x               = x                                    <<04324>>10438000
;                                                              <<04324>>10440000
logical                                                        <<04324>>10442000
        db'is'absolute                                         <<04324>>10444000
;                                                              <<04324>>10446000
$PAGE "DB MANIPULATION PROCEDURES : CHANGEDB"                  <<04324>>10448000
                                                               <<04324>>10450000
<<Determine if db is at an absolute location.Also the x     >> <<04324>>10452000
<<register is set to point to the absolute address of the db>> <<04324>>10454000
<<xds information word (db'xds'info) in the current process >> <<04324>>10456000
<<control block (cpcb).  This is done for speed.            >> <<04324>>10458000
                                                               <<04324>>10460000
db'is'absolute := abs( abs( cpcb ) + db'xds'info ).absdbflag ; <<04324>>10462000
                                                               <<04324>>10464000
if newdb <= 0D then                                            <<04324>>10466000
                                                               <<04324>>10468000
<<newdb is a request for DB to be set to a data segment or  >> <<04324>>10470000
<<stack location.                                           >> <<04324>>10472000
                                                               <<04324>>10474000
  begin                                                        <<04324>>10476000
  if db'is'absolute then                                       <<04324>>10478000
                                                               <<04324>>10480000
<<Return absolute db and reset db to the valid data segment >> <<04324>>10482000
<<base or stack location and then exchangedb to the data    >> <<04324>>10484000
<<segment or stack reqested.                                >> <<04324>>10486000
                                                               <<04324>>10488000
    begin                                                      <<04324>>10490000
                                                               <<04324>>10492000
<<Return absolute db.                                       >> <<04324>>10494000
                                                               <<04324>>10496000
    push(db);                                                  <<04324>>10498000
    changedb := tos;                                           <<04324>>10500000
                                                               <<04324>>10502000
<<Reset db to a valid data segment base or stack location.  >> <<04324>>10504000
                                                               <<04324>>10506000
    resetdb(-1);                                               <<04324>>10508000
    exchangedb( - integer ( newdb ) );                         <<04324>>10510000
    end                                                        <<04324>>10512000
                                                               <<04324>>10514000
  else                                                         <<04324>>10516000
                                                               <<04324>>10518000
<<Return the inverted old data segment/stack number and >>     <<04324>>10520000
<<exchangedb to the data segment or stack requested.    >>     <<04324>>10522000
                                                               <<04324>>10524000
    changedb := double( - integer(                             <<04324>>10526000
                exchangedb( - integer( newdb ) ) ) );          <<04324>>10528000
  end                                                          <<04324>>10530000
else                                                           <<04324>>10532000
                                                               <<04324>>10534000
  if newdb = 1D then                                           <<04324>>10536000
                                                               <<04324>>10538000
<<newdb is a request for DB to be returned to the data >>      <<04324>>10540000
<<segment or stack location it was at before being set >>      <<04324>>10542000
<<to an absolute location.                             >>      <<04324>>10544000
                                                               <<04324>>10546000
    begin                                                      <<04324>>10548000
    if db'is'absolute then                                     <<04324>>10550000
                                                               <<04324>>10552000
<<Return the absolute db location and reset db to the  >>      <<04324>>10554000
<<data segment or stack location it was at before being>>      <<04324>>10556000
<<set to an absolute location.                         >>      <<04324>>10558000
                                                               <<04324>>10560000
      begin                                                    <<04324>>10562000
                                                               <<04324>>10564000
<<Return absolute db. >>                                       <<04324>>10566000
                                                               <<04324>>10568000
      push(db);                                                <<04324>>10570000
      changedb := tos;                                         <<04324>>10572000
                                                               <<04324>>10574000
<<reset db to the data segment or stack location it was >>     <<04324>>10576000
<<at before being set to an absolute location.          >>     <<04324>>10578000
                                                               <<04324>>10580000
      resetdb(-1);                                             <<04324>>10582000
      end                                                      <<04324>>10584000
                                                               <<04324>>10586000
    else                                                       <<04324>>10588000
                                                               <<04324>>10590000
<<The requester is at his request.  If the extra data >>       <<04324>>10592000
<<segment number is zero then db is at its stack.     >>       <<04324>>10594000
                                                               <<04324>>10596000
      changedb := double( - abs( x ) );                        <<04324>>10598000
    end                                                        <<04324>>10600000
                                                               <<04324>>10602000
  else                                                         <<04324>>10604000
                                                               <<04324>>10606000
<< newdb is a request for an absolute address db. >>           <<04324>>10608000
                                                               <<04324>>10610000
    begin                                                      <<04324>>10612000
    if db'is'absolute then                                     <<04324>>10614000
                                                               <<04324>>10616000
<<Set db to the absolute address requested and return the>>    <<04324>>10618000
<<old absolute address of db.                            >>    <<04324>>10620000
                                                               <<04324>>10622000
      begin                                                    <<04324>>10624000
      tos := newdb;                                            <<04324>>10626000
      asmb( xchd );                                            <<04324>>10628000
      changedb := tos;                                         <<04324>>10630000
      end                                                      <<04324>>10632000
    else                                                       <<04324>>10634000
                                                               <<04324>>10636000
<<Return the data segment number the caller is at. >>          <<04324>>10638000
<<Set db to an absolute location.                  >>          <<04324>>10640000
      begin                                                    <<04324>>10642000
                                                               <<04324>>10644000
<<Return the data segment number the caller is at. >>          <<04324>>10646000
                                                               <<04324>>10648000
      changedb := double( - abs( x ).xdsdstfield );            <<04324>>10650000
                                                               <<04324>>10652000
<<Mark that db is at an absolute location.         >>          <<04324>>10654000
                                                               <<04324>>10656000
      tos := abs( x );                                         <<04324>>10658000
      tos.absdbflag := true;                                   <<04324>>10660000
      abs( x ) := tos;                                         <<04324>>10662000
                                                               <<04324>>10664000
<<Set db to an absolute location.                  >>          <<04324>>10666000
                                                               <<04324>>10668000
      tos := newdb;                                            <<04324>>10670000
      asmb( xchd );                                            <<04324>>10672000
      end                                                      <<04324>>10674000
    end;                                                       <<04324>>10676000
                                                               <<04324>>10678000
end; <<changeDB>>                                              <<04324>>10680000
                                                                        10682000
$PAGE "MEMORY MANAGEMENT INTERFACING PROCEDURES : QUEUE ON SEGMENT"     10684000
PROCEDURE QUEUEONSEGMENT(SEGIDENT);                                     10686000
VALUE SEGIDENT;                                                         10688000
LOGICAL SEGIDENT;                                                       10690000
OPTION PRIVILEGED,UNCALLABLE;                                           10692000
                                                                        10694000
COMMENT                                                                 10696000
                                                                        10698000
QUEUEONSEGMENT IS CALLED FROM ABSENT TRAP HANDLERS AND OTHER            10700000
PLACES WHERE THE CURRENT PROCESS NEEDS A SEGMENT BUT DOES NOT           10702000
WANT TO CALL A PROCEDURE IN THE SEGMENT. THE PROCESS'S MEMORY           10704000
REQUEST POINTER IN THE SLL IS SET TO AN SLL ENTRY FOR THE SEGMENT       10706000
VIA A CALL TO ADDTOLOCALITY. THE PROCESS WAITS ON A MEMORY WAIT.        10708000
                                                                        10710000
;                                                                       10712000
                                                                        10714000
BEGIN                                                                   10716000
INTEGER ARRAY DELTAQ(*) = Q-0;  <<FOR MMSTAT>>                 <<01571>>10718000
                                                                        10720000
PDISABLE;                                                               10722000
TOS:=%1000D;                                                            10724000
ASMB(XCHD);                                                             10726000
X:=ABSOLUTE(CPCB)-SYSBASE;                                              10728000
TOS:=SLLPTR;                                                            10730000
TOS:=SEGIDENT;                                                          10732000
TOS:=0;                                                                 10734000
TOS.SETMEMREQPTRFLAG:=1;                                                10736000
ADDTOLOCALITY(*,*,*);                                                   10738000
MMSTAT(0,SEGIDENT,SLLPTR,DELTAQ(-DELTAQ-1)); <<EVENT 0-QONSEG>><<04105>>10740000
ASMB(XCHD);                                                             10742000
WAIT(MEMORYWAITCODE,MEMTRAP);                                           10744000
END <<QUEUEONSEGMENT>>;                                                 10746000
INTEGER PROCEDURE CONVEXTLABELTODELTAP(EXTLABEL);                       10748000
VALUE EXTLABEL;                                                         10750000
INTEGER EXTLABEL;                                                       10752000
OPTION PRIVILEGED,UNCALLABLE;                                           10754000
                                                                        10756000
COMMENT                                                                 10758000
                                                                        10760000
CONVEXTLABELTODELTAP QUEUES THE CALLING PROCESS ON THE SEGMENT          10762000
INDICATED IN THE EXTLABEL, AND WHEN THE SEGMENT IS PRESENT LOOKS        10764000
UP THE DELTAP OF THE ENTRY POINT IN THE SEGMENT'S STT.                  10766000
                                                                        10768000
;                                                                       10770000
                                                                        10772000
BEGIN                                                                   10774000
                                                                        10776000
INTEGER DESCSTINX,                                                      10778000
        SEGIDENT,                                              <<01843>>10780000
        SEGNUMBER,                                                      10782000
        STTNUMBER,                                                      10784000
        CSTXEIX:=0;                                                     10786000
PDISABLE;                                                               10788000
SEGNUMBER:=EXTLABEL.(8:8);                                              10790000
STTNUMBER:=EXTLABEL.(1:7);                                              10792000
IF SEGNUMBER > %300 THEN                                                10794000
   BEGIN <<SEG IS IN CALLER'S CSTX>>                                    10796000
   SEGNUMBER:=SEGNUMBER-%300;                                           10798000
   CSTXEIX:=ABSOLUTE(ABSOLUTE(CPCB)+PBXWORDNUM);                        10800000
   DESCSTINX:=CSTXBLK(CSTXEIX)+SEGNUMBER&LSL(2);                        10802000
   END                                                                  10804000
ELSE DESCSTINX:=SEGNUMBER&LSL(2)+ABSOLUTE(SYSDFC);                      10806000
DISABLE;                                                                10808000
IF DST(DESCSTINX) < 0 THEN                                              10810000
   BEGIN <<SEGMENT ABSENT>>                                             10812000
   TOS:=SEGNUMBER;                                                      10814000
   IF CSTXEIX = 0 THEN TOS.SEGIDTYPEFIELD:=SEGIDSLTYPE ELSE             10816000
      BEGIN                                                             10818000
      TOS.SEGIDPBXFIELD:=CSTXEIX;                                       10820000
      TOS.SEGIDPBXFLAG:=1;                                              10822000
      END;                                                              10824000
   SEGIDENT:=TOS;                                              <<01843>>10826000
   DO                                                          <<01843>>10828000
      BEGIN <<QUEUE ON SEG TILL IT'S AROUND>>                  <<01843>>10830000
      QUEUEONSEGMENT(SEGIDENT);                                <<01843>>10832000
      PDISABLE;                                                <<01843>>10834000
      IF CSTXEIX <> 0 THEN DESCSTINX:=CSTXBLK(CSTXEIX)         <<01843>>10836000
         +SEGNUMBER&LSL(2); <<UPDATE DESCSTINX>>               <<01843>>10838000
      END                                                      <<01843>>10840000
   UNTIL NOT LOGICAL(DST(DESCSTINX)).ABSENTFLAG;               <<01843>>10842000
   END;                                                                 10844000
TOS:=DST(X:=DESCSTINX+2);                                               10846000
TOS:=DST(X:=X+1);                                                       10848000
TOS:=DST(X:=X-3).CODESIZEFIELD&LSL(2)-1;                                10850000
ASMB(LADD); <<ADDR OF PL>>                                              10852000
TOS:=TOS-STTNUMBER;                                                     10854000
ASMB(LSEA);                                                             10856000
TOS.(1:1):=0; <<UNCALLABLE BIT>>                                        10858000
CONVEXTLABELTODELTAP:=TOS;                                              10860000
PENABLE;                                                                10862000
END <<CONVEXTLABELTODELTAP>>;                                           10864000
                                                                        10866000
$PAGE "DEBUG BREAKPOINT SETTING PROCEDURE"                              10868000
                                                                        10870000
PROCEDURE SETSEGSBKPTS(SEGIDENT,DESCSTINX,BPTINX);                      10872000
VALUE SEGIDENT,DESCSTINX,BPTINX;                                        10874000
INTEGER SEGIDENT,DESCSTINX,BPTINX;                             <<01609>>10876000
OPTION PRIVILEGED,UNCALLABLE;                                           10878000
                                                                        10880000
COMMENT                                                        <<MM.IV>>10882000
                                                               <<MM.IV>>10884000
THIS PROCEDURE SETS BREAKPOINTS IN THE SPECIFIED SEGMENT.      <<MM.IV>>10886000
IT MUST BE CALLED PDISABLED.                                   <<MM.IV>>10888000
                                                               <<MM.IV>>10890000
    SEGIDENT:  STANDARD FORM OF SEG IDENTIFER                  <<01609>>10892000
    DESCSTINX: DST RELATIVE INDEX OF SEG                       <<01609>>10894000
    BPTINX:    PCB EXTENSION INDEX FOR THE BREAKPOINT TABLE    <<01609>>10896000
                                                               <<MM.IV>>10898000
;                                                              <<MM.IV>>10900000
                                                               <<MM.IV>>10902000
BEGIN                                                                   10904000
                                                                        10906000
INTEGER LIMIT;                                                 <<01609>>10908000
                                                                        10910000
<< CHECK WHETHER THERE ARE BREAKPOINTS TO SET >>               <<MM.IV>>10912000
IF BPTINX = 0 OR                                               <<MM.IV>>10914000
   BPTINX = SYS'BKPT'EXT'X AND NOT SYS'BKPT                    <<MM.IV>>10916000
THEN RETURN;                                                   <<MM.IV>>10918000
<< XCHDB TO BREAKPOINT TABLE   >>                              <<MM.IV>>10920000
<< TABLE BETTER BE PRESENT     >>                              <<MM.IV>>10922000
IF NOT BPT'TAB'LOCKED THEN SUDDENDEATH (199);                  <<MM.IV>>10924000
TOS := DST(BPT'DST'IND + 2);                                   <<MM.IV>>10926000
TOS := DST(X+1);                                               <<MM.IV>>10928000
ASMB( XCHD );                                                  <<MM.IV>>10930000
BPTINX := BPT(BPTINX);  << GET 1ST LINK >>                     <<MM.IV>>10932000
WHILE BPTINX <> 0 DO                                           <<MM.IV>>10934000
   BEGIN                                                                10936000
   IF BPT(BPTINX).BKPT'UPDATING=0 AND BPT(X:=BPTINX+1)=SEGIDENT<<01609>>10938000
   THEN                                                        <<MM.01>>10940000
      BEGIN                                                             10942000
      TOS:=BPT(X:=X-1);                                                 10944000
      ASMB(DEL);                                                        10946000
      IF >= THEN                                                        10948000
         BEGIN                                                          10950000
         TOS:=DST(X:=DESCSTINX+2);                                      10952000
         TOS:=DST(X:=X+1);                                              10954000
         TOS:=TOS+BPT(X:=BPTINX+2); <<DELTA P>>                         10956000
         ASMB(LSEA);                                                    10958000
         IF  TOS <> %36000  THEN                                        10960000
            BEGIN  << SAVE INSTRUCTION >>                               10962000
            BPT(X:=BPTINX).(3:1):=1;                                    10964000
            ASMB(LSEA);                                                 10966000
            BPT(X:=X+3):=TOS;                                           10968000
            TOS:=%36000;                                                10970000
            ASMB(SSEA);                                                 10972000
            END;                                                        10974000
         DDEL;                                                          10976000
         END;                                                           10978000
      END;                                                              10980000
   BPTINX:=BPT(BPTINX+4);                                      <<MM.IV>>10982000
   END;                                                                 10984000
ASMB( XCHD ); DDEL;          <<RESTORE DB>>                    <<MM.IV>>10986000
END  <<SETSEGSBKPTS>>;                                                  10988000
                                                                        10990000
$PAGE "KERNEL UTILITY PROCEDURES : GET DATA SEG CHANGE STATE"           10992000
PROCEDURE GETDATASEGCHANGESTATE(SEGNUM);                                10994000
VALUE SEGNUM;                                                           10996000
INTEGER SEGNUM;                                                         10998000
OPTION PRIVILEGED,UNCALLABLE;                                           11000000
                                                                        11002000
COMMENT                                                                 11004000
                                                                        11006000
CALLED FROM DLSIZE,ZSIZE,PXFILESIZE TO CLEAR ONGOING I/OS               11008000
FLAG ABSENT, PDISABLE.ALSO FROM THE STACKOVERFLOW INTERRUPT HANDLER.    11010000
                                                                        11012000
;                                                                       11014000
                                                                        11016000
BEGIN                                                                   11018000
                                                                        11020000
IF LOGICAL(DST(X:=SEGNUM&LSL(2)+1)).SEGRESIDENTFLAG THEN                11022000
   CC:=CCL ELSE                                                         11024000
   BEGIN                                                                11026000
   TOS:=DST(X:=X+1);                                                    11028000
   TOS:=DST(X:=X+1);                                                    11030000
   TOS:=TOS+RBTORASDISP;                                                11032000
   DISABLE;                                                    <<01770>>11034000
   PDISABLE;                                                   <<01770>>11036000
   ASMB(LSEA);                                                          11038000
   ASMB(TBC REGFZBIT);                                                  11040000
   IF <> THEN                                                  <<02060>>11042000
      BEGIN                                                    <<02060>>11044000
      CC := CCL;                                               <<02060>>11046000
      PENABLE;                                                 <<02060>>11048000
      END                                                      <<02060>>11050000
   ELSE                                                        <<02060>>11052000
      BEGIN                                                             11054000
      ASMB(TBC REGLKDBIT);                                              11056000
      IF <> THEN                                               <<02060>>11058000
         BEGIN                                                 <<02060>>11060000
         CC := CCL;                                            <<02060>>11062000
         PENABLE;                                              <<02060>>11064000
         END                                                   <<02060>>11066000
      ELSE                                                     <<02060>>11068000
         BEGIN                                                          11070000
         ASMB(TBC REGIOFZBIT);                                          11072000
         IF <> THEN                                                     11074000
            BEGIN                                                       11076000
            TOS.SIZECHANGEPNDGFLAG:=1;                                  11078000
            ASMB(SSEA);                                                 11080000
            TOS:=TOS+RASTOMPQLINKDISP;                                  11082000
            TOS:=ABSOLUTE(CPCB)-ABSOLUTE(PCBP);                         11084000
            ASMB(SSEA);                                                 11086000
            IMPEDE(0);                                                  11088000
            CC:=CCG;                                                    11090000
            END                                                         11092000
        ELSE                                                            11094000
            BEGIN                                                       11096000
            DST(X:=SEGNUM&LSL(2)).ABSENTFLAG:=1;                        11098000
            CC:=CCE;                                                    11100000
            END;                                                        11102000
         END;                                                           11104000
      END;                                                              11106000
   END;                                                                 11108000
END  <<GETDATASEGCHANGESTATE(SEGNUM)>>;                                 11110000
$PAGE "KERNEL UTILITY PROCEDURES : FLAG PROCESS ABSENT"                 11112000
                                                                        11114000
PROCEDURE FLAGPROCABSENT(PROCINX,SEGIDENT);                             11116000
VALUE PROCINX,SEGIDENT;                                                 11118000
INTEGER PROCINX,SEGIDENT;                                               11120000
OPTION PRIVILEGED,UNCALLABLE;                                           11122000
                                                                        11124000
COMMENT                                                                 11126000
                                                                        11128000
REQUIRED FOR DEGENERATE CASE OF PROCESS' MINIMAL LOCALITY DISAPPEARING  11130000
DUE TO CONSUMPTION BY SPECIAL LOCKING CODE, SEGMENT EXPANSIONS, OR      11132000
CONSUMPTION BY CLOCK ALGORITHM.                                         11134000
                                                                        11136000
;                                                                       11138000
                                                                        11140000
BEGIN                                                                   11142000
LOGICAL WORSTCPRI,                                             <<01941>>11144000
        WORSTDPRI,                                             <<01941>>11146000
        WORSTEPRI;                                             <<01941>>11148000
                                                                        11150000
<<ASSUMES DB ST SYSDB>>                                                 11152000
                                                                        11154000
X:=PROCINX;                                                             11156000
IF SEGIDENT<>0 THEN                                            <<01788>>11158000
ADDTOLOCALITY(SLLPTR,SEGIDENT,0);                                       11160000
DISABLE;                                                                11162000
X:=SLLPTR;                                                              11166000
SLLSCHEDTOIOMSG.SLLSTARTOVERFLAG:=1;                           <<04484>>11168000
SLLSCHEDTOIOMSG.SLLSWAPREQFLAG:=1;                                      11170000
X:=PROCINX;                                                             11172000
WAKEMASK.MEMORYWAITFLAG:=1;                                             11174000
RESABORTINFO.SARFLAG:=1;                                                11176000
IF = THEN                                                               11178000
   BEGIN  <<PROCESS NOT ALREADY WAITING ON MEMORY>>                     11180000
   IF NOT PROCSTATE.SYSTEMPROCFLAG AND NOT QUEUEINGINFO.LSCHEDFLAG THEN 11182000
      BEGIN <<MAKE PRI ADJ SINCE SCHED ATTN NO LONGER REQ>>    <<01941>>11184000
      WORSTCPRI:=ICS(-ICS'WORSTCPRICELL);                      <<01941>>11186000
      WORSTDPRI:=ICS(-ICS'WORSTDPRICELL);                      <<01941>>11188000
      WORSTEPRI:=ICS(-ICS'WORSTEPRICELL);                      <<01941>>11190000
      X:=PROCINX;                                              <<01941>>11192000
      IF QUEUEINGINFO.CSCHEDFLAG AND QUEUEINGINFO.PRIFIELD<>WORSTCPRI   11194000
      OR QUEUEINGINFO.DSCHEDFLAG AND QUEUEINGINFO.PRIFIELD<>WORSTDPRI   11196000
      OR QUEUEINGINFO.ESCHEDFLAG AND QUEUEINGINFO.PRIFIELD<>WORSTEPRI   11198000
      THEN                                                     <<01941>>11200000
         BEGIN <<MAKE PROCESS MORE URGENT>>                    <<01941>>11202000
         QUEUEINGINFO.PRIFIELD:=QUEUEINGINFO.PRIFIELD+1;       <<01941>>11204000
         IF QUEUEINGINFO.DISPQFLAG                             <<01941>>11206000
         THEN QUEUEPROC(PROCINX,DISPATCHINGQ,FRONTOFCLASS);    <<01941>>11208000
         END;                                                  <<01941>>11210000
      END;                                                     <<01941>>11212000
   END;                                                        <<01941>>11214000
END  <<FLAGPROCABSENT>>;                                       <<01941>>11216000
$TITLE "KERNEL UTILITY PROCEDURES : GENERATE SPECIAL REQUEST"           11218000
PROCEDURE GENSPECREQ(DSTNUM,NEWSIZE,READDISP,MOVELENGTH);               11220000
VALUE DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                               11222000
INTEGER DSTNUM,NEWSIZE,READDISP,MOVELENGTH;                             11224000
OPTION PRIVILEGED,UNCALLABLE;                                           11226000
                                                                        11228000
COMMENT                                                                 11230000
                                                                        11232000
USED FOR BUFFERING THE INFORMATION REQUIRED TO EFFECT A SIZE CHANGE     11234000
FOR DATA SEGMENTS AND ANY INTERNAL PCBX MOVES.                          11236000
                                                                        11238000
AN ENTRY FROM THE SPECIAL REQUEST TABLE IS OBTAINED, FILLED IN          11240000
WITH THE PASSED INFORMATION, AND LINKED TO THE HEAD OF THE              11242000
QUEUE OF PENDING REQUESTS.                                              11244000
                                                                        11246000
;                                                                       11248000
                                                                        11250000
BEGIN                                                                   11252000
                                                                        11254000
DOUBLE SAVEDB;                                                          11256000
                                                                        11258000
INTEGER ENTRYINDEX;                                                     11260000
                                                                        11262000
DISABLE;                                                                11264000
TOS:=%1000D;                                                            11266000
ASMB(XCHD);                                                             11268000
SAVEDB:=TOS;                                                            11270000
ENTRYINDEX:=GETSYSTABENTRY(SPECREQTABSYSBASEINX);                       11272000
IF ENTRYINDEX=0 THEN SUDDENDEATH(600);   <<SPEC REQ TAB CONFTOO SMALL>> 11274000
                                                                        11276000
<<LINK TO HEAD OF SPECIAL REQ Q>>                                       11278000
                                                                        11280000
TOS:=SPECQHEAD;                                                         11282000
SPECQHEAD:=ENTRYINDEX;                                                  11284000
                                                                        11286000
<<FILL IN ENTRY>>                                                       11288000
                                                                        11290000
X:=ENTRYINDEX;                                                          11292000
ENTRYWORD00:=TOS;   <<ATTACH REST OF QUEUE>>                            11294000
ENTRYWORD01:=DSTNUM;                                                    11296000
ENTRYWORD02:=NEWSIZE;                                                   11298000
ENTRYWORD03:=READDISP;                                                  11300000
ENTRYWORD04:=MOVELENGTH;                                                11302000
TOS:=SAVEDB;                                                            11304000
ASMB(XCHD);                                                             11306000
END  <<GENSPECREQ>> ;                                                   11308000
                                                                        11310000
PROCEDURE CLEARWWS;                                                     11312000
OPTION PRIVILEGED,UNCALLABLE;                                           11314000
                                                                        11316000
COMMENT                                                                 11318000
CALLS TO THIS PROCEDURE SHOULD BE ELIMINATED.                           11320000
;                                                                       11322000
                                                                        11324000
BEGIN                                                                   11326000
DISABLE;                                                                11328000
ABSOLUTE(ABSOLUTE(CPCB)+EVENTFLAGSWORDNUM).WWS:=0;                      11330000
END   <<PROCEDURE CLEARWWS>>;                                           11332000
$PAGE "I/O INTERFACE PROCEDURES : AWAKE DEVICE"                         11334000
PROCEDURE AWAKEDEVICE(IOQSYSBASEINX,SEGIDENT,MMIOERR);                  11336000
VALUE IOQSYSBASEINX,SEGIDENT,MMIOERR;                                   11338000
INTEGER IOQSYSBASEINX;                                                  11340000
LOGICAL SEGIDENT,MMIOERR;                                               11342000
OPTION PRIVILEGED,UNCALLABLE;                                           11344000
                                                                        11346000
COMMENT                                                                 11348000
                                                                        11350000
AWAKEDEVICE IS CALLED TO GIVE INFO ON THE COMPLETION OF A               11352000
SEGMENT FETCH REQUEST TO AN I/O DEVICE MONITOR.  THE DEVICE             11354000
MONITOR IS AWAKENED THROUGH A CALL TO AWAKEIO.                          11356000
                                                                        11358000
THE IOQSYSBASEINX PARAMETER CARRIES A TRUE IOQ SYSBASE INDEX   <<01770>>11360000
ONLY FOR DATA SEGMENT REQUESTS.  FOR DRIVERS, THIS PARAMETER   <<01770>>11362000
ACTUALLY CARRIES THE LDEV NUMBER.  THIS CHANGE WAS REQUIRED    <<01770>>11364000
SINCE INTERRUPTS REQUIRING THE STARTUP OF AN IDLE CHANNEL      <<01770>>11366000
PROGRAM HAVE NO ASSOCIATED I/O REQUESTS.                       <<01770>>11368000
                                                               <<01770>>11370000
;                                                                       11372000
                                                                        11374000
BEGIN                                                                   11376000
INTEGER POINTER DITPOINTER;                                             11378000
INTEGER DITSYSDBINX,                                                    11380000
        LDEVNUMBER;                                                     11382000
                                                                        11384000
X:=IOQSYSBASEINX;                                                       11386000
IF SEGIDENT.SEGIDTYPEFIELD<>SEGIDDATATYPE                      <<01770>>11388000
THEN LDEVNUMBER:=IOQSYSBASEINX ELSE                            <<01770>>11390000
LDEVNUMBER:=IOQLDEVNUMBER;                                              11392000
TOS:=LPDT(X:=LDEVNUMBER&LSL(1)); <<DITP>>                               11394000
DITSYSDBINX:=S0;                                                        11396000
@DITPOINTER:=S0;                                                        11398000
X:=TOS;                                                                 11400000
mmstat(82,x,MEM(X),@IOQFLAGS);                                 <<01715>>11402000
IF SEGIDENT.SEGIDTYPEFIELD<>SEGIDDATATYPE THEN                          11404000
   BEGIN <<A DRIVER>>                                                   11406000
   X:=DITDLTP;                                                          11408000
   TOS:=DLTFLAGS;                                                       11410000
   IF MMIOERR THEN TOS.DLTMMERRORCFLAG:=1                               11412000
   ELSE TOS.DLTDRVRFRZNFLAG:=1;                                         11414000
   DLTFLAGS:=TOS;                                                       11416000
   END                                                                  11418000
ELSE                                                                    11420000
   BEGIN <<A BUFFER>>                                                   11422000
   X:=IOQSYSBASEINX;                                                    11424000
   IF MMIOERR THEN IOQFLAGS.IOQMMERRORDFLAG:=1                          11426000
   ELSE IOQFLAGS.IOQDATAFZNFLAG:=1;                                     11428000
   END;                                                                 11430000
AWAKEIO(DITPOINTER,0);                                                  11432000
END  <<AWAKEDEVICE>>;                                                   11434000
$PAGE "I/O INTERFACE PROCEDURES : UNDEFER SEGS MP Q"                    11436000
                                                                        11438000
PROCEDURE UNDEFERSEGSMPQ(REGIONBASE,SEGIDENT,IOERRABORTFLAG);           11440000
VALUE REGIONBASE,SEGIDENT,IOERRABORTFLAG;                               11442000
DOUBLE REGIONBASE;                                                      11444000
LOGICAL SEGIDENT,IOERRABORTFLAG;                                        11446000
OPTION PRIVILEGED,UNCALLABLE;                                           11448000
                                                                        11450000
BEGIN                                                                   11452000
                                                                        11454000
INTEGER DEFERREDPCBPT;                                                  11456000
INTEGER ENTRYINX;                                                       11458000
INTEGER I;                                                              11460000
                                                                        11462000
<<                                                                      11464000
UNDEFER PROCESSES WAITING FOR THIS SEGMENT                              11466000
>>                                                                      11468000
                                                                        11470000
TOS:=REGIONBASE;                                                        11472000
TOS:=TOS+RBTOMPQLINKDISP;                                               11474000
ASMB(LSEA);                                                             11476000
TOS:=TOS.(0:8); <<PIN OF FIRST PROC WAITING FOR SEG>>                   11478000
WHILE <> DO                                                             11480000
   BEGIN                                                                11482000
   TOS:=DEFERREDPCBPT:=S0*PCBSIZE;                                      11484000
   X:=TOS+SLLIXWORDNUM;                                                 11486000
   X:=PCB(X); <<SYSBASE INDEX OF PROCESS'S SLL>>                        11488000
   IF IOERRABORTFLAG THEN ABORTPROCESS(DEFERREDPCBPT+                   11490000
   PCBSYSBASEINX,MAKEPRESIOERR) ELSE                                    11492000
      BEGIN <<DEC PROCS COUNT OF I/O COMP TO AWAKE>>                    11494000
      TOS:=SLLSCHEDTOIOMSG.SLLIOCOMPTOAWAKECNT-1;                       11496000
      SLLSCHEDTOIOMSG.SLLIOCOMPTOAWAKECNT:=S0;                          11498000
      ASMB(TEST,DEL);                                                   11500000
      IF < THEN SUDDENDEATH(612);                              <<01644>>11502000
      IF = THEN                                                         11504000
         BEGIN <<PROCESS IS BEING SWAPPED IN OR IS READY FOR LAUNCH>>   11506000
         IF NOT SLLSCHEDTOIOMSG.SLLSWAPIPFLAG                           11508000
         THEN AWAKE(DEFERREDPCBPT,MEMORYWAITCODE,NOWAIT);               11510000
         END;                                                           11512000
      END;                                                              11514000
   <<FIND NEXT PIN WAITING FOR THIS SEG>>                               11516000
   X:=SLLFIRSTINX;                                                      11518000
   WHILE SLLSEGIDENT <> SEGIDENT DO X:=SLLNEXTINX;                      11520000
   IF X = 0 THEN SUDDENDEATH(612);                             <<01644>>11522000
   SLLFLAGS.SLLIMIFLAG:=0;                                              11524000
   TOS:=SLLMPQLINK;                                                     11526000
   TOS:=TOS.(8:8); <<NEXT MPQPIN>>                                      11528000
   END;                                                                 11530000
                                                                        11532000
<<                                                                      11534000
AWAKEIO ON DEVICES QUEUED FOR THIS SEGMENT                              11536000
>>                                                                      11538000
                                                                        11540000
TOS:=REGIONBASE;                                                        11542000
TOS:=TOS+RBTOCOMPMSGDISP;                                               11544000
ASMB(LSEA);                                                             11546000
ASMB(TBC COMPMSGIOWAKEBIT);                                             11548000
IF <> THEN                                                              11550000
   BEGIN  <<DEVICES WAITING FOR SEGMENT>>                               11552000
   ASMB(DEL);                                                           11554000
   TOS:=TOS+COMPMSGTOIOREQQDISP;                                        11556000
   ASMB(LSEA);                                                          11558000
   IF = THEN SUDDENDEATH(612);                                 <<01644>>11560000
   ENTRYINX:=TOS;                                                       11562000
   I:=0;                                                                11564000
   WHILE MEM(X:=ENTRYINX+I) <> 0 AND I < 5 DO                           11566000
      BEGIN                                                             11568000
      AWAKEDEVICE(MEM(X),SEGIDENT,IOERRABORTFLAG);                      11570000
      I:=I+1;                                                           11572000
      END;                                                              11574000
   RELSYSTABENTRY(SPECREQTABSYSBASEINX,ENTRYINX);                       11576000
   END;                                                                 11578000
END  <<PROCEDURE UNDEFERSEGSMPQ>>;                                      11580000
$PAGE "I/O INTERFACE PROCEDURES : IOFREEZE'/IOUNFREEZE'"                11582000
$PAGE "I/O SYSTEM INTERFACE PROCEDURES"                                 11584000
PROCEDURE IOFREEZE'(SEGIDENT);                                          11586000
VALUE SEGIDENT;                                                         11588000
LOGICAL SEGIDENT;                                                       11590000
OPTION PRIVILEGED,UNCALLABLE;                                           11592000
                                                                        11594000
COMMENT                                                                 11596000
                                                                        11598000
IOFREEZE' IS CALLED FROM I/O SYSTEM MONITORS TO FREEZE' A               11600000
SEGMENT IN MEMORY SO THAT INSTRUCTION FETCH AND DATA                    11602000
TRANSFER BY DMA I/O SYSTEM DEVICES MAY TAKE PLACE.  IF                  11604000
THE REQUIRED SEGMENT IS PRESENT, THE SEGMENT GETS IO FROZEN             11606000
IF IT IS ABSENT, STATUS THROUGH THE CONDITION CODE IS RETURNED          11608000
AND NOTHING IS DONE.  THE MONITOR MUST MAKE A SPECIAL                   11610000
REQUEST FOR THE SEGMENT TO THE SCHEDULER, SINCE BLOCKING                11612000
THE MONITOR ON THE ICS IN IOFREEZE' WOULDN'T WORK.                      11614000
                                                                        11616000
;                                                                       11618000
                                                                        11620000
BEGIN                                                                   11622000
INTEGER NEWIOFZCNT,                                                     11624000
        DESCSTINX;                                                      11626000
INTEGER CONDCODE:=CCE;                                                  11628000
INTEGER TYPE;  <<FOR MMSTAT>>                                  <<01571>>11630000
LOGICAL FREEZE':=TRUE;                                                  11632000
ENTRY IOUNFREEZE';                                                      11634000
                                                                        11636000
TYPE.(12:4) := 0;    <<TYPE FOR IOFREEZE>>                     <<01571>>11638000
GO OVER;                                                                11640000
IOUNFREEZE':FREEZE':=FALSE;                                             11642000
TYPE.(12:4) := 3;    <<TYPE FOR IOUNFREEZE>>                   <<01571>>11644000
OVER:                                                                   11646000
IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE                                11648000
THEN DESCSTINX:=SEGIDENT&LSL(2)                                         11650000
ELSE DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                             11652000
X:=DESCSTINX;                                                           11654000
DISABLE;                                                                11656000
TOS:=DST(X);                                                            11658000
ASMB(DEL);                                                              11660000
IF < THEN CONDCODE:=CCL  <<SEGMENT ABSENT>> ELSE                        11662000
   BEGIN  <<SEGMENT IS PRESENT>>                                        11664000
   TOS:=DST(X:=X+1);                                                    11666000
   ASMB(TBC SEGRESIDENTBIT);                                            11668000
   IF = THEN                                                            11670000
      BEGIN <<SEG NOT CORE RESIDENT>>                                   11672000
      TOS:=DST(X:=X+1);                                                 11674000
      TOS:=DST(X:=X+1);                                                 11676000
      TOS:=TOS+RBTOWDIOFZCNTDISP;                                       11678000
      ASMB(LSEA);                                                       11680000
      IF FREEZE' THEN                                                   11682000
         BEGIN                                                          11684000
         NEWIOFZCNT:=S0.IOFZCNTFIELD+1;                                 11686000
         TOS.IOFZCNTFIELD:=NEWIOFZCNT;                                  11688000
         ASMB(SSEA);                                                    11690000
         TOS:=TOS+WDIOFZCNTTORASDISP;                                   11692000
         ASMB(LSEA);                                                    11694000
         TOS.REGIOFZFLAG:=1;                                            11696000
         ASMB(SSEA);                                                    11698000
         END                                                            11700000
      ELSE                                                              11702000
         BEGIN  <<UNFREEZE'>>                                           11704000
         NEWIOFZCNT:=S0.IOFZCNTFIELD-1;                                 11706000
         TOS.IOFZCNTFIELD:=NEWIOFZCNT;                                  11708000
         ASMB(SSEA);                                                    11710000
         TOS:=TOS+WDIOFZCNTTORASDISP;                                   11712000
         ASMB(LSEA);                                                    11714000
         TOS.REGIOFZFLAG:=0;                                            11716000
         IF = THEN CONDCODE:=CCL; <<REG WASN'T I/O FROZEN>>             11718000
         IF NEWIOFZCNT = 0 THEN                                         11720000
            BEGIN                                                       11722000
            TOS.SIZECHANGEPNDGFLAG:=0;                                  11724000
            ASMB(SSEA);                                                 11726000
            IF <> THEN                                                  11728000
               BEGIN                                                    11730000
               TOS:=TOS+RASTOMPQLINKDISP;                               11732000
               ASMB(LSEA);                                              11734000
               UNIMPEDE(*);                                             11736000
               END;                                                     11738000
            END;                                                        11740000
         END;                                                           11742000
      END;                                                              11744000
   END;                                                                 11746000
CC:=CONDCODE;                                                           11748000
MMSTAT(2,SEGIDENT,TYPE,NEWIOFZCNT);   <<IOFREEZE;IOUNFREEZE>>  <<01571>>11750000
END  <<IOFREEZE'>>;                                                     11752000
$PAGE "I/O INTERFACE PROCEDURES : TEST I/O FROZEN"                      11754000
LOGICAL PROCEDURE TESTIOFROZEN(SEGIDENT);                               11756000
VALUE SEGIDENT;                                                         11758000
LOGICAL SEGIDENT;                                                       11760000
OPTION PRIVILEGED,UNCALLABLE;                                           11762000
                                                                        11764000
COMMENT                                                                 11766000
                                                                        11768000
USED BY CS TO SEE IF A DRIVER HAS ALREADY BEEN FROZEN. FOR PERFORMANCE. 11770000
;                                                                       11772000
                                                                        11774000
BEGIN                                                                   11776000
                                                                        11778000
INTEGER DESCSTINX;                                                      11780000
DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                                  11782000
DISABLE;                                                                11784000
TOS:=DST(X:=DESCSTINX);                                                 11786000
ASMB(DEL);                                                              11788000
IF > THEN                                                               11790000
   BEGIN  <<SEGMENT IS PRESENT>>                                        11792000
   TOS:=DST(X:=X+1);                                                    11794000
   ASMB(TBC SEGRESIDENTBIT);                                            11796000
   IF <> THEN TESTIOFROZEN:=TRUE ELSE                                   11798000
      BEGIN <<NOT RESIDENT>>                                            11800000
      TOS:=DST(X:=X+1);                                                 11802000
      TOS:=DST(X:=X+1);                                                 11804000
      TOS:=TOS+RBTORASDISP;                                             11806000
      ASMB(LSEA);                                                       11808000
      TOS.REGIOFZFLAG:=0;                                               11810000
      IF <> THEN TESTIOFROZEN:=TRUE;                                    11812000
      END;                                                              11814000
   END;                                                                 11816000
END  <<TESTIOFROZEN>>;                                                  11818000
$PAGE "I/O INTERFACING PROCEDURES : FETCHIOSEG"                         11820000
PROCEDURE FETCHIOSEG(SEGID,LDEV,IOREQSYSBASEINX,FLAGS);                 11822000
VALUE SEGID,LDEV,IOREQSYSBASEINX,FLAGS;                                 11824000
INTEGER SEGID,LDEV,IOREQSYSBASEINX,FLAGS;                               11826000
OPTION PRIVILEGED,UNCALLABLE;                                           11828000
                                                                        11830000
COMMENT                                                                 11832000
                                                                        11834000
FETCHIOSEG IS USED BY I/O SYSTEM MONITORS TO REQUEST SEGMENTS ON        11836000
BEHALF OF DEVICES.  THIS INTERFACE ALLOWS THE CALLER TO REQUEST         11838000
A DRIVER OR BUFFER DATA SEGMENT IN AN UNBLOCKED MANNER.  WHEN THE       11840000
SEGMENT ARRIVES, IT IS IOFROZEN IF THIS HAD BEEN REQUESTED, AND         11842000
AWAKEIO IS CALLED ON THE APPROPRIATE DEVICE. ALSO, THE DATA FROZEN      11844000
BIT IN THE SPECIFIED I/O REQUEST FLAGS WORD IS SET FOR DATA SEGMENT     11846000
REQUESTS, AND THE DRIVER FROZEN BIT IN THE ILT IS SET FOR DRIVER        11848000
FETCH REQUESTS.                                                         11850000
                                                                        11852000
PARAMETER SPECIFICATION :                                               11854000
                                                                        11856000
   SEGID : .(0:2) = SEG TYPE FIELD                                      11858000
                                                                        11860000
                  = 0 ==> DATA SEG ==> .(2:14) = DST NUMBER             11862000
                  = 1 ==> SL SEG   ==> .(2:14) = SL NUMBER              11864000
                  = 2 ==> PROG SEG ==> .(1:7) = CSTXBLK INDEX,          11866000
                                       .(8:8) = LOG SEG #               11868000
                                                                        11870000
   LDEV : LOGICAL DEVICE NUMBER OF DEVICE REQUIRING SEGMENT             11872000
                                                                        11874000
   IOREQSYSBASEINX : SYSBASE RELATIVE INDEX OF BASE OF I/O REQUEST      11876000
                     ELEMENT ASSOCIATED WITH THE SEGMENT FETCH REQUEST  11878000
                     (ONLY REQUIRED FOR DATA SEGMENT FETCH REQUESTS)    11880000
                                                                        11882000
   FLAGS : .(0:1) = 1 ==> IOFREEZE SEGMENT WHEN IT ARRIVES              11884000
                                                                        11886000
CONDITION CODE RETURN SPECIFICATION :                                   11888000
                                                                        11890000
   RETURN CC = CCE ==> SEGMENT IS PRESENT, AND HAS BEEN I/O FROZEN      11892000
                       IF SO REQUESTED (BUT DATA FROZEN, DRIVER FROZEN  11894000
                       BITS NOT SET, AWAKEIO NOT CALLED)                11896000
             = CCG ==> SEGMENT NOT AROUND, AND REQUEST FOR SEGMENT      11898000
                       HAS BEEN ISSUED.                                 11900000
;                                                                       11902000
                                                                        11904000
BEGIN                                                          <<JBIV>> 11906000
                                                                        11908000
INTEGER SEGDESCSTINX;                                                   11910000
                                                                        11912000
                                                               <<JBIV>> 11914000
SEGDESCSTINX:=CONVSEGIDTOSTINX(SEGID);                         <<JBIV>> 11916000
IF < THEN SUDDENDEATH(624);  << SEGMENT IS NOT ALLOCATED>>     <<04643>>11918000
DISABLE;                                                       <<JBIV>> 11920000
IF NOT LOGICAL(DST(SEGDESCSTINX)).ABSENTFLAG THEN              <<JBIV>> 11922000
   BEGIN  <<SEG IS AROUND>>                                    <<JBIV>> 11924000
   CC:=CCE;                                                    <<JBIV>> 11926000
   IF LOGICAL(FLAGS).MSGIOFZREQFLAG THEN IOFREEZE'(SEGID);     <<JBIV>> 11928000
   END                                                         <<JBIV>> 11930000
ELSE                                                           <<JBIV>> 11932000
   BEGIN <<MUST SEND OFF A REQUEST FOR THE SEGMENT>>           <<JBIV>> 11934000
   CC:=CCG;                                                    <<JBIV>> 11936000
   TOS:=SEGID;                                                 <<JBIV>> 11938000
   IF SEGID.SEGIDTYPEFIELD <> SEGIDDATATYPE THEN TOS:=LDEV     <<JBIV>> 11940000
   ELSE TOS:=IOREQSYSBASEINX;                                  <<JBIV>> 11942000
   TOS:=FLAGS;                                                 <<JBIV>> 11944000
   SENDMSG(SCHEDPIN,IOSEGREQPORT,3,0);                         <<JBIV>> 11946000
   END;                                                        <<JBIV>> 11948000
END <<FETCHIOSEG>>;                                            <<JBIV>> 11950000
                                                               <<JBIV>> 11952000
                                                                        11954000
$PAGE "I/O INTERFACE PROCEDURES : CHECK FOR PENDING I/O"                11956000
                                                                        11958000
PROCEDURE CHECKFORPNDGDISKIO(SEGIDENT);                                 11960000
VALUE SEGIDENT;                                                         11962000
INTEGER SEGIDENT;                                                       11964000
OPTION PRIVILEGED,UNCALLABLE;                                           11966000
                                                                        11968000
COMMENT                                                                 11970000
                                                                        11972000
THIS PROCEDURE CHECKS THE LIST OF PENDING DISK REQUESTS AND             11974000
QUEUES ANY REQUESTS AGAINST SEGIDENT BACK INTO THE ACTIVE DISK          11976000
QUEUES.                                                                 11978000
                                                                        11980000
;                                                                       11982000
                                                                        11984000
BEGIN                                                                   11986000
INTEGER NEXT,                                                           11988000
        REQP;                                                           11990000
                                                                        11992000
X:=DISCREQTABSYSBASEINX;                                                11994000
X:=DITQHEADP;                                                           11996000
                                                                        11998000
DISABLE;                                                                12000000
LOOP :                                                                  12002000
                                                                        12004000
WHILE <> AND REQDSTINFO.REQDSTNFIELD <> SEGIDENT DO X:=NEXTREQP;        12006000
IF X <> 0 THEN                                                          12008000
   BEGIN                                                                12010000
   REQP:=X;                                                             12012000
   NEXT:=NEXTREQP;                                                      12014000
   DEQUEUEDISCREQ(X,0);                                                 12016000
   DISCREQFLAGS.DISABLEDREQFLAG:=0;                                     12018000
   QUEUEDISCREQ(REQP,LPDT(REQLDEVN&LSL(1)));                            12020000
   X:=NEXT;                                                             12022000
   GO LOOP;                                                             12024000
   END;                                                                 12026000
END <<CHECKFORPNDGDISCIO>>;                                             12028000
                                                                        12030000
$PAGE "I/O INTERFACE PROCEDURES : START SEG WRITE"                      12032000
PROCEDURE STARTSEGWRITE(DSTENTRYNUMBER,URGCLASS);                       12034000
VALUE DSTENTRYNUMBER,URGCLASS;                                          12036000
INTEGER DSTENTRYNUMBER,URGCLASS;                                        12038000
OPTION PRIVILEGED,UNCALLABLE;                                           12040000
                                                                        12042000
COMMENT                                                                 12044000
                                                                        12046000
STARTSEGWRITE BUILDS A DISC WRITE REQUEST FOR THE SPECIFIED             12048000
DATA SEGMENT, AND QUEUES THE WRITE REQUEST INTO THE APPROPIATE DISC     12050000
QUEUE VIA A CALL TO QUEUEDISCREQ.                                       12052000
                                                                        12054000
THE REQUEST WILL BE ISSUED WITH THE PRIORITY PASSED IN THE URGCLASS     12056000
PARAMETER.  THIS WILL CONTROL THE LOCATION IN THE DISC QUEUE, AND       12058000
THEREBY THE URGENCY OF SERVICE FOR THE REQUEST SINCE DISC QUEUES        12060000
ARE SERVICED FORM THE HEAD.                                             12062000
                                                                        12064000
                                                                        12066000
;                                                                       12068000
                                                                        12070000
BEGIN                                                                   12072000
INTEGER DISCREQINX,                                                     12074000
        MSTATPARM3,                                            <<01571>>12076000
        WRITDISABLEDCOUNT:=0;                                           12078000
DOUBLE REGIONBASE;                                                      12080000
INTEGER LDEV;                                                           12082000
X:=DSTENTRYNUMBER&LSL(2)+DSTSYSBASEINX;                                 12084000
TOS:=SEGDESCFIRMINFO;                                                   12086000
TOS:=TOS.DATASIZEFIELD&LSL(2);  <<TRANSFER COUNT>>                      12088000
TOS:=SEGDESCBANK;                                                       12090000
TOS:=SEGDESCADDR;                                                       12092000
ASMB(DDUP,DDUP);                                                        12094000
REGIONBASE:=TOS;                                                        12096000
TOS:=TOS+RBTOHODADISP;                                                  12098000
ASMB(LDEA); <<HIGH AND LOW ORDER DISC ADDRESSES>>                       12100000
ASMB(DXCH);                                                             12102000
                                                                        12104000
<<GET A DISC TRANSFER REQUEST ELEMENT AND FILL IT IN>>                  12106000
                                                                        12108000
TOS:=TOS+HODATOWREQPDISP;                                               12110000
TOS:=X:=DISCREQINX:=GETDISCREQ(2);  <<NO IMPEDE>>              <<01644>>12112000
IF = THEN SUDDENDEATH(601); <<DISC REQ TAB CONFIG TOO SMALL>>  <<01644>>12114000
ASMB(SSEA;DDEL); <<WRITE REQ POINTER IN SUBREGION HEADER>>              12116000
<<FILL IN THE DISC REQUEST ELEMENT>>                                    12118000
REQLODA:=TOS;  <<LODA>>                                                 12120000
REQHODA:=S0.HODAFIELD;  <<HODA WITHOUT DEV>>                            12122000
LDEV:=REQLDEVN:=TOS.LDEVNFIELD; <<LDEV FROM HODA>>                      12124000
REQMMBASE:=TOS; <<XFERBASE>>                                            12126000
REQMMBANK:=TOS; <<XFERBANK>>                                            12128000
REQTRANSFERCNT:=TOS; <<XFERCOUNT>>                                      12130000
TOS:=0;                                                                 12132000
TOS.MMDISCREQFLAG:=1;                                                   12134000
DISCREQFLAGS:=TOS;                                                      12136000
REQFUNCTION:=WRITEREQ;                                                  12138000
REQSEGIDENT:=DSTENTRYNUMBER;  <<SEGIDENTIFIER>>                         12140000
REQREADDISP:=0;  <<DISPLACEMENT>>                                       12142000
REQURGCLASS:=URGCLASS;                                                  12144000
                                                                        12146000
<<SET BACKGROUND WRITE SEMAPHORE>>                                      12148000
                                                                        12150000
DST(DSTENTRYNUMBER&LSL(2)+1).DISCCOPYVALIDFLAG:=0;                      12152000
                                                                        12154000
<<QUEUE THE WRITE REQUEST>>                                             12156000
                                                                        12158000
MSTATPARM3 := LDEV            ;                                <<01571>>12160000
MSTATPARM3.(0:1) := 1;                                         <<01571>>12162000
MMSTAT(5,DSTENTRYNUMBER,DISCREQINX,MSTATPARM3);                <<01571>>12164000
QUEUEDISCREQ(DISCREQINX,LPDT(LDEV&LSL(1)));                             12166000
END  <<PROCEDURE STARTSEGWRITE>>;                                       12168000
                                                                        12170000
$PAGE "I/O INTERFACE PROCEDURES : PROCESS INITIATION MESSAGE"           12172000
PROCEDURE PROCESSINITMSG(REGIONBASE);                                   12174000
VALUE REGIONBASE;                                                       12176000
DOUBLE REGIONBASE;                                                      12178000
OPTION PRIVILEGED,UNCALLABLE;                                           12180000
                                                                        12182000
COMMENT                                                                 12184000
                                                                        12186000
THIS PROCEDURE EXAMINES THE INITIATION MESSAGE IN THE REGION            12188000
HEADER TO SEE IF THE ACTION FOR WHICH THE REGION WAS RESERVED           12190000
MAY BE INITIATED.  IF THE REGION IS FREE OF ON-GOING I/O, AND           12192000
THE ACTION IS NOT EXTERNALLY DISABLED (DUE TO THE DISC COPY             12194000
NOT YET BEING CURRENT) THEN THE APPROPRIATE ACTION (REQUEST             12196000
A MOVE OR QUEUE A READ) IS TAKEN.                                       12198000
                                                                        12200000
;                                                                       12202000
                                                                        12204000
BEGIN                                                                   12206000
                                                                        12208000
INTEGER RESREGSIZE,                                                     12210000
        REQP,                                                           12212000
        ORIGREGSIZE,                                                    12214000
        SEGIDENT,                                              <<01571>>12216000
        NEWREGSIZE;                                                     12218000
                                                                        12220000
LOGICAL INITMSG;                                                        12222000
DOUBLE RELREGBASE;                                                      12224000
                                                                        12226000
TOS := REGIONBASE;                                             <<01571>>12228000
TOS := TOS + RBTOSEGIDENTDISP;                                 <<01571>>12230000
ASMB(LSEA);            <<GRAB SEGIDENT FROM REGION HEADER>>    <<01571>>12232000
SEGIDENT := TOS;       <<FOR MMSTAT>>                          <<01571>>12234000
TOS:=REGIONBASE;                                                        12236000
TOS:=TOS+RBTOINITMSGDISP;                                               12238000
DISABLE;                                                                12240000
ASMB(LSEA);                                                             12242000
INITMSG:=TOS;                                                           12244000
IF INITMSG.INITMSGTOGGLESWITCH THEN SUDDENDEATH(613);          <<01644>>12246000
IF NOT INITMSG.MSGEXTDISABLEDFLAG THEN                                  12248000
   BEGIN                                                                12250000
   IF NOT INITMSG.MSGONGOINGIODISABLEDFLAG THEN                         12252000
      BEGIN                                                             12254000
      IF INITMSG.MSGVALIDYETFLAG THEN                                   12256000
         BEGIN   <<MESSAGE IS READY TO GO>>                             12258000
         INITMSG.INITMSGTOGGLESWITCH:=1;                                12260000
         TOS:=INITMSG;                                                  12262000
         TOS.INITMSGRELRESPAGESFLAG:=0; <<CLEAR SEMAPHORE>>             12264000
         ASMB(SSEA);                                                    12266000
         IF INITMSG.QUEUEREADREQFLAG THEN                               12268000
            BEGIN                                                       12270000
            ENABLE;                                                     12272000
            TOS:=TOS+INITMSGTOINITINFODISP;                             12274000
            ASMB(LSEA);                                                 12276000
            X:=REQP:=TOS;                                               12278000
               MMSTAT(5,SEGIDENT,REQP,REQLDEVN);               <<01571>>12280000
            QUEUEDISCREQ(REQP,LPDT(REQLDEVN&LSL(1)));                   12282000
            END;                                                        12284000
                                                                        12286000
         <<                                                             12288000
         FIX HEADER, CHECK IF SOME PAGES SHOULD BE RELEASED             12290000
         >>                                                             12292000
                                                                        12294000
         TOS:=REGIONBASE;                                               12296000
         TOS:=TOS+RBTORPAGECNTDISP;                                     12298000
         ASMB(LSEA);                                                    12300000
         RESREGSIZE:=TOS;                                               12302000
         TOS:=0;                                                        12304000
         ASMB(SSEA);                                                    12306000
         INITMSG.INITMSGRELRESPAGESFLAG:=0;                             12308000
         IF <> THEN                                                     12310000
            BEGIN                                                       12312000
            IF RESREGSIZE=0 THEN SUDDENDEATH(612);             <<01644>>12314000
            END                                                         12316000
         ELSE IF RESREGSIZE<>0 THEN SUDDENDEATH(612);          <<01644>>12318000
                                                                        12320000
         <<FIX UP SELECTED REGION'S HEADER AND TRAILER>>                12322000
                                                                        12324000
         TOS:=TOS+RPAGECNTTORSDISP;                                     12326000
         ASMB(LSEA);                                                    12328000
         ORIGREGSIZE:=S0;                                               12330000
         TOS:=TOS-RESREGSIZE;                                           12332000
         NEWREGSIZE:=S0;                                                12334000
         ASMB(SSEA);                                                    12336000
         TOS:=TOS+RSTOSSDISP;                                           12338000
         TOS:=NEWREGSIZE;                                               12340000
         ASMB(SSEA);                                                    12342000
         TOS:=TOS+SSTOPTRASDISP+NEWREGSIZE&LSL(PAGEPOWER);              12344000
         TOS:=REGRESERVEDCODE;                                          12346000
         ASMB(SSEA);                                                    12348000
         TOS:=TOS+TRASTOTRSDISP;                                        12350000
         TOS:=NEWREGSIZE;                                               12352000
         ASMB(SSEA);                                                    12354000
         TOS:=TOS+TRSTOTSSDISP;                                         12356000
         TOS:=NEWREGSIZE;                                               12358000
         ASMB(SSEA);                                                    12360000
                                                                        12362000
         <<                                                             12364000
         RELEASE EXTRA PAGES OFF END OF REGION                          12366000
         >>                                                             12368000
                                                                        12370000
         IF RESREGSIZE <> 0 THEN                                        12372000
            BEGIN                                                       12374000
                                                                        12376000
            <<FIX UP RELEASE REGION HEADER AND TRAILER>>                12378000
                                                                        12380000
            TOS:=REGIONBASE;                                            12382000
            TOS:=TOS+NEWREGSIZE&LSL(PAGEPOWER);                         12384000
            ASMB(DDUP);                                                 12386000
            RELREGBASE:=TOS;                                            12388000
            TOS:=TOS+RBTORASDISP;                                       12390000
            TOS:=REGRESERVEDCODE;                                       12392000
            ASMB(SSEA);                                                 12394000
            TOS:=TOS+RASTOSSDISP;                                       12396000
            TOS:=RESREGSIZE;                                            12398000
            ASMB(SSEA);                                                 12400000
            TOS:=TOS+SSTORSDISP;                                        12402000
            TOS:=RESREGSIZE;                                            12404000
            ASMB(SSEA);                                                 12406000
            TOS:=TOS+RSTOSEGIDENTDISP;                                  12408000
            TOS:=0;                                                     12410000
            ASMB(SSEA);                                                 12412000
            TOS:=TOS+SEGIDENTTOPTSSDISP+RESREGSIZE&LSL(PAGEPOWER);      12414000
            TOS:=RESREGSIZE;                                            12416000
            ASMB(SSEA);                                                 12418000
            TOS:=TOS+TSSTOTRASDISP;                                     12420000
            TOS:=REGRESERVEDCODE;                                       12422000
            ASMB(SSEA);                                                 12424000
            TOS:=TOS+TRASTOTRSDISP;                                     12426000
            TOS:=RESREGSIZE;                                            12428000
            ASMB(SSEA);                                                 12430000
            TOS:=RELREGBASE;                                            12432000
            SENDMSG(SCHEDPIN,RELREGREQPORT,2,0);                        12434000
            END;                                                        12436000
         END;                                                           12438000
      END;                                                              12440000
   END;                                                                 12442000
END  <<PROCEDURE PROCESSINITMSG>>;                                      12444000
$PAGE "I/O INTERFACE PROCEDURES : SEG WRITE COMPLETOR"                  12446000
                                                                        12448000
PROCEDURE SEGWRITECOMPLETOR(REQP);                                      12450000
VALUE REQP;                                                             12452000
INTEGER REQP;                                                           12454000
OPTION PRIVILEGED,UNCALLABLE;                                           12456000
                                                                        12458000
                                                                        12460000
COMMENT                                                                 12462000
                                                                        12464000
THIS PROCEDURE IS CALLED FROM THE DISC MONITOR (SIODM)                  12466000
WHEN A SEGMENT WRITE ON BEHALF OF MEMORY MANAGEMENT                     12468000
HAS COMPLETED. IF THE REGION CONTAINING THE WRITTEN                     12470000
SEGMENT HAS BEEN CLEARED, AND THE REGION'S ON-GOING                     12472000
I/O COUNT FALLS TO ZERO AS A RESULT OF THIS WRITE                       12474000
COMPLETION, PROCESSINITMSG IS CALLED TO START UP                        12476000
THE ACTIVITY FOR WHICH THE REGION WAS CLEARED. IF                       12478000
ANOTHER REGION HAS BEEN RESERVED FOR THE SEGMENT WHICH                  12480000
WAS WRITTEN OUT, THE READ IS ENABLED AND PROCESSINITMSG                 12482000
IS CALLED TO GET IT STARTED.                                            12484000
                                                                        12486000
;                                                                       12488000
                                                                        12490000
                                                                        12492000
BEGIN                                                                   12494000
                                                                        12496000
                                                                        12498000
DOUBLE REGIONBASE=Q+1;                                                  12500000
INTEGER SEGIDENT=Q+3,                                                   12502000
        STINX=Q+4;                                                      12504000
LOGICAL IOERRFLAG=Q+5,                                                  12506000
        FLAGS=Q+6;                                                      12508000
                                                                        12510000
<<DB ASSUMED TO BE AT SYSDB>>                                           12512000
                                                                        12514000
<<                                                                      12516000
INITIALIZE LOCAL VARIABLES FROM DISC REQ INFO                           12518000
>>                                                                      12520000
X:=REQP; <<FOR DIRECT ARRAY ACCESS TO DISC REQUEST ELEMENT>>            12522000
TOS:=REQMMBANK;   <<REGIONBASE>>                                        12524000
TOS:=REQMMBASE;                                                         12526000
TOS:=REQSEGIDENT;                                                       12528000
TOS:=S0&LSL(2);  <<STINX>>                                              12530000
IF DISCREQSTATUS <> 1 THEN TOS:=TRUE ELSE TOS:=FALSE;<<IOERRFLAG>>      12532000
TOS:=DISCREQFLAGS; <<LOCAL VARIABLE FLAGS>>                             12534000
MMSTAT(6,REQSEGIDENT,REQP,%100000);                            <<01571>>12536000
<<                                                                      12538000
RELEASE THE DISC REQUEST ELEMENT                                        12540000
>>                                                                      12542000
TOS:=REQP;                                                     <<01644>>12544000
RETURNDISCREQ(*);                                              <<01644>>12546000
<<                                                                      12548000
DESTROY REFERENCE TO WRITE REQUEST INDEX IN REGION HEADER               12550000
>>                                                                      12552000
TOS:=REGIONBASE;                                                        12554000
TOS:=TOS+RBTOWREQPDISP;                                                 12556000
ASMB(LSEA);                                                             12558000
IF TOS<>REQP AND NOT FLAGS.ABORTREQATTMPTFLAG                  <<01644>>12560000
THEN SUDDENDEATH(613);                                         <<01644>>12562000
TOS:=0;                                                                 12564000
IF NOT FLAGS.ABORTREQATTMPTFLAG THEN                           <<01679>>12566000
ASMB(SSEA;DDEL);                                                        12568000
IF NOT FLAGS.ABORTREQATTMPTFLAG THEN                                    12570000
   BEGIN  <<WRITE WASN'T CALLED OFF>>                                   12572000
   <<INDICATE IN DESCRIPTOR THAT DISC COPY IS VALID>>                   12574000
   DST(STINX+1).DISCCOPYVALIDFLAG:=1;                                   12576000
   IF <> THEN SUDDENDEATH(613);                                <<01644>>12578000
   <<                                                                   12580000
   INITIATE ACTION PENDING ON THIS WRITE COMPLETION                     12582000
   >>                                                                   12584000
   X:=STINX+DSTSYSBASEINX;<<FOR DIRECT ACCESS TO DESCRIPTOR>>           12586000
   TOS:=SEGDESCFLAGS;                                                   12588000
   IF IOERRFLAG THEN SUDDENDEATH(651);                         <<01913>>12590000
   <<SEE IF SEG IS IN MOTION IN, I.E., A READ INTO A DIFFERENT          12592000
     REGION FOR THE SEG IS PENDING, WAITING FOR THE DISK COPY TO        12594000
     BECOME VALID.  IF SO, TRY TO GET THE READ STARTED.>>               12596000
   ASMB(TBC IMIBIT); <<IN MOTION IN FLAG>>                              12598000
   SEGDESCFLAGS:=TOS;                                                   12600000
   IF <> THEN                                                           12602000
      BEGIN<<A DIFFERENT REGION HAS BEEN RESERVED FOR THE SEG>>         12604000
      TOS:=SEGDESCBANK;                                                 12606000
      TOS:=SEGDESCADDR;                                                 12608000
      IF IOERRFLAG THEN  << WRITE TO DISC ERROR>>                       12610000
         BEGIN <<RELEASE NEW REGION AND ABORT WAITING PROCS>>           12612000
         UNDEFERSEGSMPQ(REGIONBASE,SEGIDENT,IOERRFLAG);                 12614000
         SENDMSG(SCHEDPIN,RELREGREQPORT,2,0);                           12616000
         SUDDENDEATH(651); <<SHOULD RECOVER SOFT>>             <<01644>>12618000
         ENABLE;                                                        12620000
         END                                                            12622000
      ELSE                                                              12624000
         BEGIN  <<ENABLE READ>>                                         12626000
         TOS:=TOS+RBTOINITMSGDISP;                                      12628000
         ASMB(LSEA);                                                    12630000
         TOS.MSGEXTDISABLEDFLAG:=0;                                     12632000
         ASMB(SSEA);                                                    12634000
         TOS:=TOS+INITMSGTORBDISP;                                      12636000
         PROCESSINITMSG(*);                                             12638000
         END;                                                           12640000
      END;                                                              12642000
                                                                        12644000
   TOS:=REGIONBASE;                                                     12646000
   DST(STINX+1).FWIPFLAG:=0;                                            12648000
   IF = THEN TOS:=TOS+RBTOSDDISP ELSE                                   12650000
      BEGIN <<NOT AN OC, SO ZERO SEGIDENT IN REG HEAD>>                 12652000
      TOS:=TOS+RBTORASDISP;                                             12654000
      ASMB(LSEA);                                                       12656000
      TOS.REGRESERVEDFLAG:=0;                                           12658000
      ASMB(DEL);                                                        12660000
      IF <> THEN TOS:=TOS+RASTOSDDISP ELSE                              12662000
         BEGIN                                                          12664000
         TOS:=TOS+RASTOSEGIDENTDISP;                                    12666000
         TOS:=0;                                                        12668000
         ASMB(SSEA);                                                    12670000
         TOS:=TOS+SEGIDENTTOSDDISP;                                     12672000
         END;                                                           12674000
      END;                                                              12676000
   <<SEE IF PART OF A CLEANED REGION>>                                  12678000
   DISABLE;                                                             12680000
   ASMB(LSEA);                                                          12682000
   TOS.SDVALIDFLAG:=0;                                                  12684000
   IF <> THEN                                                           12686000
      BEGIN  <<SUBREGION HAS BEEN CLEANED. LOCATE BEGINNING             12688000
               OF RESERVED REGION AND DECREMENT IT'S ONGOING            12690000
               I/O COUNT.>>                                             12692000
      TOS:=TOS&LSL(PAGEPOWER);                                          12694000
      ASMB(SUB);                                                        12696000
      TOS:=TOS+SDTOIOCNTDISP;                                           12698000
      ASMB(LSEA);                                                       12700000
      IF <= THEN SUDDENDEATH(613); <<DIDN'T WAIT>>             <<01644>>12702000
      TOS:=TOS-1;                                                       12704000
      ASMB(SSEA);                                                       12706000
      IF = THEN                                                         12708000
         BEGIN  <<REGION IS FREE OF ONGOING INTERNAL I/O>>              12710000
         TOS:=TOS+IOCNTTOINITMSGDISP;                                   12712000
         ASMB(LSEA);                                                    12714000
         TOS.MSGONGOINGIODISABLED:=0;                                   12716000
         ASMB(SSEA);                                                    12718000
         TOS:=TOS+INITMSGTORBDISP;                                      12720000
         PROCESSINITMSG(*);                                             12722000
         END;                                                           12724000
      END;                                                              12726000
   END;                                                                 12728000
END  <<PROCEDURE SEGWRITECOMPLETOR>>;                                   12730000
                                                                        12732000
$TITLE "I/O INTERFACE PROCEDURES : PROCESS COMPLETION MESSAGE"          12734000
COMMENT                                                                 12736000
                                                                        12738000
PROCESSCOMPMSG IS CALLED TO COMPLETE THE ACTIONS                        12740000
PENDING THE MAKEPRESENT OF A SEGMENT.  THE REGION IS MARKED             12742000
IN THE ASSIGNED STATE, THE SEGMENT IS FLAGGED PRESENT, AND              12744000
PROCESSES AND DEVICES QUEUED ON THE SEGMENT'S MAKEPRESENT               12746000
ARE UNDEFERRED.                                                         12748000
                                                                        12750000
;                                                                       12752000
                                                                        12754000
PROCEDURE PROCESSCOMPMSG(REGIONBASE,SEGIDENT,DESCSTINX);                12756000
VALUE REGIONBASE,SEGIDENT,DESCSTINX;                                    12758000
DOUBLE REGIONBASE;                                                      12760000
INTEGER SEGIDENT,DESCSTINX;                                             12762000
OPTION PRIVILEGED,UNCALLABLE;                                  <<01696>>12764000
                                                                        12766000
BEGIN                                                                   12768000
INTEGER NEXT,                                                           12770000
        REGIONSIZE,                                                     12772000
        BPTINX;                                                         12774000
                                                                        12776000
                                                                        12778000
SUBROUTINE MARKREGIONASSIGNED;                                          12780000
                                                                        12782000
BEGIN                                                                   12784000
TOS:=REGIONBASE;                                                        12786000
TOS:=TOS+RBTORASDISP;                                                   12788000
ASMB(LSEA);                                                             12790000
TOS.REGRESERVEDFLAG:=0;                                                 12792000
IF = THEN SUDDENDEATH(614);                                    <<01644>>12794000
TOS.REGASSIGNEDFLAG:=1;                                                 12796000
X:=S0;                                                                  12798000
ASMB(SSEA);                                                             12800000
TOS:=TOS+RASTORSDISP;                                                   12802000
ASMB(LSEA);                                                             12804000
REGIONSIZE:=S0;                                                         12806000
TOS:=TOS&LSL(PAGEPOWER)+RSTOPTRASDISP;<<DISP TO TRAS>>                  12808000
ASMB(ADD,LDXA;SSEA); <<MARK ASSIGENED IN REG TRAILER>>                  12810000
TOS:=TOS+TRASTOTRSDISP;                                                 12812000
ASMB(LSEA);                                                             12814000
IF TOS<>REGIONSIZE THEN SUDDENDEATH(614);                      <<01644>>12816000
TOS:=TOS+TRSTOTSSDISP;                                                  12818000
TOS:=REGIONSIZE;                                                        12820000
ASMB(SSEA;DDEL);                                                        12822000
END  <<SUBROUTINE MARKREGIONASSIGNED>>;                                 12824000
                                                                        12826000
TOS:=REGIONBASE;                                                        12828000
TOS:=TOS+RBTOCOMPMSGDISP;                                               12830000
ASMB(LSEA);                                                             12832000
TOS.COMPMSGTOGGLESWITCH:=1;                                             12834000
IF <> THEN SUDDENDEATH(613);                                   <<01644>>12836000
ASMB(SSEA);                                                             12838000
MARKREGIONASSIGNED;                                                     12840000
                                                                        12842000
<<                                                                      12844000
MARK SEGMENT PRESENT                                                    12846000
>>                                                                      12848000
                                                                        12850000
X:=DESCSTINX+DSTSYSBASEINX;                                             12852000
SEGDESCFIRMINFO.ABSENTFLAG:=0;                                          12854000
IF = THEN SUDDENDEATH(613);                                    <<01644>>12856000
SEGDESCFIRMINFO.REFERENCEDFLAG:=1;  <<TRY NOT DOING>>                   12858000
SEGDESCFLAGS.IMIFLAG:=0;                                                12860000
IF =  THEN SUDDENDEATH(613);                                   <<01644>>12862000
IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE THEN                           12864000
   BEGIN <<DATA SEGMENT>>                                               12866000
   DST(X:=DESCSTINX+1).DISCCOPYVALIDFLAG:=0; <<MARK SEGMENT MODIFIED>>  12868000
   IF =  THEN SUDDENDEATH(613);                                <<01644>>12870000
   END;                                                                 12872000
<<                                                                      12874000
UNDEFER WAITING PROCESSES AND DEVICES                                   12876000
>>                                                                      12878000
                                                                        12880000
TOS:=REGIONBASE;                                                        12882000
UNDEFERSEGSMPQ(*,SEGIDENT,0);                                           12884000
                                                                        12886000
<<                                                                      12888000
CHECK FOR BREAK POINTS SET AGAINST THE SEGMENT                          12890000
>>                                                                      12892000
                                                                        12894000
IF SEGIDENT.SEGIDTYPEFIELD<>SEGIDDATATYPE THEN                          12896000
   BEGIN                                                                12898000
   TOS:=ABSOLUTE(CPCB);                                                 12900000
   IF = THEN ASMB(DEL) ELSE                                             12902000
      BEGIN                                                             12904000
      TOS:=ABSOLUTE(TOS+PIMPPINBKLINKWORDNUM).BREAKPTLINKFIELD;         12906000
      IF = THEN ASMB(DEL) ELSE                                          12908000
         BEGIN <<SEE IF CURRENT PROCESS HAS A BKPT IN SEGIDENT>>        12910000
         BPTINX:=TOS;                                          <<MM.IV>>12912000
         SETSEGSBKPTS(SEGIDENT,DESCSTINX,BPTINX);                       12914000
         END;                                                           12916000
      END;                                                              12918000
   IF SYS'BKPT THEN SETSEGSBKPTS(SEGIDENT,DESCSTINX,           <<MM.IV>>12920000
                                 SYS'BKPT'EXT'X);              <<MM.IV>>12922000
   END;                                                                 12924000
                                                                        12926000
<<                                                                      12928000
IF A DATA SEG, REQUEUE PENDING REQUESTS AGAINST THE SEGMENT             12930000
>>                                                                      12932000
                                                                        12934000
IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE THEN                           12936000
   BEGIN                                                                12938000
   X:=DISCREQTABSYSBASEINX;                                             12940000
   IF DITQHEADP <> 0 THEN CHECKFORPNDGDISKIO(SEGIDENT);                 12942000
   END;                                                                 12944000
END  <<PROCESSCOMPMSG>>;                                                12946000
                                                                        12948000
$PAGE "I/O INTERFACE PROCEDURES : SEG READ COMPLETOR"                   12950000
                                                                        12952000
PROCEDURE SEGREADCOMPLETOR(REQP);                                       12954000
VALUE REQP;                                                             12956000
LOGICAL REQP;                                                           12958000
OPTION PRIVILEGED,UNCALLABLE;                                           12960000
                                                                        12962000
COMMENT                                                                 12964000
                                                                        12966000
THIS PROCEDURE IS CALLED FROM THE DISC MONITOR WHEN                     12968000
THE READ OF A SEGMENT ON BEHALF OF MEMORY MANAGEMENT                    12970000
HAS BEEN COMPLETED.  THE SEGMENT IS MARKED PRESENT                      12972000
AND THE "READ COMPLETIONS UNTIL LAUNCHABLE" COUNTERS                    12974000
OF EACH PROCESS DEFERRED ON THE SEGMENT ARE DECRE-                      12976000
MENTED.  ANY DEFERRED PROCESS WHOSE COUNTER FALLS                       12978000
TO ZERO IS AWAKENED FROM A MEMORY WAIT.                                 12980000
                                                                        12982000
;                                                                       12984000
                                                                        12986000
                                                                        12988000
BEGIN                                                                   12990000
DOUBLE  REGIONBASE=Q+1;                                                 12992000
INTEGER REGIONBANK=Q+1,                                                 12994000
        REGIONADDR=Q+2;                                                 12996000
LOGICAL SEGIDENT=Q+3;                                                   12998000
                                                                        13000000
INTEGER STINX=Q+4;                                                      13002000
LOGICAL DATASEGFLG=Q+5,                                                 13004000
        IOERRFLG=Q+6,                                                   13006000
        READABORTFLAG=Q+7;                                              13008000
<<GET INFO FROM I/O REQUEST ELEMENT                                     13010000
  AND INITIALIZE LOCAL VARIABLES>>                                      13012000
                                                                        13014000
X:=REQP;                                                                13016000
TOS:=REQMMBANK;                                                         13018000
TOS:=REQMMBASE;                                                         13020000
TOS:=REQREADDISP;                                                       13022000
IF = THEN ASMB(DEL) ELSE ASMB(SUB); <<REGION BASE>>                     13024000
TOS:=REQSEGIDENT;                                                       13026000
IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE THEN TOS:=S0&LSL(2)            13028000
ELSE TOS:=CONVSEGIDTOSTINX(S0); <<STINX>>                               13030000
IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE                                13032000
THEN TOS:=TRUE ELSE TOS:=FALSE; <<DATA?>>                               13034000
X:=REQP;                                                                13036000
IF DISCREQSTATUS <> 1 THEN TOS:=TRUE ELSE TOS:=FALSE;  <<IOERRFLAG>>    13038000
TOS:=DISCREQFLAGS;                                                      13040000
ASMB(TBC ABORTREQATTMPTBIT;DEL);                                        13042000
IF <> THEN TOS:=TRUE ELSE TOS:=FALSE;  <<READABORTFLAG>>                13044000
                                                                        13046000
MMSTAT(6,REQSEGIDENT,REQP,0);                                  <<01571>>13048000
<<RETURN DISK REQUEST ENTRY TO SYSTEM>>                                 13050000
                                                                        13052000
TOS:=REQP;                                                     <<01644>>13054000
RETURNDISCREQ(*);                                              <<01644>>13056000
                                                                        13058000
<<UPDATE SEGMENT'S STATUS IN ST DESCRIPTOR>>                            13060000
                                                                        13062000
X:=STINX+DSTSYSBASEINX;                                                 13064000
DISABLE;                                                                13066000
TOS:=SEGDESCFLAGS;                                                      13068000
IF IOERRFLG THEN SUDDENDEATH(650);                                      13070000
IF READABORTFLAG THEN                                                   13072000
   BEGIN <<READ HAS BEEN CALLED OFF>>                                   13074000
   SUDDENDEATH(615); <<NO LONGER SUPPORTED-IF NEEDED CF JB>>   <<01644>>13076000
   END                                                                  13078000
ELSE                                                                    13080000
   BEGIN  <<READ STILL NEEDED>>                                         13082000
   ASMB(TBC IMIBIT);                                                    13084000
   IF = THEN SUDDENDEATH(613);                                 <<01644>>13086000
   TOS:=REGIONBASE;                                                     13088000
   TOS:=TOS+RBTOCOMPMSGDISP;                                            13090000
   ASMB(LSEA);                                                          13092000
   TOS.COMPMSGMODFLAG:=0;                                               13094000
   IF = THEN PROCESSCOMPMSG(REGIONBASE,SEGIDENT,STINX) ELSE             13096000
      BEGIN  <<MOD TO SEG REQUIRED BEFORE FLAGGED PRESENT>>             13098000
      TOS:=SEGIDENT;                                                    13100000
      SENDMSG(SCHEDPIN,SEGMODREADYPORT,1,0);                            13102000
      END;                                                              13104000
   END;                                                                 13106000
END   <<SEGREADCOMPLETOR>>;                                             13108000
                                                                        13110000
                                                                        13112000
$PAGE "MEMORY ALLOCATION PROCEDURES : TAKE OFF AVAILABLE REGION LIST"   13114000
PROCEDURE TAKEOFFARL(ADDRESS,SIZE);                                     13116000
VALUE ADDRESS,SIZE;                                                     13118000
DOUBLE ADDRESS;                                                         13120000
INTEGER SIZE;                                                           13122000
OPTION PRIVILEGED,UNCALLABLE;                                           13124000
                                                                        13126000
COMMENT                                                                 13128000
                                                                        13130000
TAKEOFFARL IS CALLED BY RECOVEROC, MAKEOC, RESERVEREGION,               13132000
AND RELEASEREGION TO REMOVE THE REGION WHOSE BASE IS GIVEN              13134000
BY THE ADDRESS PARAMETER FROM THE LIST OF AVAILABLE REGIONS             13136000
OF SIZE PAGES.                                                          13138000
                                                                        13140000
;                                                                       13142000
                                                                        13144000
BEGIN                                                                   13146000
DOUBLE NEXTINLIST;                                                      13148000
                                                                        13150000
IF SIZE > MAXAVAILREG THEN SUDDENDEATH(619);                   <<01644>>13152000
                                                                        13154000
TOS:=ADDRESS;                                                           13156000
TOS:=TOS+RBTOPLDISP;                                                    13158000
ASMB(LDEA);                                                             13160000
IF <> THEN                                                              13162000
   BEGIN  <<REGION IS NOT THE FIRST IN THE LIST>>                       13164000
   TOS:=TOS+RBTONLDISP;                                                 13166000
   ASMB(DXCH);                                                          13168000
   TOS:=TOS+PLTONLDISP;                                                 13170000
   ASMB(LDEA;DDUP);  <<ADDRESS OF NEXT IN LIST>>                        13172000
   NEXTINLIST:=TOS;                                                     13174000
   ASMB(DXCH,DDEL);                                                     13176000
   ASMB(SDEA);  <<NEXT LINK GOES TO PREV REGION'S NEXT LINK>>           13178000
   TOS:=TOS+NLTORBDISP;                                                 13180000
   TOS:=NEXTINLIST;                                                     13182000
   IF <> THEN                                                           13184000
      BEGIN <<NOT LAST IN LIST>>                                        13186000
      TOS:=TOS+RBTOPLDISP;                                              13188000
      ASMB(DXCH;SDEA); <<NEW PREV LINK FOR NEXT IN LIST>>               13190000
      END;                                                              13192000
   END                                                                  13194000
ELSE                                                                    13196000
   BEGIN <<REMOVING FIRST IN LIST>>                                     13198000
   IF ADDRESS <> ARLD(SIZE) THEN SUDDENDEATH(619);             <<01644>>13200000
   ASMB(DDEL);                                                          13202000
   TOS:=TOS+PLTONLDISP;  <<ADDRESS OF NEXT LINK>>                       13204000
   ASMB(LDEA);  <<ADDRESS OF NEXT REGION IN LIST>>                      13206000
   IF <> THEN                                                           13208000
      BEGIN  <<ANOTHER REGION IN LIST>>                                 13210000
      ASMB(DDUP);                                                       13212000
      ARLD(SIZE):=TOS;  <<NEXT IN LIST GOES TO HEAD>>                   13214000
      TOS:=TOS+RBTOPLDISP;                                              13216000
      TOS:=0D;  <<ZERO OUT PREV LINK OF NEW HEAD>>                      13218000
      ASMB(SDEA);                                                       13220000
      END                                                               13222000
   ELSE                                                                 13224000
      BEGIN  <<LIST IS NOW EMPTY>>                                      13226000
      IF ADDRESS <> ARLD(SIZE) THEN SUDDENDEATH(619);          <<01644>>13228000
      ARLD(SIZE):=TOS; <<ZERO OUT HEADER IN LIST>>                      13230000
      ASMB(LDXA,DUP);                                                   13232000
      TOS:=ARSBM(TOS&LSR(4));                                           13234000
      ASMB(XBX;TRBC 0,X); <<CLEAR BIT IN WORD>>                         13236000
      IF = THEN SUDDENDEATH(619);                              <<01644>>13238000
      ASMB(XBX);                                                        13240000
      ARSBM(X):=TOS; <<UPDATE AVAILABLE REG SIZE BITMAP>>               13242000
      IF TOS=MAXAVAILREG THEN                                           13244000
         BEGIN  <<MUST UPDATE MAX REG SIZE>>                            13246000
         TOS:=ARSBM(X);                                                 13248000
         WHILE = AND X > 0 DO                                           13250000
            BEGIN                                                       13252000
            ASMB(DEL,DECX);                                             13254000
            TOS:=ARSBM(X);                                              13256000
            END;                                                        13258000
         ASMB(TEST);                                                    13260000
         IF = THEN MAXAVAILREG:=0 ELSE                                  13262000
            BEGIN                                                       13264000
            X:=X&LSL(4)-1;                                              13266000
            DO                                                          13268000
               BEGIN                                                    13270000
               ASMB(SCAN,X);                                            13272000
               END                                                      13274000
            UNTIL S0 = 0;                                               13276000
            MAXAVAILREG:=X;                                             13278000
            END;                                                        13280000
         END;                                                           13282000
      END;                                                              13284000
   END;                                                                 13286000
END  <<PROCEDURE TAKEOFFARL>>;                                          13288000
$PAGE "MEMORY ALLOCATION PROCEDURES : PUT ON AVAILABLE REGION LIST"     13290000
PROCEDURE PUTONARL(ADDRESS,SIZE,HEADOFLIST);                            13292000
VALUE ADDRESS,SIZE,HEADOFLIST;                                          13294000
DOUBLE ADDRESS;                                                         13296000
INTEGER SIZE;                                                           13298000
LOGICAL HEADOFLIST;                                                     13300000
OPTION PRIVILEGED,UNCALLABLE;                                           13302000
                                                                        13304000
COMMENT                                                                 13306000
                                                                        13308000
PUTONARL IS CALLED BY RELEASEREGION, RESERVEREGION, AND COLLECT         13310000
GARBAGE TO PLACE THE REGION WHOSE BASE ADDRESS IS GIVEN BY              13312000
THE ADDRESS PARAMETER AT THE HEAD OR TAIL OF THE LIST OF                13314000
AVAILABLE REGIONS OF SIZE PAGES.                                        13316000
                                                                        13318000
;                                                                       13320000
                                                                        13322000
BEGIN                                                                   13324000
IF LOGICAL(SIZE)>LOGICAL(MAXHOLESIZE) THEN SUDDENDEATH(619);   <<01644>>13326000
<<DB ASSUMED TO BE AT SYSDB>>                                           13328000
TOS:=ARLD(SIZE);  <<CURRENT HEAD OF LIST>>                              13330000
IF = THEN                                                               13332000
   BEGIN  <<LIST WAS EMPTY>>                                            13334000
   TOS:=ADDRESS;                                                        13336000
   TOS:=TOS+RBTONLDISP;                                                 13338000
   TOS:=0D;                                                             13340000
   ASMB(SDEA); <<ZERO OUT NEXT LINK>>                                   13342000
   TOS:=TOS+NLTOPLDISP;                                                 13344000
   TOS:=0D;                                                             13346000
   ASMB(SDEA);  <<ZERO OUT PREVIOUS LINK>>                              13348000
   TOS:=TOS+PLTORBDISP;                                                 13350000
   ARLD(X):=TOS;  <<THIS REGION'S ADDRESS TO HEAD OF LIST>>             13352000
   TOS:=X;                                                              13354000
   TOS:=ARSBM(X:=S0&LSR(4)); <<WORD IN BITMAP>>                         13356000
   ASMB(XBX;TSBC 0,X);  <<MASK BIT IN WORD>>                            13358000
   IF <> THEN SUDDENDEATH(619);                                <<01644>>13360000
   ASMB(XBX);                                                           13362000
   ARSBM(X):=TOS;  <<UPDATE BITMAP OF AVAILABLE REG SIZES>>             13364000
   IF SIZE > MAXAVAILREG THEN MAXAVAILREG:=SIZE;  <<UPDATE MAX REG>>    13366000
   END                                                                  13368000
ELSE                                                                    13370000
   BEGIN  <<LIST IS NON-EMPTY>>                                         13372000
   IF HEADOFLIST THEN                                                   13374000
      BEGIN                                                             13376000
      ARLD(X):=ADDRESS;                                                 13378000
      TOS:=TOS+RBTOPLDISP;                                              13380000
      TOS:=ADDRESS;                                                     13382000
      ASMB(SDEA); <<UPDATE NEXT IN LIST'S PREVIOUS>>                    13384000
      TOS:=TOS+PLTORBDISP;                                              13386000
      TOS:=ADDRESS;                                                     13388000
      TOS:=TOS+RBTONLDISP;                                              13390000
      ASMB(DXCH;SDEA);  <<NEW HEAD'S NEXT>>                             13392000
      TOS:=TOS+NLTOPLDISP;                                              13394000
      TOS:=0D;                                                          13396000
      ASMB(SDEA); <<ZERO OUT NEXT LINK>>                                13398000
      END                                                               13400000
   ELSE                                                                 13402000
      BEGIN                                                             13404000
      DO                                                                13406000
         BEGIN <<LOCATE END OF LIST>>                                   13408000
         TOS:=TOS+RBTONLDISP;                                           13410000
         ASMB(LDEA);                                                    13412000
         END                                                            13414000
      UNTIL =;                                                          13416000
      ASMB(DDEL);                                                       13418000
      TOS:=ADDRESS;                                                     13420000
      ASMB(SDEA); <<PLACE AT TAIL OF LIST-NEW NEXT LINK OF PREV>>       13422000
      TOS:=TOS+NLTORBDISP;                                              13424000
      TOS:=ADDRESS;                                                     13426000
      TOS:=TOS+RBTOPLDISP;  <<PREVIOUS LINK OF CURRENT HEAD>>           13428000
      ASMB(DXCH;SDEA); <<PREVIOUS LINK OF NEW REGION>>                  13430000
      TOS:=TOS+PLTONLDISP;                                              13432000
      TOS:=0D;                                                          13434000
      ASMB(SDEA);                                                       13436000
      END;                                                              13438000
   END;                                                                 13440000
END  <<PROCEDURE PUTONARL>> ;                                           13442000
                                                                        13444000
                                                                        13446000
$PAGE "MEMORY ALLOCATION PROCEDURES : RELEASE REGION "                  13448000
PROCEDURE RELEASEREGION(REGIONBASE,REQSIZE);                            13450000
VALUE REGIONBASE,REQSIZE;                                               13452000
DOUBLE REGIONBASE;                                                      13454000
INTEGER REQSIZE;                                                        13456000
OPTION PRIVILEGED,UNCALLABLE;                                           13458000
                                                                        13460000
COMMENT                                                                 13462000
                                                                        13464000
THIS PROCEDURE COMBINES THE REGION BEGINNING AT                         13466000
REGIONBASE WITH NEIGHBORING AVAILABLE REGIONS AND LINKS                 13468000
THE RESULTANT INTO THE APPROPRIATE AVAILABLE REGION LIST.               13470000
                                                                        13472000
;                                                                       13474000
                                                                        13476000
                                                                        13478000
BEGIN                                                                   13480000
                                                                        13482000
<<DB ASSUMED AT SYSDB ON ENTRY>>                                        13484000
                                                                        13486000
INTEGER RSIZEINPAGES,                                                   13488000
        TURNEDOFFSIZE:=0;                                               13490000
DOUBLE TRAILERADDR,                                                     13492000
       NEXTADDR;                                                        13494000
                                                                        13496000
                                                                        13498000
SUBROUTINE TURNOFFSDVALIDFLAGS;                                         13500000
                                                                        13502000
COMMENT                                                                 13504000
                                                                        13506000
TURNOFFSDVALIDFLAGS IS CALLED TO TURN OFF THE SUBREGION                 13508000
DISPLACEMENT VALID FLAGS FOR THE SUBREGIONS WHICH ARE PART              13510000
OF A RESERVED REGION WHICH IS BEING RETURNED TO THE AVAILABLE           13512000
REGION POOL.  THE RESERVE ON THE REGION HAD BEEN ABORTED, AND           13514000
THE SUBREGION DISPLACEMENTS AND INITIATION MESSAGE ARE NO LONGER        13516000
VALID.                                                                  13518000
                                                                        13520000
;                                                                       13522000
                                                                        13524000
BEGIN                                                                   13526000
TOS:=REGIONBASE;                                                        13528000
TOS:=TOS+RBTORSDISP;                                                    13530000
ASMB(LSEA);                                                             13532000
RSIZEINPAGES:=TOS;                                                      13534000
TOS:=TOS+RSTOSDDISP;                                                    13536000
DISABLE;                                                                13538000
WHILE TURNEDOFFSIZE < RSIZEINPAGES DO                                   13540000
   BEGIN                                                                13542000
   TOS:=0;                                                              13544000
   ASMB(SSEA);                                                          13546000
   TOS:=TOS+SDTOSSDISP;                                                 13548000
   ASMB(LSEA);                                                          13550000
   TURNEDOFFSIZE:=TURNEDOFFSIZE+S0;                                     13552000
   TOS:=TOS&LSL(PAGEPOWER);                                             13554000
   TOS:=TOS+SSTOSDDISP;                                                 13556000
   ASMB(LADD);                                                          13558000
   IF CARRY AND TURNEDOFFSIZE<>RSIZEINPAGES                    <<01644>>13560000
   THEN SUDDENDEATH(614); <<OFF BANK>>                         <<01644>>13562000
   END;                                                                 13564000
ASMB(DDEL);                                                             13566000
END <<TURNOFFSDVALIDFLAGS>>;                                            13568000
                                                                        13570000
<<                                                                      13572000
INVALIDATE CONTROL CELLS IN THE REGION                                  13574000
>>                                                                      13576000
                                                                        13578000
TOS := 13;                                                     <<01571>>13580000
TOS := REQSIZE;                                                <<01571>>13582000
TOS := REGIONBASE;                                             <<01571>>13584000
MMSTAT(*,*,*,*);                                               <<01571>>13586000
TOS:=REGIONBASE;                                                        13588000
TOS:=TOS+RBTOINITMSGDISP;                                               13590000
TOS:=0;                                                                 13592000
ASMB(SSEA); <<ZERO OUT INIT MSG FOR CLEAN REGION>>                      13594000
TOS:=TOS+INITMSGTORASDISP;                                              13596000
TOS:=REGAVAILABLECODE;                                                  13598000
ASMB(SSEA);                                                             13600000
TOS:=TOS+RASTORSDISP;                                                   13602000
ASMB(LSEA);                                                             13604000
RSIZEINPAGES:=TOS;                                                      13606000
ASMB(DDEL);                                                             13608000
TURNOFFSDVALIDFLAGS;                                                    13610000
                                                                        13612000
IF BUGCATCH THEN                                                        13614000
   BEGIN  <<CHECK INTEGRITY>>                                           13616000
   TOS:=REGIONBASE;                                                     13618000
   TOS:=TOS+RBTOSSDISP;                                                 13620000
   ASMB(LSEA);                                                          13622000
   X:=S0;                                                               13624000
   TOS:=TOS&LSL(PAGEPOWER)+SSTORASDISP+RASTOPTSSDISP;                   13626000
   ASMB(LADD;LSEA);                                                     13628000
   IF TOS<>X THEN SUDDENDEATH(614);                            <<01644>>13630000
   TOS:=X;                                                              13632000
   ASMB(SSEA;DDEL);                                                     13634000
                                                                        13636000
   TOS:=REGIONBASE;                                                     13638000
   ASMB(XCH,DEL);                                                       13640000
   IF S0.(10:6) <> HEADERLENGTH THEN SUDDENDEATH(614);         <<01644>>13642000
   TOS:=TOS&LSR(PAGEPOWER);                                             13644000
   X:=TOS;                                                              13646000
   IF RSIZEINPAGES=MAXHOLESIZE AND X<>0                        <<01644>>13648000
   THEN SUDDENDEATH(614);                                      <<01644>>13650000
   IF RSIZEINPAGES+X>MAXHOLESIZE THEN SUDDENDEATH(614);        <<01644>>13652000
   END;                                                                 13654000
                                                                        13656000
<<                                                                      13658000
TRY TO COMBINE WITH AVAILABLE REGION ABOVE                              13660000
>>                                                                      13662000
                                                                        13664000
TOS:=REGIONBASE;                                                        13666000
TOS:=TOS+RBTORSDISP;                                                    13668000
ASMB(LSEA);                                                             13670000
TOS:=TOS&LSL(PAGEPOWER);<<REGION SIZE IN WORDS>>                        13672000
IF = THEN                                                               13674000
   BEGIN <<A WHOLE BANK OR INVALID>>                                    13676000
   IF RSIZEINPAGES <> MAXHOLESIZE THEN SUDDENDEATH(614);       <<01644>>13678000
   S0:=-1;<<FORCE A CARRY BELOW>>                                       13680000
   END;                                                                 13682000
ASMB(LADD);                                                             13684000
IF CARRY THEN ASMB(DDEL) <<END OF BANK>> ELSE                           13686000
   BEGIN                                                                13688000
   <<CHECK IF PAST PARTIAL LAST BANK>>                                  13690000
   ASMB(DDUP,DDUP);                                                     13692000
NEXTADDR:=TOS;                                                          13694000
   IF LASTMEMORYADDRESS<=NEXTADDR THEN ASMB(DDEL) <<END MEM>> ELSE      13696000
      BEGIN <<THERE'S A REGION ABOVE>>                                  13698000
      TOS:=TOS+RSTOPTRASDISP;                                           13700000
      TOS:=REGAVAILABLECODE;                                            13702000
      ASMB(SSEA);  <<MARK REG AVAILABLE IN TRAILER FOR RECOVEROC>>      13704000
      TOS:=TOS+TRASTOTRSDISP;                                           13706000
      TOS:=RSIZEINPAGES;                                                13708000
      ASMB(SSEA);                                                       13710000
      TOS:=TOS+PTRSTORASDISP;                                           13712000
      ASMB(LSEA);                                                       13714000
      TOS.REGAVAILABLEFLAG:=0;                                          13716000
      ASMB(DEL);                                                        13718000
      IF = THEN ASMB(DDEL) ELSE                                         13720000
         BEGIN  <<FOLLOWING REGION IS AVAILABLE>>                       13722000
         TOS:=TOS+RASTORSDISP;                                          13724000
         ASMB(LSEA); <<NEXT REGION'S SIZE>>                             13726000
         RSIZEINPAGES:=RSIZEINPAGES+S0;                                 13728000
         S1:=S1+RSTORBDISP;                                             13730000
         TAKEOFFARL(*,*);                                               13732000
         END;                                                           13734000
      END;                                                              13736000
   END;                                                                 13738000
                                                                        13740000
<<                                                                      13742000
TRY TO COMBINE WITH PREVIOUS REGION                                     13744000
>>                                                                      13746000
                                                                        13748000
TOS:=REGIONBASE;                                                        13750000
IF PTRASTORBDISP > LS0 THEN ASMB(DDEL) ELSE                             13752000
   BEGIN  <<REGION BEING RELEASED IS NOT THE FIRST IN THE BANK>>        13754000
   IF BUGCATCH THEN                                                     13756000
      BEGIN  <<CHECK INTEGRITY>>                                        13758000
      TOS:=REGIONBASE;                                                  13760000
      TOS:=TOS+RBTOPTRSDISP;                                            13762000
      ASMB(LSEA);                                                       13764000
      X:=TOS;                                                           13766000
      TOS:=TOS+PTRSTORSDISP;                                            13768000
      TOS:=X&LSL(PAGEPOWER);                                            13770000
      ASMB(LSUB;LSEA);                                                  13772000
      TOS:=X;                                                           13774000
      ASMB(CMP);                                                        13776000
      IF <> AND S1<>0 THEN SUDDENDEATH(614);                   <<01644>>13778000
      ASMB(DDEL);                                                       13780000
      END;                                                              13782000
   TOS:=TOS+RBTOPTRASDISP;                                              13784000
   ASMB(LSEA);                                                          13786000
   TOS.REGAVAILABLEFLAG:=0;                                             13788000
   ASMB(DEL);                                                           13790000
   IF = THEN ASMB(DDEL) ELSE                                            13792000
      BEGIN  <<PREVIOUS REGION IS AVAILABLE>>                           13794000
      TOS:=TOS+TRASTOTRSDISP;                                           13796000
      ASMB(LSEA);                                                       13798000
      RSIZEINPAGES:=RSIZEINPAGES+S0;                                    13800000
      X:=S0;                                                            13802000
      TOS:=TOS&LSL(PAGEPOWER);                                          13804000
      S1:=S1+PTRSTORBDISP;                                              13806000
      ASMB(LSUB,DDUP); <<YIELDS REGION BASE OF PREV AVAILABLE REGION>>  13808000
      REGIONBASE:=TOS;  <<NEW BEGINNING OF AVAIL REG>> <<***>>          13810000
      TAKEOFFARL(*,X);                                                  13812000
      END;                                                              13814000
   END;                                                                 13816000
                                                                        13818000
<<                                                                      13820000
FIX UP COMBINED REGION'S HEADER AND TRAILER                             13822000
>>                                                                      13824000
                                                                        13826000
TOS:=REGIONBASE;                                                        13828000
TOS:=TOS+RBTORSDISP;                                                    13830000
TOS:=RSIZEINPAGES;                                                      13832000
ASMB(SSEA);  <<FIX UP NEW REGION HEADER>>                               13834000
TOS:=TOS+RSTORASDISP;                                                   13836000
TOS:=REGAVAILABLECODE;                                                  13838000
ASMB(SSEA);                                                             13840000
TOS:=TOS+RASTOPTRASDISP;                                                13842000
TOS:=RSIZEINPAGES&LSL(PAGEPOWER);                                       13844000
IF <> THEN ASMB(ADD) ELSE                                               13846000
   BEGIN <<A WHOLE BANK IS FREE>>                                       13848000
   IF RSIZEINPAGES<>MAXHOLESIZE THEN SUDDENDEATH(614);         <<01644>>13850000
   ASMB(DDEL);                                                          13852000
   TOS:=LASTTRASADDR;                                                   13854000
   END;                                                                 13856000
ASMB(DDUP);                                                             13858000
TRAILERADDR:=TOS;                                                       13860000
<<ADDRESS OF NEW REGION'S TRAILER STATE CELL ON TOS>>                   13862000
TOS:=REGAVAILABLECODE;                                                  13864000
ASMB(SSEA);                                                             13866000
TOS:=TOS+TRASTOTRSDISP;                                                 13868000
TOS:=RSIZEINPAGES;                                                      13870000
ASMB(SSEA);                                                             13872000
PUTONARL(REGIONBASE,RSIZEINPAGES,PUTATEND);                             13874000
IF REQSIZE > MAXAVAILREG THEN COLLECTGARBAGE(REGIONBASE);               13876000
IF SCANPOINT > REGIONBASE AND SCANPOINT < TRAILERADDR                   13878000
THEN SCANPOINT:=REGIONBASE;                                             13880000
END  <<RELEASEREGION>>;                                                 13882000
$PAGE "MEMORY ALLOCATION PROCEDURES : CLEANREGION"                      13884000
                                                                        13886000
PROCEDURE CLEANREGION(REGIONBASE,CLEANPAGECNT,URGCLASS,                 13888000
   SPECIALCLEANINFO);                                                   13890000
VALUE REGIONBASE,CLEANPAGECNT,URGCLASS,SPECIALCLEANINFO;                13892000
DOUBLE REGIONBASE;                                                      13894000
INTEGER CLEANPAGECNT,URGCLASS,SPECIALCLEANINFO;                         13896000
OPTION PRIVILEGED,UNCALLABLE;                                           13898000
                                                                        13900000
COMMENT                                                                 13902000
                                                                        13904000
CLEANREGION IS INVOKED BY RESERVEREGION AND COLLECTGARBAGE              13906000
TO PREPARE A RESERVED REGION FOR A SEGMENT READ OR AN AVAIL-            13908000
ABLE REGION FOR A POSSIBLE SEGMENT MOVE.                                13910000
                                                                        13912000
CLEANREGION IS CALLED BY RESERVEREGION AFTER A SUCCEEFUL                13914000
ALLOCATION OF AN AVAILABLE REGION OF ADEQUATE SIZE FOR A                13916000
REQUEST MADE BY THE SCHEDULER AND CALLED BY COLLECTGARBAGE              13918000
TO CLEAN A REGION SO THAT MEMORY COMPACTION MAY TAKE                    13920000
PLACE OVER IT.                                                          13922000
                                                                        13924000
CLEANREGION MAKES ALL OVERLAY CANDIDATES IN A RESERVED                  13926000
REGION NON-RECOVERABLE, CAUSES DISC REQUESTS FOR SEGMENT                13928000
WRITES IN THE REGION WHICH HAVE NOT YET COMPLETED TO BE                 13930000
PLACED INTO THE DEVICE'S PREEMPTIVE SUBQUEUE(IF CLEAN NOT               13932000
FOR GARBAGE COLLECTION), AND RELEASES ANY LEFTOVER PAGES                13934000
WHICH EXCEED THE REQUESTED CLEANPAGECNT.                                13936000
                                                                        13938000
;                                                                       13940000
                                                                        13942000
BEGIN                                                                   13944000
<<DB IS PLACED AT THE FIRST WORD OF THE REGION>>                        13946000
INTEGER IOCNT=DB+RASTOIOCNTDISP,                                        13948000
        REGIONSTATE=DB+0,                                               13950000
        REGIONSIZE=DB+RASTORSDISP,                                      13952000
        RELEASEPAGECNT=DB+RASTORPAGECNTDISP,                            13954000
        MAKEPRESENTLINK=DB+RASTOMPQLINKDISP,                            13956000
        LKFZCOUNTERS=DB+RASTOLKFZCNTDISP,                               13958000
        WDIOFZCOUNTERS=DB+RASTOWDIOFZCNTDISP,                           13960000
        DISCREQHEADPTR=DB+RASTODSKREQHEADPDISP,                         13962000
        DISCREQTAILPTR=DB+RASTODSKREQTAILPDISP,                         13964000
        COMPMSG=DB+RASTOCOMPMSGDISP,                                    13966000
        IOREQQ=DB+RASTOIOREQQDISP,                                      13968000
        INITMSG=DB+RASTOINITMSGDISP;                                    13970000
                                                                        13972000
INTEGER ARRAY SUBREGSEGIDENT(*)=DB+RASTOSEGIDENTDISP,                   13974000
              SSIZE(*)=DB+RASTOSSDISP,                                  13976000
              SUBREGHODA(*)=DB+RASTOHODADISP,                           13978000
              SUBREGLODA(*)=DB+RASTOLODADISP,                           13980000
              SUBREGWREQP(*)=DB+RASTOWREQPDISP,                         13982000
              SUBREGSD(*)=DB+RASTOSDDISP;                               13984000
                                                                        13986000
DEFINE OCHODA=SUBREGHODA(X)#,                                           13988000
       OCLODA=SUBREGLODA(X)#,                                           13990000
       OCWREQP=SUBREGWREQP(X)#,                                         13992000
       SUBREGDISP=SUBREGSD(X)#,                                         13994000
       SUBREGSIZE=SSIZE(X)#,                                            13996000
       SUBREGSTATE=SSTATE(X)#,                                          13998000
       OCSEGIDENT=SUBREGSEGIDENT(X)#;                                   14000000
                                                                        14002000
DOUBLE SAVEDB,                                                          14004000
       OCDISCADDRESS;                                                   14006000
                                                                        14008000
LOGICAL DATAIMFLG,                                                      14010000
        SEGIDENTIFIER,                                                  14012000
        DATASEGFLG;                                                     14014000
                                                                        14016000
INTEGER STINX,                                                          14018000
        OCWRITEREQPTR,                                                  14020000
        NEWREGSIZE,                                                     14022000
        SUBREGWORDDISP,                                                 14024000
        RESIDUE,                                                        14026000
        OLDREGSIZE,                                                     14028000
        RESIDUALSIZE,                                                   14030000
        PAGEDISPCNT:=0,                                                 14032000
        WRITECNT:=0;                                                    14034000
                                                                        14036000
                                                               <<02056>>14038000
SUBROUTINE BUMPWRITEPRI;                                       <<02056>>14040000
                                                               <<02056>>14042000
COMMENT                                                        <<02056>>14044000
                                                               <<02056>>14046000
BUMPS THE PRIORITY OF A PENDING WRITE IN THE REGION BEING      <<02056>>14048000
CLEANED TO THE URGENCY CLASSED PASSED AS PARAMETER FOR GARB COL<<02056>>14050000
CLEANUPS AND TO THE FORCED WRITE PRIORITY FOR NORMAL CLEANS    <<02056>>14052000
(NO-CAN'T DO IT SINCE FORCED WRITE AT LOW URGENCY MAY HOLD     <<02056>>14054000
UP A SUBSEQUENT READ OF THE DATA SEGMENT ==> ALL AT            <<02056>>14056000
FORCED WRITE PRI, EVEN GARB COLL FORCED WRITES)                <<02056>>14058000
                                                               <<02056>>14060000
;                                                              <<02056>>14062000
                                                               <<02056>>14064000
                                                               <<02056>>14066000
BEGIN                                                          <<02056>>14068000
                                                               <<02056>>14070000
TOS:=%1000D;                                                   <<02056>>14072000
ASMB(XCHD);                                                    <<02056>>14074000
X:=OCWRITEREQPTR;                                              <<02056>>14076000
IF REQSEGIDENT<>INTEGER(SEGIDENTIFIER)                         <<02056>>14078000
THEN SUDDENDEATH(619);                                         <<02056>>14080000
REQURGCLASS:=FORCEDWRITEPRI;                                   <<02056>>14082000
DISCQMANAGER(X,QUEUEREQCODE);  <<FORCE WRITE>>                 <<02056>>14084000
IF < THEN SUDDENDEATH(618);<<ALREADY COMP>>                    <<02056>>14086000
ASMB(XCHD;DDEL);                                               <<02056>>14088000
                                                               <<02056>>14090000
END <<BUMPWRITEPRI>> ;                                         <<02056>>14092000
                                                               <<02056>>14094000
TOS:=REGIONBASE;                                                        14096000
TOS:=TOS+RBTORASDISP;                                                   14098000
EXCHDB; <<DB TO BEGINNING OF REGION'S GLOBAL HEADER>>                   14100000
SAVEDB:=TOS;                                                            14102000
OLDREGSIZE:=REGIONSIZE;                                                 14104000
IOCNT:=RELEASEPAGECNT:=0;<<INIT COUNTER CELLS IN THE REGION HEADER>>    14106000
INITMSG:=COMPMSG:=IOREQQ:=0;                                            14108000
IF SPECIALCLEANINFO=GARBCOLLCODE THEN INITMSG.GARBCOLLFLAG:=1;          14110000
                                                                        14112000
DISABLE;                                                                14114000
                                                                        14116000
DO                                                                      14118000
   BEGIN  <<CLEAN NEXT SUBREGION>>                                      14120000
   DATASEGFLG:=DATAIMFLG:=FALSE;                                        14122000
   X:=SUBREGWORDDISP:=PAGEDISPCNT&LSL(PAGEPOWER);                       14124000
   <<GET ALL THE INFO NEEDED FROM SUBREGION HEADER-                     14126000
     THIS IS DONE TO MINIMIZE THE TIME THAT DISABLE IS IN EFFECT>>      14128000
   REGIONSIZE.(0:7):=-1;                                                14130000
   REGIONSTATE.(9:7):=-1;                                               14132000
   TOS:=OCHODA; <<FOR ST DESCRIPTOR>>                                   14134000
   TOS:=OCLODA; <<SAVE LODA FOR LATER INSERTION INTO ST DESCR>>         14136000
   OCDISCADDRESS:=TOS;                                                  14138000
   TOS:=OCWREQP;  <<POSSIBLY NEEDED FOR DATA SEGS>>                     14140000
   OCWRITEREQPTR:=TOS;                                                  14142000
    << FILL IN THE SUBREGION'S DISPLACEMENT FROM BASE>>                 14144000
   TOS:=PAGEDISPCNT;                                                    14146000
   TOS.SDVALIDFLAG:=1;                                                  14148000
   SUBREGDISP:=TOS; <<NEEDED FOR SEGMENTS IN MOTION SO THAT             14150000
                      ONGOING I/OCOUNT CAN BE DECREMENTED               14152000
                      WHEN MOTION COMPLETES.>>                          14154000
   TOS:=SUBREGSIZE;                                                     14156000
   IF = THEN SUDDENDEATH(614);                                 <<01644>>14158000
   PAGEDISPCNT:=PAGEDISPCNT+TOS;                                        14160000
   IF PAGEDISPCNT>OLDREGSIZE THEN SUDDENDEATH(614);            <<01644>>14162000
   SEGIDENTIFIER:=OCSEGIDENT;                                           14164000
   IF <> THEN                                                           14166000
      BEGIN <<THERE'S A SEG IN THE SUB-REGION>>                         14168000
      IF SEGIDENTIFIER.SEGIDTYPEFIELD <> SEGIDDATATYPE                  14170000
      THEN STINX:=CONVSEGIDTOSTINX(SEGIDENTIFIER)                       14172000
      ELSE STINX:=SEGIDENTIFIER&LSL(2);                                 14174000
      X:=STINX;                                                         14176000
      IF SEGIDENTIFIER.SEGIDTYPEFIELD =SEGIDDATATYPE                    14178000
      THEN DATASEGFLG:=TRUE;                                            14180000
      <<UPDATE ST DESCRIPTOR TO INDICATE SEG NO LONGER RECOVERABLE>>    14182000
      DST(X:=X+1).ROCFLAG:=0;                                           14184000
      IF = THEN                                                         14186000
         BEGIN  <<SEG IN SUBREGION WASN'T AN OVERLAY CANDIDATE,         14188000
                  RATHER, SUBREGION AVAILABLE DUE TO AN ABORTED         14190000
                  SPACE RESERVATION OR WRITE IN PROGRESS>>              14192000
         IF NOT DATASEGFLG THEN SUDDENDEATH(614);              <<01644>>14194000
         IF DST(X).DISCCOPYVALIDFLAG=0  THEN                            14196000
            BEGIN  <<WRITE HASN'T COMPLETED>>                           14198000
            IOCNT:=IOCNT+1;                                             14200000
            INITMSG.MSGONGOINGIODISABLED:=1;                            14202000
            DATAIMFLG:=TRUE;                                            14204000
            << BUMPWRITEPRI;  GOT IT BELOW >>                  <<02056>>14206000
            END;                                                        14208000
         END                                                            14210000
      ELSE                                                              14212000
         BEGIN  <<SEG IS AN OVERLAY CANDIDATE>>                         14214000
         IF GCLASSENABLEDMASK.CLASS0 THEN                               14216000
            BEGIN  <<MEASURE RELEASE OF SEG>>                           14218000
            TOS:=MEASSTATXDSBANK;                                       14220000
            TOS:=MEASSTATXDSBASE;                                       14222000
            TOS:=TOS+C0SUB0'SEGRELOFF;                                  14224000
            IF DATASEGFLG THEN TOS:=TOS+C'DATARELEASE          <<RAY.V>>14226000
               ELSE TOS:=TOS+C'CODERELEASE;                    <<RAY.V>>14228000
            ASMB(LSEA);                                                 14230000
            TOS:=TOS+1;                                                 14232000
            ASMB(SSEA;DDEL);                                            14234000
            END;                                                        14236000
         IF GCLASSENABLEDMASK.CLASS15 THEN                     <<01812>>14238000
            BEGIN <<PRCOCESS LEVEL OVLY CAUSED>>               <<01812>>14240000
            TOS:=MEASPROCXDSBANK;                              <<01812>>14242000
            TOS:=MEASPROCXDSBASE;                              <<01812>>14244000
            TOS:=ICS(-ICS'CANDPINCELL);                        <<01812>>14246000
            TOS:=TOS*CLASS15'SUB0SIZE+CP'OVERLAYCAUSED;        <<01812>>14248000
            ASMB(LADD);                                        <<01812>>14250000
            ASMB(LSEA);                                        <<01812>>14252000
            TOS:=TOS+1;                                        <<01812>>14254000
            ASMB(SSEA;DDEL);                                   <<01812>>14256000
            END;                                               <<01812>>14258000
         IF DATASEGFLG THEN                                             14260000
            BEGIN <<FIND OUT IF BACKGROUND WRITE HAS COMPLETED>>        14262000
            IF LOGICAL(DST(X:=STINX+1)).DISCCOPYVALIDFLAG THEN          14264000
               BEGIN <<DISC COPY ALREADY VALID>>                        14266000
            IF OCWRITEREQPTR<>0 THEN SUDDENDEATH(618);         <<01644>>14268000
               END                                                      14270000
            ELSE                                                        14272000
               BEGIN  <<WRITE STILL IN PROGESS>>                        14274000
               DST(X).FWIPFLAG:=1;                                      14276000
               DATAIMFLG:=TRUE; <<CAN'T SPLIT THIS SUBREGION NOW>>      14278000
               IOCNT:=IOCNT+1;                                          14280000
               INITMSG.MSGONGOINGIODISABLED:=1;                         14282000
               BUMPWRITEPRI;                                   <<02056>>14284000
               END;                                                     14288000
            END;                                                        14290000
         TOS:=OCDISCADDRESS;                                            14292000
         DST(X:=STINX+3):=TOS;  <<PUT LODA OF OC INTO ST DESC>>         14294000
         DST(X:=X-1):=TOS;  <<PUT HODA OF OC INTO ST DESC>>             14296000
         END;                                                           14298000
      END;                                                              14300000
   X:=SUBREGWORDDISP;                                                   14302000
   IF NOT DATAIMFLG THEN                                                14304000
      BEGIN                                                             14306000
      OCSEGIDENT:=0;                                                    14308000
      OCWREQP:=0;                                                       14310000
      END;                                                              14312000
   RESIDUE:=PAGEDISPCNT-CLEANPAGECNT; <<FOR CC AND BELOW>>              14314000
   END                                                                  14316000
UNTIL >=;                                                               14318000
                                                                        14320000
IF DATAIMFLG THEN                                                       14322000
   BEGIN <<CANNOT SPLIT LAST SUBREGION>>                                14324000
   NEWREGSIZE:=PAGEDISPCNT;                                             14326000
   RELEASEPAGECNT:=RESIDUE; <<I/O COMPLETOR WILL RELEASE>>              14328000
   IF <> THEN INITMSG.INITMSGRELRESPAGESFLAG:=1;                        14330000
   END                                                                  14332000
ELSE                                                                    14334000
   BEGIN <<LAST SUBREGION CAN BE SPLIT>>                                14336000
   NEWREGSIZE:=CLEANPAGECNT;                                            14338000
   RELEASEPAGECNT:=0;                                                   14340000
   <<IF SPLIT THE LAST SUBREGION,FIX UP ITS HEADERS/TRAILERS>>          14342000
   IF RESIDUE <> 0 THEN                                                 14344000
      BEGIN  <<SPLIT LAST SUBREGION>>                                   14346000
      X:=SUBREGWORDDISP;                                                14348000
      TOS:=SUBREGSIZE:=SUBREGSIZE-RESIDUE;<<SIZE OF LEFT SUBREGION>>    14350000
      X:=X+RASTOPTSSDISP;                                               14352000
      X:=X+S0&LSL(PAGEPOWER);                                           14354000
      MEM(X):=TOS;<<LEFT SUBREGION'S TRAILER>>                          14356000
      X:=CLEANPAGECNT&LSL(PAGEPOWER);                                   14358000
      SUBREGSIZE:=RESIDUE;<<SUBREGION SIZE OF RIGHT SUBREGION>>         14360000
      OCSEGIDENT:=0;                                                    14362000
      X:=X+RESIDUE&LSL(PAGEPOWER)+RASTOPTSSDISP;                        14364000
      MEM(X):=RESIDUE; <<SUB SIZE IN RIGHT TRAILER>>                    14366000
      X:=X+TSSTOTRASDISP;                                               14368000
      MEM(X):=REGAVAILABLECODE;                                         14370000
      END;                                                              14372000
   END;                                                                 14374000
                                                                        14376000
INITMSG.MSGVALIDYETFLAG:=1;                                             14378000
                                                                        14380000
<<                                                                      14382000
PUT NEW REGION SIZES IN GLOBAL HEADERS AND TRAILERS                     14384000
>>                                                                      14386000
                                                                        14388000
X:=0;  <<FOR ADDRESSING CONVENIENCE>>                                   14390000
REGIONSIZE:=NEWREGSIZE; <<PUT NEW REGION SIZE IN HEADER>>               14392000
REGIONSTATE.REGCLEAREDFLAG:=1; <<FOR GARBAGE COLLECTION>>               14394000
X:=NEWREGSIZE&LSL(PAGEPOWER)+RASTOPTRSDISP;                             14396000
MEM(X):=NEWREGSIZE; <<PUT NEW REGION SIZE INTO TRAILER>>                14398000
MEM(X:=X+TRSTOTRASDISP):=REGIONSTATE; <<NEW REGION STATE INTO TRAILER>> 14400000
                                                                        14402000
<<                                                                      14404000
ZERO OUT CELLS OF HEADER NOT CONTAINING CURRENT INFO                    14406000
>>                                                                      14408000
                                                                        14410000
WDIOFZCOUNTERS:=LKFZCOUNTERS:=DISCREQHEADPTR:=DISCREQTAILPTR:=          14412000
MAKEPRESENTLINK:=0;                                                     14414000
                                                                        14416000
<<                                                                      14418000
RELEASE EXTRA PAGES ABOVE REQUIRED PORTION OF REGION                    14420000
>>                                                                      14422000
                                                                        14424000
RESIDUALSIZE:=OLDREGSIZE-NEWREGSIZE;                                    14426000
IF = THEN                                                               14428000
   BEGIN  <<NO EXTRA SPACE ABOVE REGION TO RELEASE>>                    14430000
   TOS:=SAVEDB;                                                         14432000
   EXCHDB;                                                              14434000
   END                                                                  14436000
ELSE                                                                    14438000
   BEGIN  <<RELEASE XTRA PAGES>>                                        14440000
   MEM(X).REGAVAILABLEFLAG:=0; <<PREVENT CONCATENATION IN RELREG>>      14442000
   X:=X+PTRASTORSDISP;                                                  14444000
   MEM(X):=RESIDUALSIZE;                                                14446000
   X:=X+RESIDUALSIZE&LSL(PAGEPOWER)+RSTOPTRSDISP;                       14448000
   MEM(X):=RESIDUALSIZE;                                                14450000
   TOS:=SAVEDB;                                                         14452000
   EXCHDB;                                                              14454000
   TOS:=REGIONBASE;                                                     14456000
   TOS:=TOS+NEWREGSIZE&LSL(PAGEPOWER);                                  14458000
   RELEASEREGION(*,0);                                                  14460000
   END;                                                                 14462000
END   <<CLEANREGION>>;                                                  14464000
$PAGE "MEMORY ALLOCATION PROCEDURES : RESERVE REGION"                   14466000
DOUBLE PROCEDURE RESERVEREGION(REQSIZE,UPPERLIMITSIZE,URGCLASS,         14468000
   SPECIALINFO,REGIONBASE);                                             14470000
VALUE REQSIZE,UPPERLIMITSIZE,URGCLASS,SPECIALINFO,REGIONBASE;           14472000
INTEGER REQSIZE,UPPERLIMITSIZE,URGCLASS,SPECIALINFO;                    14474000
DOUBLE REGIONBASE;                                                      14476000
OPTION PRIVILEGED,UNCALLABLE;                                           14478000
                                                                        14480000
                                                                        14482000
                                                                        14484000
COMMENT                                                                 14486000
                                                                        14488000
RESERVEREGION IS CALLED FROM FETCHSEGMENT TO PROCURE AN                 14490000
AVAILABLE REGION FOR A PENDING SEGMENT FETCH REQUEST, AND FROM          14492000
COLLECTGARBAGE TO PROCURE AN AVAILABLE REGION FOR A MOVE OF             14494000
ASSIGNED REGIONS WHICH ARE SITTING BETWEEN TWO HOLES.                   14496000
                                                                        14498000
FOR LOCK REQUESTS, THE REGIONBASE TO BE RESERVED IS PASSED IN THE       14500000
REGIONBASE PARAMETER.  FOR NORMAL REGION RESERVATION REQUESTS,          14502000
RESERVEREGION CHECKS THE MAXAVAIL CELL OF THE MAIN MEMORY STATE         14504000
TABLE TO SEE IF IF A REGION OF ADEQUATE SIZE IS AVAILABLE.              14506000
IF NOT, CONTROL IS RETURNED WITH RESERVEREGION VALUE OF 0.              14508000
IF AN AVAILABLE REGION OF ADEQUATE SIZE IS AROUND, THE AVAILABLE        14510000
REGION SIZE BITMAP (ARSBM) IS SCANNED FROM THE REQUEST SIZE UP          14512000
TO DETERMINE THE SIZE OF THE BEST FIT AVAILABLE REGION. THE REGION      14514000
AT THE HEAD OF THAT LIST IS UNLINKED.                                   14516000
                                                                        14518000
AFTER THE REGION TO BE RESERVED IS SELECTED, CLEANREGION IS CALLED TO   14520000
TO FORCE THE WRITES PENDING IN THE REGION AND TO UPDATE THE             14522000
ONGOING I/O COUNT IN THE REGION.  ANY RESIDUAL PAGES ARE RELEASED,      14524000
AND THE DOUBLE WORD ADDRESS OF THE REGION'S BASE IS RETURNED.           14526000
                                                                        14528000
;                                                                       14530000
                                                                        14532000
BEGIN                                                                   14534000
INTEGER WORDINX,                                                        14536000
        BESTFITSIZE;                                                    14538000
                                                                        14540000
IF REQSIZE>MAXAVAILREG THEN SUDDENDEATH(619);                  <<01644>>14542000
IF SPECIALINFO = LOCKCODE THEN                                          14544000
   BEGIN  <<ALREADY KNOW WHICH REGION TO USE>>                          14546000
   TOS:=RESERVEREGION:=REGIONBASE;                                      14548000
   TOS:=TOS+RBTORSDISP;                                                 14550000
   ASMB(LSEA);                                                          14552000
   BESTFITSIZE:=TOS;                                                    14554000
   ASMB(DDEL);                                                          14556000
   END                                                                  14558000
ELSE                                                                    14560000
   BEGIN <<MUST SELECT REGION TO BE RESERVED>>                          14562000
   TOS:=REQSIZE;                                                        14564000
   WORDINX:=X:=S0&LSR(4);  <<WORD INDEX IN MAP>>                        14566000
   TOS:=ARSBM(X);   <<WORD IN AVAILABLE REGION SIZE BITMAP>>            14568000
   ASMB(STBX;TBC 0,X);  <<TEST BIT IN WORD>>                            14570000
   IF <> THEN BESTFITSIZE:=REQSIZE <<HAVE ONE OF REQSIZE>> ELSE         14572000
      BEGIN<<NO REGIONS OF THIS SIZE,MUST DETERMINE NEXT LARGEST>>      14574000
      X:=S1.(12:4)+1;  <<SHIFT COUNT = BIT POSITION +1>>                14576000
      TOS:=TOS&LSL(X);                                                  14578000
      IF <> THEN                                                        14580000
         BEGIN                                                          14582000
         ASMB(DECX;SCAN ,X);                                            14584000
         BESTFITSIZE:=WORDINX&LSL(4)+X;                                 14586000
         END                                                            14588000
      ELSE                                                              14590000
         BEGIN                                                          14592000
         X:=WORDINX;                                                    14594000
         DO TOS:=ARSBM(X:=X+1)                                          14596000
         UNTIL <>;                                                      14598000
         X:=X&LSL(4);                                                   14600000
         ASMB(SCAN,X);                                                  14602000
         BESTFITSIZE:=X-1;                                              14604000
         END;                                                           14606000
      END;                                                              14608000
   IF UPPERLIMITSIZE < BESTFITSIZE THEN RESERVEREGION:=REGIONBASE:=0D   14610000
   ELSE                                                                 14612000
      BEGIN <<SELECTED SIZE IS OK>>                                     14614000
      RESERVEREGION:=REGIONBASE:=ARLD(X:=BESTFITSIZE);                  14616000
      IF = THEN SUDDENDEATH(619);                              <<01644>>14618000
      END;                                                              14620000
   END;                                                                 14622000
                                                                        14624000
TOS:=REGIONBASE;                                                        14626000
IF <> THEN                                                              14628000
   BEGIN <<REMOVE FROM LIST AND CLEAN IT UP>>                           14630000
   TOS := 12;                                                  <<01571>>14632000
   TOS := REQSIZE;                                             <<01571>>14634000
   TOS := REGIONBASE;                                          <<01571>>14636000
   MMSTAT(*,*,*,*);                                            <<01571>>14638000
   TAKEOFFARL(REGIONBASE,BESTFITSIZE);                                  14640000
   CLEANREGION(REGIONBASE,REQSIZE,URGCLASS,SPECIALINFO);                14642000
                                                                        14644000
   <<                                                                   14646000
   MARK REGION RESERVED IN REGION HEADER AND TRAILER                    14648000
   >>                                                                   14650000
                                                                        14652000
   TOS:=TOS+RBTORASDISP;                                                14654000
   TOS:=REGRESERVEDCODE;                                                14656000
   ASMB(SSEA);                                                          14658000
   TOS:=TOS+RASTORSDISP;                                                14660000
   ASMB(LSEA); <<SIZE OF REGION ALLOCATED>>                             14662000
   TOS:=TOS&LSL(PAGEPOWER);                                             14664000
   IF = THEN                                                            14666000
      BEGIN <<WHOLE BANK ALLOCATED FOR THE SEG>>                        14668000
      ASMB(DDEL);                                                       14670000
      TOS:=LASTTRASADDR;                                                14672000
      END                                                               14674000
   ELSE                                                                 14676000
      BEGIN                                                             14678000
      ASMB(LADD);                                                       14680000
      IF NOCARRY THEN TOS:=TOS+RSTOPTRASDISP ELSE                       14682000
         BEGIN <<ALLOCATED REGION EXTENDS TO END OF BANK>>              14684000
         ASMB(DEL);                                                     14686000
         TOS:=LASTTRASADDR;                                             14688000
         END;                                                           14690000
      END;                                                              14692000
   TOS:=REGRESERVEDCODE;                                                14694000
   ASMB(SSEA);                                                          14696000
   END;                                                                 14698000
END   <<RESERVEREGION>>;                                                14700000
$PAGE "MEMORY ALLOCATION PROCEDURES : RECOVER OVERLAY CANDIDATE"        14702000
PROCEDURE RECOVEROC(SEGIDENT,SEGDESCSTINX);                             14704000
VALUE SEGIDENT,SEGDESCSTINX;                                            14706000
INTEGER SEGIDENT,SEGDESCSTINX;                                          14708000
OPTION PRIVILEGED,UNCALLABLE;                                           14710000
                                                                        14712000
COMMENT                                                                 14714000
                                                                        14716000
RECOVEROC IS CALLED BY THE SCHEDULER AND ABSENCE TRAP HANDLERS          14718000
TO RECOVER THE REGION OCCUPIED BY A SEGMENT WHICH WAS SELECTED          14720000
AS AN OVERLAY CANDIDATE BUT IS NOW NEEDED.  THE AMBIENT                 14722000
AVAILABLE REGION IS BROKEN, AND THE REQUIRED SUBREGION IS               14724000
FLAGGED ASSIGNED.  THE SEGMENT IS FLAGGED PRESESNT, AND ITS             14726000
DESCRIPTOR LINKED INTO THE LIST OF PRESENT RELEASABLE ENTRIES.          14728000
                                                                        14730000
;                                                                       14732000
                                                                        14734000
BEGIN                                                                   14736000
                                                                        14738000
<<DB ASSUMED AT SYSDB ON ENTRY>>                                        14740000
                                                                        14742000
                                                                        14744000
INTEGER SIZEBELOW,                                                      14746000
        SIZEABOVE,                                                      14748000
        NEXT,                                                           14750000
        SEGALLOC,                                                       14752000
        REGIONSIZE;                                                     14754000
                                                                        14756000
LOGICAL DATASEGFLAG;                                                    14758000
                                                                        14760000
DOUBLE OCREGBASE,                                                       14762000
       REGIONBASE;                                                      14764000
                                                                        14766000
INTEGER BPTINX;                                                         14768000
                                                                        14770000
                                                                        14772000
<<DB ASSUMED TO BE AT SYSDB>>                                           14774000
TURNOFFTRAPS;                                                  <<01644>>14776000
IF SEGIDENT.SEGIDTYPEFIELD<>SEGIDDATATYPE                               14778000
THEN DATASEGFLAG:=FALSE ELSE DATASEGFLAG:=TRUE;                         14780000
<<                                                                      14782000
MARK THE SEGMENT PRESENT                                                14784000
>>                                                                      14786000
                                                                        14788000
DISABLE;                                                                14790000
X:=SEGDESCSTINX+DSTSYSBASEINX;                                          14792000
SEGDESCFLAGS.ROCFLAG:=0;<<CLEAR OVERLAY CAND FLAG IN SEG DESC>>         14794000
IF = THEN SUDDENDEATH(619);                                    <<01644>>14796000
TOS:=SEGDESCBANK; <<BANK>>                                              14798000
TOS:=SEGDESCADDR;     <<SEG BASE>>                                      14800000
ASMB(DDUP);                                                             14802000
OCREGBASE:=TOS;                                                         14804000
IF DATASEGFLAG THEN                                                     14806000
   BEGIN <<TRY TO KILL ONGOING WRITE>>                                  14808000
   TOS:=TOS+RBTOWREQPDISP;                                              14810000
   ASMB(LSEA);                                                          14812000
   IF = THEN                                                            14814000
      BEGIN                                                             14816000
      IF NOT LOGICAL(DST(SEGDESCSTINX+1)).DISCCOPYVALIDFLAG             14818000
      THEN SUDDENDEATH(618);                                   <<01644>>14820000
      ASMB(DEL);                                                        14822000
      END                                                               14824000
   ELSE                                                                 14826000
      BEGIN                                                             14828000
      IF LOGICAL(DST(SEGDESCSTINX+1)).DISCCOPYVALIDFLAG                 14830000
      THEN SUDDENDEATH(618);                                   <<01644>>14832000
      DISCQMANAGER(*,ABORTREQCODE);<<ABORT WRITE>>                      14834000
      IF < THEN SUDDENDEATH(618);                              <<01644>>14836000
      TOS:=0;                                                           14838000
      ASMB(SSEA); <<WIPE OUT REFERENCE TO THAT REQP>>                   14840000
      END;                                                              14842000
   DST(SEGDESCSTINX+1).DISCCOPYVALIDFLAG:=0;                            14844000
   TOS:=TOS+WREQPTORBDISP;                                              14846000
   END;                                                                 14848000
ENABLE;                                                                 14850000
                                                                        14852000
<<LOCATE THE BEGINNING OF THE AVAILABLE REGION OF                       14854000
  WHICH THE SEGMENT BEING RECOVERED IS A PART>>                         14856000
                                                                        14858000
IF LS0 <= HEADERLENGTH THEN                                             14860000
   BEGIN  <<THE SEG IS AT THE FRONT OF THE BANK>>                       14862000
   ASMB(DEL);                                                           14864000
   TOS:=RASTORSDISP; <<ADDR OF RS CELL>>                                14866000
   END                                                                  14868000
ELSE                                                                    14870000
   BEGIN  <<SEG IN THE MIDDLE OF AN AVAIL REG>>                         14872000
                                                                        14874000
   LOOKBACK:  <<SEE IF PREVIOUS SUBREGION IN BANK IS AVAIL>>            14876000
                                                                        14878000
   TOS:=TOS+RBTOPTRASDISP;<<ADDRESS OF PREV REG STATE>>                 14880000
   ASMB(LSEA);                                                          14882000
   TOS.REGAVAILABLEFLAG:=0;                                             14884000
   ASMB(DEL);                                                           14886000
   IF = THEN TOS:=TOS+PTRASTORSDISP <<GOT TO BEGINNING>> ELSE           14888000
      BEGIN  <<PRECEDING SEG PART OF THE AVAIL REG>>                    14890000
      TOS:=TOS+TRASTOTSSDISP;                                           14892000
      ASMB(LSEA);                                                       14894000
      TOS:=TOS&LSL(PAGEPOWER);<<PREV SUBREGION'S SIZE>>                 14896000
      S1:=S1+PTSSTORBDISP;                                              14898000
      ASMB(SUB);                                                        14900000
      IF LS0 > HEADERLENGTH THEN GO LOOKBACK ELSE                       14902000
         BEGIN <<AVAILABLE REGION IS FIRST REGION IN BANK>>             14904000
         ASMB(DEL);                                                     14906000
         TOS:=RASTORSDISP; <<ADDR OF RS CELL>>                          14908000
         END;                                                           14910000
      END;                                                              14912000
   END;                                                                 14914000
                                                                        14916000
<<THE ABS ADDRESS OF THE REGION SIZE CELL OF THE REGION                 14918000
  HEADER OF WHICH THE OC IS A PART IS ON TOS>>                          14920000
                                                                        14922000
<<                                                                      14924000
TAKE THE ENTIRE AVAILABLE REGION OFF THE AVAILABLE REGION LIST          14926000
>>                                                                      14928000
                                                                        14930000
ASMB(LSEA);                                                             14932000
REGIONSIZE:=TOS;                                                        14934000
TOS:=TOS+RSTORBDISP;                                                    14936000
REGIONBASE:=TOS;                                                        14938000
TOS:=OCREGBASE-REGIONBASE;                                              14940000
ASMB(XCH,DEL);                                                          14942000
IF <> THEN SUDDENDEATH(614);                                   <<01644>>14944000
SIZEBELOW:=TOS&LSR(PAGEPOWER);                                          14946000
TAKEOFFARL(REGIONBASE,REGIONSIZE);                                      14948000
                                                                        14950000
<<                                                                      14952000
FIX UP HEADER                                                           14954000
>>                                                                      14956000
                                                                        14958000
TOS:=OCREGBASE;                                                         14960000
TOS:=TOS+RBTOSSDISP;                                                    14962000
ASMB(LSEA);                                                             14964000
SEGALLOC:=TOS;                                                          14966000
TOS:=TOS+SSTORSDISP;                                                    14968000
TOS:=SEGALLOC;                                                          14970000
ASMB(SSEA); <<NEW REGION SIZE>>                                         14972000
TOS:=TOS+RSTORASDISP;                                                   14974000
TOS:=REGASSIGNEDCODE;                                                   14976000
ASMB(SSEA);                                                             14978000
                                                                        14980000
<<                                                                      14982000
RETURN THE REGION BELOW SEG                                             14984000
>>                                                                      14986000
                                                                        14988000
IF SIZEBELOW <> 0  THEN                                                 14990000
   BEGIN <<OC IS IN THE MIDDLE OF AN AR,RETURN PREV TO ARL>>            14992000
   TOS:=REGIONBASE;                                                     14994000
   TOS:=TOS+RBTORSDISP;                                                 14996000
   TOS:=SIZEBELOW;                                                      14998000
   ASMB(SSEA;DDEL);                                                     15000000
   TOS:=OCREGBASE;                                                      15002000
   TOS:=TOS+RBTOPTRSDISP;                                               15004000
   TOS:=SIZEBELOW;                                                      15006000
   ASMB(SSEA);                                                          15008000
   TOS:=TOS+TRSTOTRASDISP;                                              15010000
   TOS:=REGAVAILABLECODE;                                               15012000
   ASMB(SSEA;DDEL);                                                     15014000
   RELEASEREGION(REGIONBASE,0);                                         15016000
   END;                                                                 15018000
                                                                        15020000
                                                                        15022000
<<                                                                      15024000
FIX UP TRAILER                                                          15026000
>>                                                                      15028000
                                                                        15030000
TOS:=TOS+RASTOPTRASDISP+SEGALLOC&LSL(PAGEPOWER);                        15032000
TOS:=REGASSIGNEDCODE;                                                   15034000
ASMB(SSEA);                                                             15036000
TOS:=TOS+TRASTOTRSDISP;                                                 15038000
TOS:=SEGALLOC;                                                          15040000
ASMB(SSEA);                                                             15042000
                                                                        15044000
<<                                                                      15046000
RELEASE REGION ABOVE                                                    15048000
>>                                                                      15050000
                                                                        15052000
X:=SIZEABOVE:=REGIONSIZE-(SEGALLOC+SIZEBELOW);                          15054000
IF < THEN SUDDENDEATH(614);                                    <<01644>>15056000
IF > THEN                                                               15058000
   BEGIN <<RETURN PORTION OF REGION ABOVE TO ARL>>                      15060000
   TOS:=TOS+PTRSTORASDISP;                                              15062000
   TOS:=REGAVAILABLECODE;                                               15064000
   ASMB(SSEA);                                                          15066000
   TOS:=TOS+RASTORSDISP;                                                15068000
   TOS:=SIZEABOVE;                                                      15070000
   ASMB(SSEA);                                                          15072000
   TOS:=TOS+RSTORBDISP;                                                 15074000
   ASMB(DDUP);                                                          15076000
   TOS:=TOS+RBTOPTRSDISP;                                               15078000
   TOS:=TOS+SIZEABOVE&LSL(PAGEPOWER);                                   15080000
   TOS:=SIZEABOVE;                                                      15082000
   ASMB(SSEA;DDEL);                                                     15084000
   RELEASEREGION(*,0);                                                  15086000
   END;                                                                 15088000
                                                                        15090000
DISABLE;                                                       <<01788>>15092000
DST(SEGDESCSTINX).ABSENTFLAG:=0;                               <<01788>>15094000
IF = THEN SUDDENDEATH(619);  <<ALREADY PRESENT?>>              <<01788>>15096000
                                                                        15098000
<<                                                                      15100000
CHECK FOR BREAK POINTS SET AGAINST THE SEGMENT                          15102000
>>                                                                      15104000
                                                                        15106000
IF SEGIDENT.SEGIDTYPEFIELD<>SEGIDDATATYPE THEN                          15108000
   BEGIN                                                                15110000
   TOS:=ABSOLUTE(CPCB);                                                 15112000
   IF = THEN ASMB(DEL) ELSE                                             15114000
      BEGIN                                                             15116000
      TOS:=ABSOLUTE(TOS+PIMPPINBKLINKWORDNUM).BREAKPTLINKFIELD;         15118000
      IF = THEN ASMB(DEL) ELSE                                          15120000
         BEGIN <<SEE IF CURRENT PROCESS HAS A BKPT IN SEGIDENT>>        15122000
         BPTINX:=TOS;                                          <<MM.IV>>15124000
         SETSEGSBKPTS(SEGIDENT,SEGDESCSTINX,BPTINX);                    15126000
         END;                                                           15128000
      END;                                                              15130000
   IF SYS'BKPT THEN SETSEGSBKPTS(SEGIDENT,SEGDESCSTINX,        <<MM.IV>>15132000
                                 SYS'BKPT'EXT'X);              <<MM.IV>>15134000
   END;                                                                 15136000
                                                                        15138000
<<                                                                      15140000
REENABLE DISC REQUESTS AGAINST SEG IF DATASEG                           15142000
>>                                                                      15144000
                                                                        15146000
IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE THEN                           15148000
   BEGIN                                                                15150000
   X:=DISCREQTABSYSBASEINX;                                             15152000
   IF DITQHEADP <> 0 THEN CHECKFORPNDGDISKIO(SEGIDENT);                 15154000
   END;                                                                 15156000
END   <<RECOVEROC>>;                                                    15158000
                                                                        15160000
$PAGE "MEMORY ALLOCATION PROCEDURES : ADDTOLOCALITY"                    15162000
                                                                        15164000
PROCEDURE ADDTOLOCALITY(SLLINX,SEGIDENTIFIER,FLAGS);                    15166000
VALUE SLLINX,SEGIDENTIFIER,FLAGS;                                       15168000
INTEGER SLLINX,FLAGS;                                                   15170000
LOGICAL SEGIDENTIFIER;                                                  15172000
OPTION PRIVILEGED,UNCALLABLE;                                           15174000
                                                                        15176000
COMMENT                                                                 15178000
                                                                        15180000
ADDTOLOCALITY IS CALLED FROM VARIOUS PLACES TO GET A SEGMENT            15182000
ASSOCIATED WITH A PROCESS.  THE FLAGS PARAMETER TELLS                   15184000
WHETHER THE SLL'S MEMORY REQUEST POINTER                                15186000
SHOULD BE POINTED AT THE NEW ENTRY, TELLS WHETHER A LOCK                15188000
REQUEST (BLOCKED OR UNBLOCKED) IS PENDING AGAINST THE SEG               15190000
FOR THE PROCESS, TELLS WHETHER A FREEZE REQUEST IS PENDING              15192000
AGAINST THE SEG FOR THE PROCESS, TELLS WHETHER A WAKE-UP DISC           15194000
I/O REQUEST AGAINST THE SEG HAS BEEN ISSUED ON BEHALF OF THE            15196000
PROCESS.                                                                15198000
                                                                        15200000
;                                                                       15202000
                                                                        15204000
                                                                        15206000
BEGIN                                                                   15208000
LOGICAL MEMREQ:=FALSE;                                                  15210000
INTEGER LASTINX:=0,                                                     15212000
        NEXTINX,                                                        15214000
        SEGSINX,                                                        15216000
        SEGSENTRYINX;                                                   15218000
                                                                        15220000
<<                                                                      15222000
DB ASSUMED TO BE POINTING TO SYSDB                                      15224000
>>                                                                      15226000
                                                                        15228000
                                                                        15230000
<<FLIP THRROUGH THE LIST AND SEE IF ALREADY AN ENTRY FOR THE SEG>>      15232000
                                                                        15234000
X:=SLLINX;                                                              15236000
X:=SLLFIRSTINX;                                                         15238000
DISABLE;                                                                15240000
WHILE X<>0 AND SLLSEGIDENT <> SEGIDENTIFIER DO X:=SLLNEXTINX;           15242000
IF X <> 0 THEN SEGSINX:=X ELSE                                          15244000
   BEGIN << NO ENTRY YET, SO BUILD ONE AND PUT AT HEAD>>                15246000
   SEGSINX:=GETSYSTABENTRY(SWAPTABSYSBASEINX);                          15248000
   IF SEGSINX=0 THEN SUDDENDEATH(602); <<SWAPTAB TOO SMALL>>   <<01644>>15250000
   X:=SLLINX;                                                           15252000
   SLLSEGCNT:=SLLSEGCNT+1;                                              15254000
   TOS:=SLLFIRSTINX;                                                    15256000
   SLLFIRSTINX:=SEGSINX;                                                15258000
   X:=SEGSINX;                                                          15260000
   SLLNEXTINX:=S0;                                                      15262000
   SLLSEGIDENT:=SEGIDENTIFIER;                                          15264000
   X:=TOS;                                                              15266000
   SLLPREVINX:=SEGSINX;                                                 15268000
   END;                                                                 15270000
                                                                        15272000
<<DO ANYTHING SPECIAL AS REQUIRED BY THE FLAGS PARAMETER>>              15274000
                                                                        15276000
X:=SEGSINX;                                                             15278000
TOS:=FLAGS;                                                             15280000
ASMB(TEST);                                                             15282000
IF <> THEN                                                              15284000
   BEGIN <<SOME SPECIAL STATE OF ALLOCATION>>                           15286000
   TOS.SETMEMREQPTRFLAG:=0;                                             15288000
   IF <> THEN                                                           15290000
      BEGIN                                                             15292000
      MEMREQ:=TRUE;                                                     15294000
      X:=SLLINX;                                                        15296000
      SLLMEMREQINX:=SEGSINX;                                            15298000
      X:=SEGSINX;                                                       15300000
      END;                                                              15302000
   ASMB(TEST);                                                          15304000
   IF <> THEN                                                           15306000
      BEGIN                                                             15308000
      TOS.SETDISCIOSEGFLAG:=0;                                          15310000
      IF <> THEN                                                        15312000
         BEGIN                                                          15314000
         SLLFLAGS.SLLDISCIOSEGFLAG:=1;                                  15316000
         END;                                                           15318000
      ASMB(TEST);                                                       15320000
      IF <> THEN                                                        15322000
         BEGIN                                                          15324000
         TOS.PROCSSTKFLAG:=0;                                           15326000
         IF <> THEN SLLFLAGS.SLLSTKENTRYFLAG:=1;                        15328000
         ASMB(TEST);                                                    15330000
         IF <> THEN                                                     15332000
            BEGIN                                                       15334000
            TOS.SETLOCKFLAG:=0;                                         15336000
            IF <> THEN SLLFLAGS.SLLLKREQFLAG:=1;                        15338000
            ASMB(TEST);                                                 15340000
            IF <> THEN                                                  15342000
               BEGIN                                                    15344000
               TOS.SETBLKLKFLAG:=0;                                     15346000
               IF <> THEN SLLFLAGS.SLLBLKLOCKREQFLAG:=1;                15348000
               ASMB(TEST);                                              15350000
               IF <> THEN                                               15352000
                  BEGIN                                                 15354000
                  TOS.SETFZFLAG:=0;                                     15356000
                  IF =  THEN SUDDENDEATH(619);                 <<01644>>15358000
                  SLLFLAGS.SLLFZREQFLAG:=1;                             15360000
                  END;                                                  15362000
               END;                                                     15364000
            END;                                                        15366000
         END;                                                           15368000
      END;                                                              15370000
   END;                                                                 15372000
END  <<PROCEDURE ADDTOLOCALITY>>;                                       15374000
                                                                        15376000
$PAGE "MEMORY ALLOCATION PROCEDURES : MAKE OVERLAY CANDIDATE"           15378000
                                                                        15380000
PROCEDURE MAKEOC(DESCSTINX,SEGIDENT,REQSIZE);                           15382000
VALUE DESCSTINX,SEGIDENT,REQSIZE;                                       15384000
INTEGER DESCSTINX,SEGIDENT,REQSIZE;                                     15386000
OPTION PRIVILEGED,UNCALLABLE;                                           15388000
                                                                        15390000
COMMENT                                                                 15392000
                                                                        15394000
MAKEOC RELEASES THE REGION COVERED BY A SEGMENT TO THE POOL OF          15396000
AVAILABLE SPACE.  MAKEOC IS CALLED FROM MAKEROOM WHEN THE REPLACEMENT   15398000
ALGORITHM HAS BEEN INVOKED AND HAS SELECTED A SEGMENT AS                15400000
NO LONGER BEING REQUIRED BY THE CURRENT MULTIPROGRAMMING SET.           15402000
ALSO CALLED FROM CREATELOCKSPACE WHEN CLEARING OUT A LOCK REGION        15404000
AND FROM COLLECTGARBAGE WHEN WORKING ON EXTERNAL FRAGMENTATION.         15406000
                                                                        15408000
WHEN INVOKED, MAKEOC RELEASES THE MAIN MEMORY REGION OCCUPIED BY        15410000
THE SEGMENT TO THE AVAILABLE REGION LISTS VIA A CALL TO RELEASEREGION.  15412000
                                                                        15414000
IF THE SEGMENT BEING MADE INTO AN OVERLAY CANDIDATE IS A DATA SEGMENT,  15416000
A WRITE IS QUEUED INTO THE BACKGROUND QUEUE. WHEN THE REGION OCCUPIED   15418000
BY THE DATA SEGMENT IS ACTUALLY SELECTED AS THE TARGET FOR A SEGMENT    15420000
READ, THE PRIORITY OF THIS SEGMENT WRITE REQUEST GETS BUMPED.           15422000
IF THE DATA SEGMENT IS RECOVERED, THE WRITE REQUEST WILL BE ABORTED.    15424000
                                                                        15426000
;                                                                       15428000
                                                                        15430000
                                                                        15432000
BEGIN                                                                   15434000
                                                                        15436000
                                                                        15438000
INTEGER DESCSYSDBINX,                                                   15440000
        MMBANK,                                                         15442000
        MMBASE;                                                         15444000
                                                                        15446000
DOUBLE REGIONBASE=MMBANK;                                               15448000
                                                                        15450000
INTEGER WRITREQSYSDBINX,                                                15452000
        XFERCOUNT,                                                      15454000
        WRITEDISABLEDCOUNT:=0;                                          15456000
                                                                        15458000
                                                                        15460000
MMSTAT(1,SEGIDENT,0,0);  <<MAKEOC>>                            <<01571>>15462000
X:=DESCSYSDBINX:=DESCSTINX+DSTSYSBASEINX;                               15464000
MMBANK:=SEGDESCBANK;                                                    15466000
MMBASE:=SEGDESCADDR;                                                    15468000
DISABLE;                                                                15470000
IF SEGDESCFLAGS.IMIFLAG THEN SUDDENDEATH(619);                 <<01644>>15472000
<<TRYING TO CANCEL A SEGMENT RESERVATION-NO LONGER ALLOWED>>   <<01557>>15474000
IF LOGICAL(SEGDESCFLAGS).SEGRESIDENTFLAG                       <<01644>>15476000
THEN SUDDENDEATH(616) ELSE                                     <<01644>>15478000
   BEGIN <<SEG NOT RESIDENT-MAKE SURE NOT LOCKED,FROZEN,IOFZN>>         15480000
   TOS:=REGIONBASE;                                                     15482000
   TOS:=TOS+RBTORASDISP;                                                15484000
   ASMB(LSEA);                                                          15486000
   TOS.REGLKDFLAG:=0;                                                   15488000
   IF <> THEN SUDDENDEATH(616) ELSE                            <<01644>>15490000
      BEGIN                                                             15492000
      TOS.REGFZFLAG:=0;                                                 15494000
      IF <> THEN SUDDENDEATH(616) ELSE                         <<01644>>15496000
         BEGIN                                                          15498000
         TOS.REGIOFZFLAG:=0;                                            15500000
         IF <> THEN SUDDENDEATH(616) ELSE                      <<01644>>15502000
            BEGIN <<MARK ABSENT,FLAG AS ROC,RELEASE REGION,WRITE>>      15504000
            ASMB(DEL);                                                  15506000
            TOS:=TOS+RASTOSDDISP;                                       15508000
            ASMB(LSEA);                                                 15510000
            TOS.SDVALIDFLAG:=0;                                         15512000
            ASMB(SSEA); <<SIGNAL WRITCOMP NOTHING TO DO>>               15514000
            X:=DESCSYSDBINX;                                            15516000
            SEGDESCFLAGS.ROCFLAG:=1; <<FLAG AS OC IN DESC>>             15518000
            SEGDESCFIRMINFO.ABSENTFLAG:=1;                              15520000
            IF <> THEN SUDDENDEATH(616) ELSE                   <<01644>>15522000
            IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE THEN               15524000
            STARTSEGWRITE(SEGIDENT,BKGRNDPRI);                          15526000
            ENABLE;                                                     15528000
            RELEASEREGION(REGIONBASE,REQSIZE);                          15530000
            END;                                                        15532000
         END;                                                           15534000
      END;                                                              15536000
   END;                                                                 15538000
END  <<PROCEDURE MAKEOC>>;                                              15540000
$PAGE "MEMORY ALLOCATION PROCEDURES : PUT PROCESS ON SEG'S Q"           15542000
PROCEDURE PUTPROCONSEGSMPQ(PROCPIN,SEGIDENT,REGIONBASE,                 15544000
   PROCSSLLINX,SEGSSLLINX);                                             15546000
VALUE PROCPIN,SEGIDENT,REGIONBASE,PROCSSLLINX,SEGSSLLINX;               15548000
INTEGER PROCPIN,PROCSSLLINX,SEGSSLLINX;                                 15550000
LOGICAL SEGIDENT;                                                       15552000
DOUBLE REGIONBASE;                                                      15554000
OPTION PRIVILEGED,UNCALLABLE;                                           15556000
                                                                        15558000
                                                                        15560000
COMMENT                                                                 15562000
                                                                        15564000
PUTPROCONSEGSMPQ IS CALLED BY FETCHSEGMENT WHEN A PROCESS REQUIRES A    15566000
SEGMENT WHICH IS ALREADY IN MOTION IN.  THE PROCESS IS QUEUED           15568000
THROUGH THE SLL ENTRIES OF THE WAITING PROCESSES.                       15570000
                                                                        15572000
;                                                                       15574000
                                                                        15576000
                                                                        15578000
BEGIN                                                                   15580000
INTEGER TAILPIN;                                                        15582000
DISABLE;                                                                15584000
X:=SEGSSLLINX;                                                          15586000
SLLFLAGS.SLLIMIFLAG:=1;                                                 15588000
IF <> THEN SUDDENDEATH(613);                                   <<01644>>15590000
X:=PROCSSLLINX;                                                         15592000
SLLSCHEDTOIOMSG:=SLLSCHEDTOIOMSG+1; <<INC IOCOMP TO AWAKE>>             15594000
TOS:=REGIONBASE;                                                        15596000
TOS:=TOS+RBTOMPQLINKDISP;                                               15598000
ASMB(LSEA);                                                             15600000
IF = THEN                                                               15602000
   BEGIN <<FIRST PROCESS WAITING FOR THIS SEG>>                         15604000
   ASMB(DEL);                                                           15606000
   TOS:=PROCPIN;                                                        15608000
   TOS.(0:8):=PROCPIN;                                                  15610000
   ASMB(SSEA);                                                          15612000
   X:=SEGSSLLINX;                                                       15614000
   SLLMPQLINK:=0;                                                       15616000
   END                                                                  15618000
ELSE                                                                    15620000
   BEGIN <<MUST LINK TO TAIL>>                                          15622000
   TAILPIN:=S0.(8:8);                                                   15624000
   TOS.(8:8):=PROCPIN;                                                  15626000
   ASMB(SSEA);                                                          15628000
   X:=SEGSSLLINX;                                                       15630000
   TOS:=TAILPIN&LSL(8);                                                 15632000
   SLLMPQLINK:=TOS;                                                     15634000
   X:=PCB(TAILPIN*PCBSIZE+SLLIXWORDNUM);                                15636000
   X:=SLLFIRSTINX;                                                      15638000
   WHILE SLLSEGIDENT <> SEGIDENT DO X:=SLLNEXTINX;                      15640000
   IF X=0 THEN SUDDENDEATH(612);                               <<01644>>15642000
   SLLMPQLINK.(8:8):=PROCPIN;                                           15644000
   END;                                                                 15646000
END  <<PROCEDURE PUTPROCONSEGSMPQ>>;                                    15648000
                                                                        15650000
$TITLE "MEMORY ALLOCATION PROCEDURES : PUT DEVICE ON SEG'S Q"           15652000
PROCEDURE PUTDEVICEONSEGSMPQ(IOQSYSBASEINX,REGIONBASE);                 15654000
VALUE IOQSYSBASEINX,REGIONBASE;                                         15656000
INTEGER IOQSYSBASEINX;                                                  15658000
DOUBLE REGIONBASE;                                                      15660000
OPTION PRIVILEGED,UNCALLABLE;                                           15662000
                                                                        15664000
COMMENT                                                                 15666000
                                                                        15668000
AN ENTRY FROM THE SPECIAL REQ TABLE IS USED TO MAINTAIN A LIST          15670000
OF THE DEVICES IN WAITING THE SPECIFIED SEGMENT TO ARRIVE.  THE         15672000
SYSBASE REL INDEX OF THIS ENTRY IS KEPT IN THE SEGMENT'S REGION         15674000
HEADER.                                                                 15676000
                                                                        15678000
;                                                                       15680000
                                                                        15682000
BEGIN                                                                   15684000
                                                                        15686000
INTEGER FIRSTINQUEUE;                                                   15688000
                                                                        15690000
TOS:=REGIONBASE;                                                        15692000
TOS:=TOS+RBTOCOMPMSGDISP;                                               15694000
ASMB(LSEA);                                                             15696000
TOS.COMPMSGIOWAKEFLAG:=1;                                               15698000
ASMB(SSEA);                                                             15700000
TOS:=TOS+COMPMSGTOIOREQQDISP;                                           15702000
ASMB(LSEA);                                                             15704000
IF = THEN                                                               15706000
   BEGIN <<FIRST DEVICE IN LINE>>                                       15708000
   ASMB(DEL);                                                           15710000
   X:=GETSYSTABENTRY(SPECREQTABSYSBASEINX);                             15712000
   IF X=0 THEN SUDDENDEATH(600);<<SPEC REQ TAB CONF TOO SMALL>>         15714000
   ENTRYWORD00:=IOQSYSBASEINX;                                          15716000
   TOS:=X;                                                              15718000
   ASMB(SSEA);                                                          15720000
   END                                                                  15722000
ELSE                                                                    15724000
   BEGIN  <<MUST GET IN LINE>>                                          15726000
   X:=TOS;                                                              15728000
   IF ENTRYWORD00=0 THEN SUDDENDEATH(612);                     <<01644>>15730000
   IF ENTRYWORD01 = 0 THEN ENTRYWORD01:=IOQSYSBASEINX                   15732000
   ELSE IF ENTRYWORD02 = 0 THEN ENTRYWORD02:=IOQSYSBASEINX              15734000
   ELSE IF ENTRYWORD03 = 0 THEN ENTRYWORD03:=IOQSYSBASEINX              15736000
   ELSE IF ENTRYWORD04 = 0 THEN ENTRYWORD04:=IOQSYSBASEINX              15738000
   ELSE SUDDENDEATH(652);                                      <<01644>>15740000
   END;                                                                 15742000
END  <<PUTDEVICEONSEGSMPQ>>;                                            15744000
                                                                        15746000
$PAGE "MEMORY ALLOCATION PROCEDURES : ADJUSTLOCALITY"                   15748000
PROCEDURE ADJUSTLOCALITY(PROCINX,SEGIDENT,REQSIZE,FLAGS);               15750000
VALUE PROCINX,SEGIDENT,REQSIZE,FLAGS;                                   15752000
LOGICAL PROCINX,SEGIDENT,REQSIZE,FLAGS;                                 15754000
OPTION PRIVILEGED,UNCALLABLE;                                           15756000
                                                                        15758000
COMMENT                                                                 15760000
                                                                        15762000
ADJUSTLOCALITY IS CALLED TO MAKE MODIFICATIONS TO THE LOCALITY          15764000
OF A PROCESS.  THE PROCEDURE MAKES A SCAN THROUGH THE LOCALITY          15766000
LIST AND PERFORMS THE FUNCTION INDICATED BY THE FLAGS PARAMETER.        15768000
THE PROCEDURE IS CALLED FROM THE FOLLOWING PLACES TO PERFORM            15770000
THE FOLLOWING FUNCTIONS :                                               15772000
   (I) SIODM TOCLEAR THE DISC I/O SEG FLAG AGAINST THE SEGMENT          15774000
       FOR THE PROCESS                                                  15776000
  (II) FROM TERMINATE TO FLUSH THE LOCALITY LIST                        15778000
 (III) FROM SWAP-IN TO INITIALIZE THE LOCALITY LIST OF A PROCESS        15780000
  (IV) FROM DISPATCHER TO REFERENCE THE MINIMAL LOCALITY OF A           15782000
       PROCESS WHEN WHIPPING HTHROUGH THE DISPATCHING QUEUE TO          15784000
       KEEP THAT PROCESS' SEGS FROM GETTING EATEN BY THE CLOCK          15786000
       FOR LESS URGENT PROCESSES.                                       15788000
;                                                                       15790000
                                                                        15792000
BEGIN                                                                   15794000
                                                                        15796000
LOGICAL LASTREFSWAPSEG,                                                 15798000
        DBSEG;                                                          15800000
INTEGER DESCSTINX,                                                      15802000
        SLLINX,                                                         15804000
        NEXTSLLENTRYINX,                                                15806000
        SLLENTRYINX,                                                    15808000
        MEMREQINX,                                                      15810000
        COUNT;                                                          15812000
                                                                        15814000
SUBROUTINE RELSLLENTRY;                                                 15816000
                                                                        15818000
BEGIN                                                                   15820000
<<UNLINK ENTRY FROM ITS SLL>>                                           15822000
X:=SLLINX;                                                              15824000
SLLSEGCNT:=SLLSEGCNT-1;                                                 15826000
X:=SLLENTRYINX;;                                                        15828000
TOS:=SLLNEXTINX;                                                        15830000
TOS:=SLLPREVINX;                                                        15832000
IF = THEN                                                               15834000
   BEGIN <<FIRST IN LIST>>                                              15836000
   X:=SLLINX;                                                           15838000
   SLLFIRSTINX:=S1;                                                     15840000
   END                                                                  15842000
ELSE                                                                    15844000
   BEGIN                                                                15846000
   X:=TOS;                                                              15848000
   SLLNEXTINX:=S0;                                                      15850000
   TOS:=X;                                                              15852000
   END;                                                                 15854000
ASMB(XCH,STAX);                                                         15856000
IF <> THEN SLLPREVINX:=TOS ELSE ASMB(DEL);                              15858000
RELSYSTABENTRY(SWAPTABSYSBASEINX,SLLENTRYINX);                          15860000
END  <<SUBROUTINE RELSLLENTRY>>;                                        15862000
                                                                        15864000
                                                                        15866000
X:=PROCINX;                                                             15868000
DBSEG:=DBXDSINFO.XDSDSTFIELD;                                           15870000
LASTREFSWAPSEG:=LASTREFCODESEG;                                         15872000
X:=SLLINX:=SLLPTR;                                                      15874000
DISABLE;                                                                15876000
MEMREQINX:=SLLMEMREQINX;                                                15878000
IF FLAGS.INITLOCFLAG THEN SLLSCHEDTOIOMSG.SLLLOCINITFLAG:=1;            15880000
IF FLAGS.RELLOCFLAG OR FLAGS.RELTILLROOMFLAG                            15882000
THEN SLLMEMREQINX:=SLLFIRSTINX;                                         15884000
X:=SLLFIRSTINX;                                                         15886000
WHILE <> DO                                                             15888000
   BEGIN                                                                15890000
   TOS:=FLAGS;                                                          15892000
   ASMB (TRBC CLEARDISCSEGBIT);                                         15894000
   IF <> THEN                                                           15896000
      BEGIN                                                             15898000
      IF SEGIDENT<>SLLSEGIDENT THEN NEXTSLLENTRYINX:=SLLNEXTINX         15900000
      ELSE                                                              15902000
         BEGIN                                                          15904000
         SLLFLAGS.SLLDISCIOSEGFLAG:=0;                                  15906000
         IF = THEN SUDDENDEATH(619);                           <<01644>>15908000
         NEXTSLLENTRYINX:=0;<<TO TERMINATE WHILE LOOP>>                 15910000
         END;                                                           15912000
      END;                                                              15914000
   ASMB(TEST);                                                          15916000
   IF <> THEN                                                           15918000
      BEGIN                                                             15920000
      ASMB(TRBC FLUSHLOCBIT);                                           15922000
      IF <> THEN                                                        15924000
         BEGIN <<PROC TERMINATION CLEANUP-RELEASE SLL ENTRIES>>         15926000
         ASMB(TEST);                                                    15928000
         IF <> THEN SUDDENDEATH(619);                          <<01644>>15930000
         NEXTSLLENTRYINX:=SLLNEXTINX;<<FOR WHILE LOOP>>                 15932000
         SLLENTRYINX:=X;                                                15934000
         SEGIDENT:=SLLSEGIDENT;                                         15936000
         RELSLLENTRY;                                                   15938000
         END;                                                           15940000
      ASMB(TRBC REFMINLOCBIT);                                          15942000
      IF <> THEN                                                        15944000
         BEGIN <<REFERENCE MIN LOCALITY FOR CLOCK>>                     15946000
         SLLENTRYINX:=X;                                                15948000
         IF X = MEMREQINX OR                                   <<01913>>15950000
         SLLSEGIDENT = LOGICAL(DBSEG) OR                       <<01913>>15952000
         SLLFLAGS.SLLSTKENTRYFLAG OR SLLFLAGS.                          15954000
         SLLDISCIOSEGFLAG OR SLLSEGIDENT=LASTREFSWAPSEG THEN            15956000
            BEGIN <<IN MIN LOCALITY>>                                   15958000
            IF SLLSEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE                 15960000
            THEN DESCSTINX:=SLLSEGIDENT&LSL(2) <<DATA SEG>>             15962000
            ELSE DESCSTINX:=CONVSEGIDTOSTINX(SLLSEGIDENT);              15964000
            DISABLE;                                                    15966000
            DST(DESCSTINX).REFERENCEDFLAG:=1;                           15968000
            X:=SLLENTRYINX;                                             15970000
            END;                                                        15972000
         NEXTSLLENTRYINX:=SLLNEXTINX;                                   15974000
         END;                                                           15976000
      ASMB(TRBC INITLOCBIT);                                            15978000
      IF <> THEN                                                        15980000
         BEGIN                                                          15982000
         ASMB(TEST);                                                    15984000
         IF <> THEN SUDDENDEATH(619);                          <<01644>>15986000
         NEXTSLLENTRYINX:=SLLNEXTINX;<<FOR WHILE LOOP>>                 15988000
         IF  X <> MEMREQINX AND SLLSEGIDENT <> LOGICAL(DBSEG)           15990000
         AND NOT SLLFLAGS.SLLSTKENTRYFLAG AND NOT SLLFLAGS.             15992000
         SLLDISCIOSEGFLAG AND SLLSEGIDENT <> LASTREFSWAPSEG THEN        15994000
            BEGIN<<NOT IN MIN LOCALITY>>                                15996000
            SLLENTRYINX:=X;                                             15998000
            RELSLLENTRY;                                                16000000
            END;                                                        16002000
         END;                                                           16004000
      ASMB(TEST,DEL); <<COPY OF FLAGS THAT WE GRADUALLY ZEROED>>        16006000
      IF <> THEN SUDDENDEATH(619);                             <<01644>>16008000
      END;                                                              16010000
   X:=NEXTSLLENTRYINX;                                                  16012000
   END;                                                                 16014000
IF FLAGS.FLUSHLOCFLAG <<TOSS THE PROC'S SLL HEADER IF DYING>>           16016000
THEN RELSYSTABENTRY(SWAPTABSYSBASEINX,SLLINX);                          16018000
END  <<PROCEDURE ADJUSTLOCALITY>>;                                      16020000
                                                                        16022000
$PAGE "MEMORY ALLOCATION PROCEDURES : MAKEROOM"                         16024000
                                                                        16026000
LOGICAL PROCEDURE MAKEROOM(PROCINX,REQSIZE,HARDREQUEST);                16028000
VALUE PROCINX,REQSIZE,HARDREQUEST;                                      16030000
INTEGER PROCINX,REQSIZE;                                                16032000
LOGICAL HARDREQUEST;                                                    16034000
OPTION PRIVILEGED,UNCALLABLE;                                           16036000
                                                                        16038000
BEGIN                                                                   16040000
DOUBLE CURRENTTIME,                                                     16042000
       NEXTREGION,                                                      16044000
       TSLCYCLED;                                                       16046000
INTEGER DESCSTINX;                                                      16048000
LOGICAL FLAGS,                                                          16050000
        SEGIDENT,                                                       16052000
        OK,                                                             16054000
        GIVEUP:=FALSE;                                                  16056000
                                                                        16058000
                                                                        16060000
                                                                        16062000
                                                                        16064000
SUBROUTINE UPDATESCANPOINT;                                             16066000
                                                                        16068000
BEGIN                                                                   16070000
OK:=FALSE;                                                              16072000
TOS:=SCANPOINT;                                                         16074000
TOS:=TOS+RBTORSDISP;                                                    16076000
ASMB(LSEA);                                                             16078000
IF S0=MAXHOLESIZE THEN S0:=-1 <<FORCE CARRY>> ELSE             <<01616>>16080000
   BEGIN <<WHOLE BANK NOT FREE>>                               <<01799>>16082000
   TOS:=TOS&LSL(PAGEPOWER);                                    <<01616>>16084000
   TOS:=TOS+RSTORBDISP;                                        <<01616>>16086000
   END;                                                        <<01616>>16088000
ASMB(LADD);                                                             16090000
IF NOCARRY THEN                                                         16092000
   BEGIN <<IN SAME BANK>>                                               16094000
                                                                        16096000
   << LOCATE NEXT UNAVAILABLE REGION IN BANK FOR                        16098000
      NEW SCAN POINT >>                                                 16100000
                                                                        16102000
   WHILE NOT OK DO                                                      16104000
      BEGIN                                                             16106000
      <<CHECK IF HALF-BANK>>                                            16108000
      ASMB(DDUP);                                                       16110000
      NEXTREGION:=TOS;                                                  16112000
      IF NEXTREGION >= LASTMEMORYADDRESS THEN GO TO NEXTBANK;           16114000
      TOS:=TOS+RBTORASDISP;                                             16116000
      ASMB(LSEA);                                                       16118000
      FLAGS:=TOS;                                                       16120000
      IF NOT FLAGS.REGAVAILABLEFLAG THEN                                16122000
         BEGIN                                                          16124000
         TOS:=TOS+RASTORBDISP;                                          16126000
         SCANPOINT:=TOS;                                                16128000
         OK:=TRUE;                                                      16130000
         END                                                            16132000
      ELSE                                                              16134000
         BEGIN  <<MUST SKIP OVER THIS ONE>>                             16136000
         TOS:=TOS+RASTORSDISP;                                          16138000
         ASMB(LSEA);                                                    16140000
         TOS:=TOS&LSL(PAGEPOWER);                                       16142000
         TOS:=TOS+RSTORBDISP;                                           16144000
         ASMB(LADD);                                                    16146000
         IF CARRY THEN GO TO NEXTBANK;                                  16148000
         END;                                                           16150000
      END;                                                              16152000
   END                                                                  16154000
ELSE                                                                    16156000
   BEGIN  <<LAST REGION IN BANK>>                                       16158000
                                                                        16160000
   NEXTBANK:                                                            16162000
                                                                        16164000
   IF S1=NBANKS THEN                                                    16166000
      BEGIN  <<CYCLED>>                                                 16168000
      ASMB(DDEL);                                                       16170000
      SCANPOINT:=FIRSTMEMADDR;                                          16172000
      LASTCYCLEDURATION:=TSLCYCLED;                                     16174000
      TIMEOFLASTCYCLE:=CURRENTTIME;                                     16176000
      IF LASTCYCLEDURATION < CYCLETHRESHOLD AND NOT HARDREQUEST<<01987>>16178000
      THEN GIVEUP := TRUE;  <<AFRAID OF THRASHING>>            <<01987>>16180000
      IF GCLASSENABLEDMASK.CLASS0 THEN                         <<RAY.V>>16182000
         BEGIN <<COUNT # OF CYCLES>>                           <<RAY.V>>16184000
         TOS:=MEASSTATXDSBANK;                                 <<RAY.V>>16186000
         TOS:=MEASSTATXDSBASE;                                 <<RAY.V>>16188000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'CLOCKCYCLE;               <<RAY.V>>16190000
         ASMB(LSEA;INCA;SSEA;DDEL);                            <<RAY.V>>16192000
         END;                                                  <<RAY.V>>16194000
      END                                                               16196000
   ELSE                                                                 16198000
      BEGIN                                                             16200000
      S1:=S1+1; <<BUMP TO NEXT BANK>>                                   16202000
      S0:=HEADERLENGTH;                                        <<01799>>16204000
      SCANPOINT:=TOS;                                                   16206000
      END;                                                              16208000
   END;                                                                 16210000
END << SUBROUTINE UPDATESCANPOINT>>;                                    16212000
                                                                        16214000
                                                               <<01925>>16216000
HOTIMELASTMAKEROOM:=TRL(5);                                    <<01925>>16218000
LOTIMELASTMAKEROOM:=TRL(6);                                    <<01925>>16220000
CURRENTTIME:=TIMER;                                                     16222000
TSLCYCLED:=CURRENTTIME-TIMEOFLASTCYCLE;                                 16224000
IF LASTCYCLEDURATION > CYCLETHRESHOLD OR TSLCYCLED > CYCLETHRESHOLD     16226000
OR HARDREQUEST THEN                                                     16228000
   BEGIN  <<OK TO MAKE ROOM>>                                           16230000
   WHILE REQSIZE > MAXAVAILREG AND AWAKETOSCHEDMSG >= CURRACTPRI        16232000
   AND NOT GIVEUP DO                                                    16234000
      BEGIN                                                             16236000
      X:=DISCREQTABSYSBASEINX;                                 <<01987>>16238000
      IF (TOTALDISCREQCNT-INUSEDISCREQCNT) < 3 THEN            <<01987>>16240000
         BEGIN <<NOT ENOUGH DISC REQUEST ENTRIES TO PROCEDE>>  <<01987>>16242000
         MAKEROOM:=MMOUTOFDISCREQ;                             <<01987>>16244000
         RETURN;                                               <<01987>>16246000
         END;                                                  <<01987>>16248000
      TOS:=SCANPOINT;                                                   16250000
      TOS:=TOS+RBTORASDISP;                                             16252000
      DISABLE; <<MIGHT I/O FREEZE BEFORE MAKEOC>>              <<01562>>16254000
      ASMB(LSEA);                                                       16256000
      FLAGS:=TOS;                                                       16258000
      IF NOT FLAGS.REGAVAILABLEFLAG AND NOT FLAGS.REGRESERVEDFLAG       16260000
      AND FLAGS.REGNONMOVEFLAGS=0 THEN                                  16262000
         BEGIN                                                          16264000
         TOS:=TOS+RASTOSEGIDENTDISP;                                    16266000
         ASMB(LSEA);                                                    16268000
         IF =  THEN SUDDENDEATH(614);                          <<01644>>16270000
         SEGIDENT:=TOS;                                                 16272000
         IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE                       16274000
         THEN DESCSTINX:=SEGIDENT&LSL(2)                                16276000
         ELSE DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                    16278000
         IF NOT LOGICAL(DST(DESCSTINX)).ABSENTFLAG THEN        <<01557>>16280000
            BEGIN <<SEG IS PRESENT>>                           <<01557>>16282000
            DST(X).REFERENCEDFLAG:=0;  <<APPLY CLOCK ALGORITHM><<01557>>16284000
            IF = THEN MAKEOC(DESCSTINX,SEGIDENT,REQSIZE);      <<01557>>16286000
            END                                                <<01557>>16288000
         ELSE IF DST(X:=X+1).FWIPFLAG <> 1                     <<01644>>16290000
         THEN SUDDENDEATH(619);                                <<01644>>16292000
         END;                                                           16294000
      ASMB(DDEL);                                                       16296000
      ENABLE;  <<OFFSET DISABLE>>                              <<01562>>16298000
      UPDATESCANPOINT;                                                  16300000
      END;                                                              16302000
   END;                                                                 16304000
IF AWAKETOSCHEDMSGIX < CURRACTPRI THEN MAKEROOM:=MMPREEMPT     <<01987>>16306000
ELSE IF REQSIZE <= MAXAVAILREG THEN MAKEROOM:=MMOK             <<01987>>16308000
ELSE MAKEROOM:=MMTHRASHDANGER;                                 <<01987>>16310000
END  <<MAKEROOM>>;                                                      16314000
                                                                        16316000
                                                                        16318000
$PAGE "MEMORY ALLOCATION PROCEDURES : CREATE LOCK SPACE "               16320000
DOUBLE PROCEDURE CREATELOCKSPACE(PAGESREQUIRED);                        16322000
VALUE PAGESREQUIRED;                                                    16324000
INTEGER PAGESREQUIRED;                                                  16326000
OPTION PRIVILEGED,UNCALLABLE;                                           16328000
                                                                        16330000
BEGIN                                                                   16332000
                                                                        16334000
DOUBLE SEARCHBASE,                                                      16336000
       SEARCHPOINTER;                                                   16338000
INTEGER DESCSTINX,                                                      16340000
        SEGIDENT,                                                       16342000
        THISREGIONSIZE,                                                 16344000
        CONDCODE:=CCE,                                                  16346000
        POTENTIALSIZE:=0;                                               16348000
LOGICAL QUIT:=FALSE;                                                    16350000
                                                                        16352000
SUBROUTINE BUMPSEARCHBASE;                                              16354000
                                                                        16356000
BEGIN                                                                   16358000
POTENTIALSIZE:=0;                                                       16360000
TOS:=SEARCHPOINTER;                                                     16362000
TOS:=THISREGIONSIZE&LSL(PAGEPOWER);                                     16364000
ASMB(LADD);                                                             16366000
IF CARRY THEN S1:=S1+1;                                                 16368000
SEARCHBASE:=TOS;                                                        16370000
SEARCHPOINTER:=SEARCHBASE;                                              16372000
IF SEARCHBASE > LASTMEMORYADDRESS THEN                                  16374000
   BEGIN                                                                16376000
   QUIT:=TRUE;                                                          16378000
   CONDCODE:=CCG;                                                       16380000
   END;                                                                 16382000
END;                                                                    16384000
                                                                        16386000
SUBROUTINE BUMPSEARCHPOINTER;                                           16388000
                                                                        16390000
BEGIN                                                                   16392000
TOS:=SEARCHPOINTER;                                                     16394000
POTENTIALSIZE:=POTENTIALSIZE+THISREGIONSIZE;                            16396000
TOS:=THISREGIONSIZE&LSL(PAGEPOWER);                                     16398000
ASMB(LADD);                                                             16400000
IF CARRY THEN                                                           16402000
   BEGIN <<WOOPS-WENT OFF THE END OF THE BANK>>                         16404000
   ASMB(DDEL);                                                          16406000
   BUMPSEARCHBASE ;                                                     16408000
   END                                                                  16410000
ELSE                                                                    16412000
   BEGIN <<BUMP TO NEXT REGION IN THE BANK>>                            16414000
   SEARCHPOINTER:=TOS;                                                  16416000
   IF SEARCHPOINTER > LASTMEMORYADDRESS THEN                            16418000
      BEGIN                                                             16420000
      QUIT:=TRUE;                                                       16422000
      CONDCODE:=CCG;                                                    16424000
      END;                                                              16426000
   END;                                                                 16428000
END;                                                                    16430000
                                                                        16432000
                                                                        16434000
SEARCHPOINTER:=SEARCHBASE:=FIRSTMEMADDR;                                16436000
WHILE POTENTIALSIZE < PAGESREQUIRED AND NOT QUIT DO                     16438000
   BEGIN                                                                16440000
   TOS:=SEARCHPOINTER;                                                  16442000
   TOS:=TOS+RBTORSDISP;                                                 16444000
   DISABLE;                                                             16446000
   ASMB(LSEA);                                                          16448000
   THISREGIONSIZE:=TOS;                                                 16450000
   TOS:=TOS+RSTORASDISP;                                                16452000
   ASMB(LSEA);                                                          16454000
   IF LS0.REGAVAILABLEFLAG THEN BUMPSEARCHPOINTER                       16456000
   ELSE IF LS0.REGLKDFLAG THEN BUMPSEARCHBASE                           16458000
   ELSE IF LS0.REGFZFLAG THEN BUMPSEARCHBASE                            16460000
   ELSE IF LS0.REGIOFZFLAG THEN                                         16462000
      BEGIN <<DELAY>>                                                   16464000
      <<CONDCODE:=CCL;>>                                                16466000
      <<QUIT:=TRUE;>>                                                   16468000
      BUMPSEARCHBASE ; <<DAMN LP DRIVER WON'T I/O UNFREEZE>>            16470000
      END                                                               16472000
   ELSE                                                                 16474000
      BEGIN                                                             16476000
      ASMB(DEL);                                                        16478000
      TOS:=TOS+RASTOSEGIDENTDISP;                                       16480000
      ASMB(LSEA);                                                       16482000
      SEGIDENT:=TOS;                                                    16484000
      IF SEGIDENT.SEGIDTYPEFIELD=SEGIDDATATYPE                          16486000
      THEN DESCSTINX:=SEGIDENT&LSL(2) <<DATA SEG>>                      16488000
      ELSE DESCSTINX:=CONVSEGIDTOSTINX(SEGIDENT);                       16490000
      IF LOGICAL(DST(DESCSTINX+1)).IMIFLAG THEN                         16492000
         BEGIN <<DELAY TILL READ COMPLETES>>                            16494000
         CONDCODE:=CCL;                                                 16496000
         QUIT:=TRUE;                                                    16498000
         END                                                            16500000
      ELSE                                                              16502000
         BEGIN  <<THROW THE SEG OUT>>                                   16504000
         MAKEOC(DESCSTINX,SEGIDENT,0);                                  16506000
         ENABLE;                                                        16508000
         BUMPSEARCHPOINTER;                                             16510000
         END;                                                           16512000
      END;                                                              16514000
   ENABLE;                                                              16516000
   END;                                                                 16518000
                                                                        16520000
IF NOT QUIT THEN CREATELOCKSPACE:=SEARCHBASE                            16522000
ELSE CREATELOCKSPACE:=0D;                                               16524000
CC:=CONDCODE;                                                           16526000
END  <<CREATELOCKSPACE>>;                                               16528000
                                                                        16530000
$PAGE "MEMORY ALLOCATION PROCEDURES : FETCH SEGMENT"                    16532000
INTEGER PROCEDURE FETCHSEGMENT(SEGIDENTIFIER,REQUESTORID,               16534000
   SPECIALFLAGS,SPECIALINFO,HARDREQUEST);                               16536000
VALUE SEGIDENTIFIER,REQUESTORID,SPECIALFLAGS,SPECIALINFO,HARDREQUEST;   16538000
INTEGER REQUESTORID;                                                    16540000
LOGICAL SEGIDENTIFIER,SPECIALFLAGS,SPECIALINFO,HARDREQUEST;             16542000
OPTION PRIVILEGED,UNCALLABLE;                                           16544000
                                                                        16546000
COMMENT                                                                 16548000
                                                                        16550000
FETCHSEGMENT IS INVOKED BY THE DISPATCHER DIRECTLY FOR A SEGMENT        16552000
REQUEST FROM THE I/O SYSTEM, AND FROM THE DISPATCHER'S SUBROUTINE       16554000
SWAPIN FOR SEGMENTS REQUIRED BY A PROCESS BEING SWAPPED                 16556000
IN.                                                                     16558000
                                                                        16560000
FETCHSEGMENT CHECKS THE ST DESCRIPTOR TO SEE IF THE SEGMENT IS          16562000
ALREADY PRESENT OR ON ITS WAY IN ON BEHALF OF ANOTHER PROCESS.          16564000
IF SUCH IS THE CASE, NO MAIN MEMORY ALLOCATION IS REQUIRED. IF          16566000
THE SEGMENT IS PRESENT, CONTROL RETURNS IMMEDIATELY TO THE              16568000
CALLER.  IF THE SEGMENT IS ON ITS WAY IN, THE PROCESS' PCB              16570000
OR THE DEVICE'S LDEVNUM IS QUEUED FOR THE SEGMENT, AND WHEN             16572000
THE READ COMPLETES, THE PROCESS' COUNTER FOR READ COOMPLETIONS          16574000
UNTIL AWAKE IS DECREMENTED AND IF IT FALLS TO ZERO THE PROCESS          16576000
IS LAUNCHED, OR AWAKEIO IS CALLED AGAINST THE DEVICE FOR IO REQUESTS.   16578000
                                                                        16580000
IF THE SEGMENT IS ABSENT,AN AVAILABLE MAIN MEMORY REGION IS             16582000
RESERVED FOR THE SEGMENT, OR, IF A LARGE ENOUGH REGION IS NOT           16584000
AVAILABLE, AN ATTEMPT IS MADE TO MAKEROOM.  IF A REGION IS              16586000
OBTAINED, A READ FOR THE SEGMENT IS FORMED, AND THE DISCREQ             16588000
POINTER IS PLACED INTO THE REGION HEADER.  THE PROCESS OR               16590000
DEVICE IS QUEUED FOR THE SEGMENT.                                       16592000
                                                                        16594000
THE I/O SYSTEM FINISHES OFF THE FETCH ON THE ICS.  WHEN                 16596000
ONGOING I/O COMPLETES IN THE REGION RESERVED FOR THE                    16598000
SEGMENT FETCH, THE READ REQUEST IS QUEUED.  WHEN THE READ               16600000
COMPLETES, THE WAITING PROCESSES AND DEVICES ARE AWAKENED.              16602000
                                                                        16604000
                                                                        16608000
;                                                                       16610000
                                                                        16612000
BEGIN                                                                   16614000
                                                                        16616000
<<DB ASSUMED TO BE AT SYSDB>>                                           16618000
                                                                        16620000
DOUBLE REGIONBASE;                                                      16622000
                                                                        16624000
LOGICAL REQSIZE;                                                        16626000
                                                                        16628000
INTEGER SEGSIZE,                                                        16630000
        XFERCNT,                                                        16632000
        SEGDESCSTINX,                                                   16634000
        SEGDESCSYSBASEINX,                                              16636000
        HODA,                                                           16638000
        LODA,                                                           16640000
        DISCREQINX,                                                     16642000
        COUNT,                                                          16644000
        PROCPRI,                                                        16646000
        SPECREQINX,                                                     16648000
        MSTATPARM2,                                            <<01571>>16650000
        READOFFSET:=0;                                                  16652000
                                                                        16654000
LOGICAL DATASEG:=FALSE,                                                 16656000
        SWAPPINGIN:=FALSE,                                              16658000
        SEGMODPNDG:=FALSE,                                              16660000
        IOSYSREQ:=FALSE,                                                16662000
        IOFZREQ:=FALSE,                                                 16664000
        FZREQ:=FALSE,                                                   16666000
        LKREQ:=FALSE,                                                   16668000
        BKLKREQ:=FALSE;                                                 16670000
LOGICAL REGASSIGNSTATE;                                        <<03764>>16672000
                                                               <<03764>>16674000
                                                                        16676000
SUBROUTINE GETINSEGSQUEUE;                                              16678000
                                                                        16680000
COMMENT                                                                 16682000
GET IN SEG'S QUEUE INSERTS THE PROCESS' OR DEVICES' IDENTIFIER          16684000
INTO THE SEGMENT'S QUEUE.                                               16686000
;                                                                       16688000
BEGIN                                                                   16690000
                                                                        16692000
<<                                                                      16694000
QUEUE PROC/DEVICE FOR SEGMENT                                           16696000
>>                                                                      16698000
                                                                        16700000
                                                                        16702000
IF IOSYSREQ THEN PUTDEVICEONSEGSMPQ(REQUESTORID,                        16704000
REGIONBASE) ELSE                                                        16706000
   BEGIN                                                                16708000
   TOS:=(REQUESTORID-PCBSYSBASEINX)/PCBSIZE; <<PIN>>                    16710000
   TOS:=SEGIDENTIFIER;                                                  16712000
   TOS:=REGIONBASE;                                                     16714000
   X:=REQUESTORID;                                                      16716000
   TOS:=SLLPTR;                                                         16718000
   TOS:=SPECIALINFO;  <<REQSLLENTRYINX>>                                16720000
   PUTPROCONSEGSMPQ(*,*,*,*,*);                                         16722000
   END;                                                                 16724000
                                                                        16726000
<<                                                                      16728000
MARK SEGMENT IN MOTION IN                                               16730000
>>                                                                      16732000
                                                                        16734000
X:=SEGDESCSYSBASEINX;                                                   16736000
SEGDESCFLAGS.IMIFLAG:=1;                                                16738000
END <<SUBROUTINE GETINSEGSQUEUE>>;                                      16740000
                                                                        16742000
SUBROUTINE BUMPREADPRI;                                        <<02825>>16744000
                                                               <<02825>>16746000
COMMENT                                                        <<02825>>16748000
                                                               <<02825>>16750000
BUMPS THE PRIORITY OF A PENDING READ REQUEST FOR A SEGMENT     <<02825>>16752000
ALREADY ON ITS WAY IN TO AT LEAST THE PRIORITY OF THE          <<02825>>16754000
REQUESTOR.                                                     <<02825>>16756000
                                                               <<02825>>16758000
;                                                              <<02825>>16760000
                                                               <<02825>>16762000
BEGIN                                                          <<02825>>16764000
                                                               <<02825>>16766000
<<DETERMINE THE STATE OF THE READ REQUEST>>                    <<02825>>16768000
                                                               <<02825>>16770000
DISABLE;                                                       <<02825>>16772000
TOS:=REGIONBASE;                                               <<02825>>16774000
TOS:=TOS+RBTOINITINFODISP;                                     <<02825>>16776000
ASMB(LSEA);                                                    <<02825>>16778000
X:=TOS;  <<PUT READ REQ PTR INTO X>>                           <<02825>>16780000
ASMB(DDEL);  <<GET RID OF ADDR ON TOS>>                        <<02825>>16782000
TOS:=DISCREQFLAGS;                                             <<02825>>16784000
ASMB(TBC COMPLETEDFLAG);                                       <<02825>>16786000
IF = THEN                                                      <<02825>>16788000
   BEGIN  <<ITS NOT DONE YET>>                                 <<02825>>16790000
   ASMB(TBC REQQUEUEDBIT);                                     <<02825>>16792000
   IF <> THEN                                                  <<02825>>16794000
      BEGIN  <<THE REQUEST IS QUEUED>>                         <<02825>>16796000
      IF REQURGCLASS > PROCPRI THEN                            <<02825>>16798000
         BEGIN <<GOT TO BUMP IT>>                              <<02825>>16800000
         REQURGCLASS:=PROCPRI;                                 <<02825>>16802000
         DISCQMANAGER(X,QUEUEREQCODE);                         <<02825>>16804000
         IF < THEN SUDDENDEATH(618); <<ALREADY DONE>>          <<02825>>16806000
         END;                                                  <<02825>>16808000
      END                                                      <<02825>>16810000
      ELSE IF REQURGCLASS > PROCPRI                            <<02825>>16812000
      THEN REQURGCLASS:=PROCPRI;                               <<02825>>16814000
      END;                                                     <<02825>>16816000
ASMB(DEL); <<GET RID OF FLAGS>>;                               <<02825>>16818000
                                                               <<02825>>16820000
END <<BUMPREADPRI>> ;                                          <<02825>>16822000
                                                               <<02825>>16824000
<<LOG FETCH EVENT FOR DUMP ANALYSIS>>                          <<01987>>16826000
                                                               <<01987>>16828000
MSTATPARM2 := SPECIALFLAGS;                                    <<01571>>16830000
MSTATPARM2.(8:8) := IF SPECIALFLAGS.(0:1) = 1 THEN REQUESTORID <<01571>>16832000
                    ELSE (REQUESTORID-PCBSYSBASEINX)/PCBSIZE;  <<01571>>16834000
                                                                        16836000
<<FILL IN LOCAL VARIABLES>>                                    <<02825>>16838000
                                                               <<02825>>16840000
TOS:=SPECIALFLAGS;                                                      16842000
IF = THEN ASMB(DEL) ELSE                                                16844000
   BEGIN <<SOME SPECIAL ASPECTS TO THIS SEGMENT REQUEST>>               16846000
   ASMB(TBC IOSYSREQBIT);                                               16848000
   IF <> THEN IOSYSREQ:=TRUE;                                           16850000
   ASMB(TBC IOFZREQBIT);                                                16852000
   IF <> THEN IOFZREQ:=TRUE;                                            16854000
   ASMB(TBC BKLKREQBIT);                                                16856000
   IF <> THEN BKLKREQ:=TRUE;                                            16858000
   ASMB(TBC LKREQBIT);                                                  16860000
   IF <> THEN LKREQ:=TRUE;                                              16862000
   ASMB(TBC FZREQBIT);                                                  16864000
   IF <> THEN FZREQ:=TRUE;                                              16866000
   ASMB(DEL);                                                           16868000
   END;                                                                 16870000
X:=REQUESTORID;                                                <<02825>>16872000
IF IOSYSREQ THEN PROCPRI:=FORCEDWRITEPRI                       <<02825>>16874000
ELSE PROCPRI:=QUEUEINGINFO.PRIFIELD;                           <<02825>>16876000
                                                                        16878000
<<                                                                      16880000
DETERMINE SEGMENT'S CURRENT STATE AND PROCEDE ACCORDING TO IT           16882000
>>                                                                      16884000
                                                                        16886000
FETCHSEGMENT:=MMOK;  <<ASSUME SUCCESS>>                        <<01987>>16888000
IF SEGIDENTIFIER.SEGIDTYPEFIELD=SEGIDDATATYPE                           16890000
THEN SEGDESCSTINX:=SEGIDENTIFIER&LSL(2) <<DATA SEG>>                    16892000
ELSE SEGDESCSTINX:=CONVSEGIDTOSTINX(SEGIDENTIFIER);                     16894000
IF SEGIDENTIFIER.SEGIDTYPEFIELD=SEGIDDATATYPE THEN DATASEG:=TRUE;       16896000
X:=SEGDESCSYSBASEINX:=DSTSYSBASEINX+SEGDESCSTINX;                       16898000
IF BKLKREQ OR LKREQ THEN                                                16900000
   BEGIN  <<GET RID OF SEG IF IT'S NOT LOCKED>>                         16902000
   IF (SEGDESCFIRMINFO.ABSENTFLAG LAND SEGDESCFLAGS.IMIFLAG)            16904000
   LOR (SEGDESCFIRMINFO.ABSENTFLAG LAND SEGDESCFLAGS.ROCFLAG)           16906000
   LOR NOT SEGDESCFIRMINFO.ABSENTFLAG THEN                              16908000
      BEGIN  <<SEG AROUND OR IMI-CHECK IF LOCKED>>                      16910000
      TOS:=SEGDESCBANK;                                                 16912000
      TOS:=SEGDESCADDR;                                                 16914000
      TOS:=TOS+RBTORASDISP;                                             16916000
      ASMB(LSEA);                                                       16918000
       REGASSIGNSTATE:=S0;                                     <<03764>>16920000
                                                               <<01897>>16922000
                                                               <<01897>>16924000
       IF NOT REGASSIGNSTATE.REGLKDFLAG AND                    <<03764>>16926000
          NOT REGASSIGNSTATE.REGFZFLAG THEN                    <<03764>>16928000
         BEGIN  <<NOT LOCKED OR FROZEN - GET RID OF IT>>       <<01897>>16930000
         IF TOS.REGIOFZFLAG OR SEGDESCFLAGS.IMIFLAG THEN       <<02300>>16932000
            BEGIN  <<IN MOTION IN OR IOFRZN - WAIT A WHILE>>   <<01897>>16934000
            FETCHSEGMENT:=MMSEGBUSY;                           <<01987>>16936000
            RETURN;                                                     16938000
            END;                                                        16940000
         IF NOT SEGDESCFLAGS.ROCFLAG                                    16942000
         THEN MAKEOC(SEGDESCSTINX,SEGIDENTIFIER,0);                     16944000
         DISABLE;                                                       16946000
         SEGDESCFLAGS.ROCFLAG:=0;                                       16948000
         TOS:=TOS+RASTOHODADISP;                                        16950000
         ASMB(LDEA);                                                    16952000
         SEGDESCLODA:=TOS;  <<PUT DISC ADDRESS INTO DESCRIPTOR>>        16954000
         SEGDESCHODA:=TOS;                                              16956000
         TOS:=TOS+HODATOSEGIDENTDISP;                                   16958000
         IF SEGIDENTIFIER.SEGIDTYPEFIELD <> SEGIDDATATYPE               16960000
         OR DST(SEGDESCSTINX+1).DISCCOPYVALIDFLAG=1 THEN                16962000
            BEGIN <<WIPE OUT TRACE OF SEGMENT IN MEMEORY REGION>>       16964000
            TOS:=0;                                                     16966000
            ASMB(SSEA);                                                 16968000
            END                                                         16970000
         ELSE DST(SEGDESCSTINX+1).FWIPFLAG:=1;<<SIGNAL COMP>>  <<01696>>16972000
         ASMB(DDEL);                                                    16974000
         ENABLE;                                                        16976000
         END                                                   <<01897>>16978000
      ELSE ASMB(DEL);  <<PITCH RAS>>                           <<01897>>16980000
      END;                                                              16982000
   END;                                                                 16984000
                                                                        16986000
X:=SEGDESCSYSBASEINX:=DSTSYSBASEINX+SEGDESCSTINX;                       16988000
DISABLE;                                                                16990000
IF NOT SEGDESCFIRMINFO.ABSENTFLAG THEN                                  16992000
   BEGIN  <<SEGMENT IS ALREADY PRESENT>>                                16994000
   TOS:=SEGDESCBANK;                                                    16996000
   TOS:=SEGDESCADDR;                                                    16998000
   REGIONBASE:=TOS;                                                     17000000
   MMSTAT(4,SEGIDENTIFIER,MSTATPARM2,0);                       <<01571>>17002000
   END                                                                  17004000
ELSE                                                                    17006000
   BEGIN <<SEGMENT ISN'T PRESENT>>                                      17008000
   IF GCLASSENABLEDMASK.CLASS0 THEN                                     17010000
      BEGIN  <<MEASURE MEMORY ALLOCATION EVENT>>                        17012000
      TOS:=MEASSTATXDSBANK;                                             17014000
      TOS:=MEASSTATXDSBASE;                                             17016000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'MEMALLOC;                    <<RAY.V>>17018000
      ASMB(LSEA);                                                       17020000
      TOS:=TOS+1;                                                       17022000
      ASMB(SSEA;DDEL);                                                  17024000
      END;                                                              17026000
   X:=SEGDESCSYSBASEINX;                                                17028000
   IF SEGDESCFIRMINFO=%100000 THEN SUDDENDEATH(617);           <<01644>>17030000
   IF LOGICAL(SEGDESCFLAGS).ROCFLAG THEN                                17032000
      BEGIN  <<CAN RECOVER THE SEGMENT>>                                17034000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  17036000
         BEGIN  <<MEASURE RECOVER EVENT DURING ALLOCATION>>             17038000
         TOS:=MEASSTATXDSBANK;                                          17040000
         TOS:=MEASSTATXDSBASE;                                          17042000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'OLCANDRECOVERY;           <<RAY.V>>17044000
         ASMB(LSEA);                                                    17046000
         TOS:=TOS+1;                                                    17048000
         ASMB(SSEA;DDEL);                                               17050000
         END;                                                           17052000
      ENABLE;                                                           17054000
      MMSTAT(4,SEGIDENTIFIER,MSTATPARM2,1);                    <<01571>>17056000
      RECOVEROC(SEGIDENTIFIER,SEGDESCSTINX);                            17058000
      X:=SEGDESCSYSBASEINX;                                             17060000
      TOS:=SEGDESCBANK;                                                 17062000
      TOS:=SEGDESCADDR;                                                 17064000
      REGIONBASE:=TOS;                                                  17066000
      END                                                               17068000
   ELSE                                                                 17070000
      BEGIN  <<SEGMENT NOT PRESENT, NOT AN OVERLAY CANDIDATE>>          17072000
      IF SEGDESCFLAGS.IMIFLAG THEN                                      17074000
         BEGIN <<SEG IS ON ITS WAY IN FOR SOMEONE ELSE>>                17076000
         TOS:=SEGDESCBANK;                                              17078000
         TOS:=SEGDESCADDR;                                              17080000
         REGIONBASE:=TOS;                                               17082000
         GETINSEGSQUEUE;                                                17084000
         IF GCLASSENABLEDMASK.CLASS0 THEN                               17086000
            BEGIN  <<MEASURE IMI EVENT>>                                17088000
            TOS:=MEASSTATXDSBANK;                                       17090000
            TOS:=MEASSTATXDSBASE;                                       17092000
            TOS:=TOS+C0SUB0'SEGRELOFF+C'INMOTIONIN;            <<RAY.V>>17094000
            ASMB(LSEA);                                                 17096000
            TOS:=TOS+1;                                                 17098000
            ASMB(SSEA;DDEL);                                            17100000
            END;                                                        17102000
         BUMPREADPRI;                                          <<02825>>17104000
         MMSTAT(4,SEGIDENTIFIER,MSTATPARM2,2);                 <<01571>>17106000
         END                                                            17108000
      ELSE                                                              17110000
         BEGIN <<SEG NOT PRESENT,NOT IN MOTION IN>>                     17112000
      X:=DISCREQTABSYSBASEINX;                                 <<01987>>17114000
      IF (TOTALDISCREQCNT-INUSEDISCREQCNT) < 2 THEN            <<01987>>17116000
         BEGIN <<NOT ENOUGH DISC REQUEST ENTRIES TO PROCEDE>>  <<01987>>17118000
         FETCHSEGMENT:=MMOUTOFDISCREQ;                         <<01987>>17120000
         RETURN;                                               <<01987>>17122000
         END;                                                  <<01987>>17124000
         ENABLE;                                                        17126000
         <<MUST GET SPACE AND INITIATE READ>>                           17128000
            MMSTAT(4,SEGIDENTIFIER,MSTATPARM2,3);              <<01571>>17130000
         X:=SLLPTR;                                                     17134000
         IF DATASEG THEN                                                17136000
            BEGIN <<ADJUST FOR NEW SIZE IF SEG MOD PENDING>>            17138000
            IF LOGICAL(DST(SEGDESCSTINX+1)).SEGMODREQFLAG THEN          17140000
               BEGIN                                                    17142000
               SEGMODPNDG:=TRUE;                                        17144000
               <<FIND OUT NEW SIZE FOR SEGMENT>>                        17146000
               X:=SPECQHEAD;                                            17148000
               WHILE ENTRYWORD01 <> SEGIDENTIFIER                       17150000
               DO X:=ENTRYWORD00;  <<CHASE THROUGH Q>>                  17152000
               SPECREQINX:=X;                                           17154000
               TOS:=ENTRYWORD02&LSL(2);                                 17156000
               END                                                      17158000
            ELSE TOS:=DST(SEGDESCSTINX).DATASIZEFIELD&LSL(2);           17160000
            XFERCNT:=DST(SEGDESCSTINX).DATASIZEFIELD&LSL(2);            17162000
            END                                                         17164000
         ELSE                                                           17166000
            BEGIN                                                       17168000
            X:=SEGDESCSYSBASEINX;                                       17170000
            TOS:=SEGDESCFIRMINFO.CODESIZEFIELD&LSL(2);                  17172000
            XFERCNT:=S0;                                                17174000
            END;                                                        17176000
         SEGSIZE:=S0;                                                   17178000
         IF = THEN SUDDENDEATH(619);                           <<01644>>17180000
         TOS:=(TOS+OVERHEAD-1)&LSR(PAGEPOWER)+1;                        17182000
         REQSIZE:=TOS;                                                  17184000
         IF LKREQ OR BKLKREQ THEN                                       17186000
            BEGIN                                                       17188000
            REGIONBASE:=CREATELOCKSPACE(REQSIZE);                       17190000
            IF <> THEN                                                  17192000
               BEGIN  <<DIDN'T MAKE IT>>                                17194000
               IF < THEN FETCHSEGMENT:=MMSEGBUSY               <<01987>>17196000
               ELSE FETCHSEGMENT:=MMNOLOCKSPACE;               <<01987>>17198000
               RETURN;                                                  17200000
               END;                                                     17202000
            END;                                                        17204000
         IF REQSIZE > LOGICAL(MAXAVAILREG) THEN                         17206000
            BEGIN <<NOT A BIG ENOUGH REGION AVAILABLE>>                 17208000
            TOS:=MAKEROOM(REQUESTORID,REQSIZE,HARDREQUEST);             17210000
            FETCHSEGMENT:=S0;                                  <<01987>>17214000
            IF TOS <> MMOK THEN RETURN;                        <<01987>>17216000
               IF GCLASSENABLEDMASK.CLASS0 THEN                <<RAY.V>>17218000
                  BEGIN <<COUNT SUCCESSFUL MAKEROOM>>          <<RAY.V>>17220000
                  TOS:=MEASSTATXDSBANK;                        <<RAY.V>>17222000
                  TOS:=MEASSTATXDSBASE;                        <<RAY.V>>17224000
                  TOS:=TOS+C0SUB0'SEGRELOFF+C'MAKEROOMSUCCESS; <<RAY.V>>17226000
                  ASMB(LSEA;INCA;SSEA;DDEL);                   <<RAY.V>>17228000
                  END;                                         <<RAY.V>>17230000
               END                                             <<RAY.V>>17232000
            ELSE                                               <<RAY.V>>17234000
               IF GCLASSENABLEDMASK.CLASS0 THEN                <<RAY.V>>17236000
                  BEGIN <<COUNT FOUND FREE SPACE>>             <<RAY.V>>17238000
                  TOS:=MEASSTATXDSBANK;                        <<RAY.V>>17240000
                  TOS:=MEASSTATXDSBASE;                        <<RAY.V>>17242000
                  TOS:=TOS+C0SUB0'SEGRELOFF+C'FREESPACE;       <<RAY.V>>17244000
                  ASMB(LSEA);                                  <<RAY.V>>17246000
                  TOS:=TOS+1;                                  <<RAY.V>>17248000
                  ASMB(SSEA;DDEL);                             <<RAY.V>>17250000
                  END;                                         <<RAY.V>>17252000
         <<                                                             17254000
         SPACE IS AVAILABLE FOR REQUEST-RESERVE A REGION                17256000
                   AND INITIATE THE SEGMENT READ                        17258000
         >>                                                             17260000
                                                                        17262000
         IF LKREQ OR BKLKREQ                                            17264000
         THEN TOS:=RESERVEREGION(REQSIZE,MAXHOLESIZE,PROCPRI,           17266000
            LOCKCODE,REGIONBASE)                                        17268000
         ELSE TOS:=RESERVEREGION(REQSIZE,MAXHOLESIZE,PROCPRI,           17270000
            NOINFO,0D);                                                 17272000
         ASMB(DDUP);                                                    17274000
         REGIONBASE:=TOS;                                               17276000
         IF = THEN SUDDENDEATH(619);                           <<01644>>17278000
         <<REPLACE SEG DISC ADDRESS WITH NEW MEMORY ADDRESS>>           17280000
         X:=SEGDESCSYSBASEINX;                                          17282000
         HODA:=SEGDESCHODA;                                             17284000
         LODA:=SEGDESCLODA;                                             17286000
         SEGDESCADDR:=TOS;                                              17288000
         SEGDESCBANK:=TOS;                                              17290000
                                                                        17292000
         <<CHECK FOR STACK EXPANSIONS REQUIRING A DISPLACED READ>>      17294000
                                                                        17296000
         IF DATASEG THEN                                                17298000
            BEGIN                                                       17300000
            IF LOGICAL(DST(X:=SEGIDENTIFIER&LSL(2)+1)).STKFLAG THEN     17302000
               BEGIN                                                    17304000
               IF LOGICAL(DST(X)).SEGMODREQFLAG THEN                    17306000
                  BEGIN <<LOOK UP READ OFFSET>>                         17308000
                  X:=SPECREQINX;                                        17310000
                  READOFFSET:=ENTRYWORD03;                              17312000
                  END;                                                  17314000
               END;                                                     17316000
            END;                                                        17318000
                                                                        17320000
         <<                                                             17322000
         BUILD SEGMENT READ DISC REQUEST                                17324000
         >>                                                             17326000
                                                                        17328000
         X:=DISCREQINX:=GETDISCREQ(2); <<NO IMPEDE>>           <<01644>>17330000
         IF X=0 THEN SUDDENDEATH(601); <<DISCREQTAB TOO SMALL>><<01644>>17332000
         TOS:=0;                                                        17334000
         TOS.MMDISCREQFLAG:=1;                                          17336000
         DISCREQFLAGS:=TOS;                                             17338000
         TOS:=REGIONBASE;                                               17340000
         TOS:=READOFFSET;                                               17342000
         ASMB(DUP);                                                     17344000
         REQREADDISP:=TOS;                                              17346000
         ASMB(LADD);                                                    17348000
         REQMMBASE:=TOS;                                                17350000
         REQMMBANK:=TOS;                                                17352000
         REQFUNCTION:=READREQ;                                          17354000
         TOS:=XFERCNT;                                                  17356000
         REQTRANSFERCNT:=TOS;                                           17358000
         REQLDEVN:=HODA.(0:8);                                          17360000
         REQHODA:=HODA.(8:8);                                           17362000
         DISCREQSTATUS:=0;                                              17364000
         REQLODA:=LODA;                                                 17366000
         REQSEGIDENT:=SEGIDENTIFIER;                                    17368000
         IF SWAPPINGIN THEN REQURGCLASS:=BKGRNDREADPRI                  17370000
         ELSE REQURGCLASS:=PROCPRI;                                     17372000
         IF SWAPPINGIN THEN AUXDISCREQFLAGS.SWAPINREADREQFLAG:=1;       17374000
                                                                        17376000
         <<                                                             17378000
         PUT SEGIDENT, DISCREQP, DISC ADDRESS INTO REGION HEADER        17380000
         >>                                                             17382000
                                                                        17384000
         TOS:=REGIONBASE;                                               17386000
         TOS:=TOS+RBTOSEGIDENTDISP;                                     17388000
         TOS:=SEGIDENTIFIER;                                            17390000
         ASMB(SSEA);                                                    17392000
         TOS:=TOS+SEGIDENTTOINITINFODISP;                               17394000
         TOS:=DISCREQINX;;                                              17396000
         ASMB(SSEA);  <<PUT DISCREQP INTO THE REGION HEADER>>           17398000
         TOS:=TOS+INITINFOTOHODADISP;                                   17400000
         TOS:=HODA;                                                     17402000
         TOS:=LODA;                                                     17404000
         ASMB(SDEA);                                                    17406000
                                                                        17408000
         <<                                                             17410000
         BUILD REQUEST COMPLETION MESSAGE, AND STORE INTO HEADER        17412000
         >>                                                             17414000
                                                                        17416000
         TOS:=TOS+HODATOCOMPMSGDISP;                                    17418000
         TOS:=0;                                                        17420000
         IF SEGMODPNDG THEN TOS.COMPMSGMODFLAG:=1;                      17422000
         IF BKLKREQ THEN TOS.COMPMSGBLKDLKFLAG:=1;                      17424000
         ASMB(SSEA);                                                    17426000
                                                                        17428000
         <<                                                             17430000
         GET PROCESS/DEVICE IN LINE FOR THE SEGMENT                     17432000
         >>                                                             17434000
                                                                        17436000
         DISABLE;                                              <<01816>>17438000
         GETINSEGSQUEUE;                                                17440000
                                                                        17442000
                                                                        17444000
         <<                                                             17446000
         BUILD INITIATION MESSAGE AND PUT IN REGION HEADER              17448000
         >>                                                             17450000
                                                                        17452000
         TOS:=TOS+COMPMSGTOINITMSGDISP;                                 17454000
         DISABLE;                                                       17456000
         ASMB(LSEA);                                                    17458000
         TOS.QUEUEREADREQFLAG:=1;                                       17460000
         TOS.INITMSGTOGGLESWITCH:=0;                                    17462000
         IF DATASEG AND NOT LOGICAL(DST(X:=SEGDESCSTINX+1)).            17464000
            DISCCOPYVALIDFLAG THEN TOS.MSGEXTDISABLEDFLAG:=1;           17466000
         ASMB(SSEA);                                                    17468000
         TOS:=TOS+INITMSGTORBDISP;                                      17470000
         PROCESSINITMSG(*);                                             17472000
         END;                                                           17474000
      END;                                                              17476000
   END;                                                                 17478000
TOS:=SPECIALFLAGS;                                                      17480000
IF <> THEN                                                              17482000
   BEGIN <<UPDATE SPECIAL STATE COUNTERS IN THE REGION HEADER>>         17484000
   DISABLE;                                                             17486000
   TOS:=REGIONBASE;                                                     17488000
   IF IOFZREQ THEN                                                      17490000
      BEGIN                                                             17492000
      TOS:=TOS+RBTOWDIOFZCNTDISP;                                       17494000
      ASMB(LSEA);                                                       17496000
      COUNT:=TOS;                                                       17498000
      COUNT.IOFZCNTFIELD:=COUNT.IOFZCNTFIELD+1;                         17500000
      TOS:=COUNT;                                                       17502000
      ASMB(SSEA);                                                       17504000
      TOS:=TOS+WDIOFZCNTTORASDISP;                                      17506000
      ASMB(LSEA);                                                       17508000
      TOS.REGIOFZFLAG:=1;                                               17510000
      ASMB(SSEA);                                                       17512000
      MMSTAT(2,SEGIDENTIFIER,%100000,COUNT.IOFZCNTFIELD);      <<01571>>17514000
      END                                                               17516000
   ELSE                                                                 17518000
      BEGIN                                                             17520000
      TOS:=TOS+RBTOLKFZCNTDISP;                                         17522000
      ASMB(LSEA);                                                       17524000
      COUNT:=TOS;                                                       17526000
      IF LKREQ OR BKLKREQ THEN COUNT.LKCNTFIELD:=COUNT.LKCNTFIELD+1     17528000
      ELSE IF FZREQ THEN COUNT.FZCNTFIELD:=COUNT.FZCNTFIELD+1;          17530000
      TOS:=COUNT;                                                       17532000
      ASMB(SSEA);                                                       17534000
      TOS:=TOS+LKFZCNTTORASDISP;                                        17536000
      ASMB(LSEA);                                                       17538000
      IF FZREQ THEN TOS.REGFZFLAG:=1                                    17540000
      ELSE IF LKREQ OR BKLKREQ THEN TOS.REGLKDFLAG:=1;                  17542000
      ASMB(SSEA);                                                       17544000
      IF LKREQ OR BKLKREQ THEN                                 <<01571>>17546000
         MMSTAT(2,SEGIDENTIFIER,%100002,COUNT)                 <<01571>>17548000
      ELSE IF FZREQ THEN                                       <<01571>>17550000
         MMSTAT(2,SEGIDENTIFIER,%100001,COUNT);                <<01571>>17552000
      X:=SPECIALINFO;  <<SLLREQINX>>                                    17554000
      IF FZREQ THEN SLLFLAGS.SLLFZREQFLAG:=0                            17556000
      ELSE IF LKREQ THEN SLLFLAGS.SLLLKREQFLAG:=0                       17558000
      ELSE IF BKLKREQ THEN SLLFLAGS.SLLBLKLOCKREQFLAG:=0;               17560000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  17562000
         BEGIN  <<MEASURE LOCK OR FREEZE REQUEST>>                      17564000
         TOS:=MEASSTATXDSBANK;                                          17566000
         TOS:=MEASSTATXDSBASE;                                          17568000
         IF FZREQ THEN TOS:=TOS+C0SUB0'SEGRELOFF+C'FREEZEREQ   <<RAY.V>>17570000
            ELSE TOS:=TOS+C0SUB0'SEGRELOFF+C'LOCKREQ;          <<RAY.V>>17572000
         ASMB(LSEA);                                                    17574000
         IF FZREQ AND COUNT.FZCNTFIELD=1 THEN TOS:=TOS+1                17576000
         ELSE IF COUNT.LKCNTFIELD=1 THEN TOS:=TOS+1;                    17578000
         ASMB(SSEA;DDEL);                                               17580000
         END;                                                           17582000
      END;                                                              17584000
   END;                                                                 17586000
END   <<PROCEDURE FETCHSEGMENT>>;                                       17588000
                                                                        17590000
$PAGE "MEMORY ALLOCATION PROCEDURES : SWAPIN"                           17592000
                                                                        17594000
INTEGER PROCEDURE SWAPIN(SWAPINPROCINX,HARDREQUEST);                    17596000
VALUE SWAPINPROCINX,HARDREQUEST;                                        17598000
INTEGER SWAPINPROCINX;                                                  17600000
LOGICAL HARDREQUEST;                                                    17602000
OPTION PRIVILEGED,UNCALLABLE;                                           17604000
                                                                        17606000
COMMENT                                                                 17608000
                                                                        17610000
SWAPIN IS INVOKED BY A CPU'S DISPATCHER WHEN HE HAS DECIDED TO          17612000
DEVOTE HIS CPU TO WORKING ON SWAPPING IN THE LOCALITY OF                17614000
A PROCESS REQUIRING SHEDULING ATTENTION.                                17616000
                                                                        17618000
SWAPIN MONITORS THE AWAKETOSCHEDMSG AND THE CURRACTPRI TO               17620000
SEE IF SOMETHING MORE URGENT IS PENDING, AND IF SO RETURNS TO           17622000
THE DISPATCHER (PARTIAL SWAPINS ARE OK).                                17624000
                                                                        17626000
THE LOCALITY LIST OF SWAPINPROCINX IS CHECKED TO FIND THE NEXT          17628000
SEGMENT REQUEST OF THE PROCESS.  IF THE SEGMENT IS NOT ALREADY          17630000
ALLOCATED TO THE PROCESS, FETCHSEGMENT IS INVOKED TO FETCH              17632000
THE SEGMENT FOR THIS PROCESS.                                           17634000
                                                                        17636000
STATUS IS RETURNED THROUGH THE VALUE OF SWAPIN AS FOLLOWS:              17638000
                                                                        17640000
    SWAPIN = 0     ==> PROCESS SWAPIN COMPLETE                          17642000
    SWAPIN = 1     ==> SWAPQ DELAY NOT YET EXPIRED, SW PROCS AROUND     17644000
    SWAPIN = 2     ==> NOROOM, BUT A HARD REQUEST HAS A CHANCE          17646000
    SWAPIN = 3     ==> NOROOM, EVEN WITH HARD REQUEST                   17648000
    SWAPIN = 4     ==> SWAPIN STOPPED DUE TO MORE URGENT PENDING        17650000
                       ACTIVITY                                         17652000
    SWAPIN = 5     ==> DISC READ ERROR ON ONE OF THE PROCESS' SEGS      17654000
    SWAPIN = 6     ==> ABORTED READ IN PROGRESS DELAY                   17656000
    SWAPIN = 7     ==> SWAPQ DELAY WAIT, NO SW PROCS                    17658000
                                                                        17660000
;                                                                       17662000
                                                                        17664000
BEGIN                                                                   17666000
                                                                        17668000
LOGICAL RETURNVALUE=SWAPIN;                                             17670000
INTEGER SEGIDENTIFIER,                                                  17672000
        SWAPINSLLINX,                                                   17674000
        NEXTREQINX,                                                     17676000
        MSTATPARM2,                                            <<01571>>17678000
        SLLREQINX;                                                      17680000
DOUBLE SAVETIME;                                                        17682000
LOGICAL WORSTCPRI,                                             <<01941>>17684000
        WORSTDPRI,                                             <<01941>>17686000
        WORSTEPRI;                                             <<01941>>17688000
LOGICAL SPECIALREQFLAGS,                                                17690000
        GOTSOMEMEMORY:=FALSE,                                           17692000
        SWAPREQUIRED:=FALSE;                                            17694000
EQUATE SLLSEGLIMIT=8;                                          <<01913>>17696000
                                                                        17698000
                                                                        17700000
SWAPIN:=MMOK; <<ASSUME SUCCESS>>                               <<01987>>17702000
                                                                        17704000
<<                                                                      17706000
START RESERVING SPACE FOR THE PROCESS' LOCALITY                         17708000
>>                                                                      17710000
                                                                        17712000
IF GCLASSENABLEDMASK.CLASS0 THEN SAVETIME:=TIMER;                       17714000
X:=SWAPINPROCINX;                                                       17716000
SWAPINSLLINX:=X:=SLLPTR;                                                17718000
DISABLE;                                                                17720000
                                                               <<04484>>17722000
STARTSCANOVER:                                                 <<04484>>17724000
                                                                        17726000
IF SLLSCHEDTOIOMSG.SLLSWAPREQFLAG THEN SWAPREQUIRED:=TRUE;     <<01913>>17728000
IF (NOT SLLSCHEDTOIOMSG.SLLSWAPIPFLAG LAND SWAPREQUIRED)       <<01913>>17730000
LOR SLLSCHEDTOIOMSG.SLLSTARTOVERFLAG                           <<04484>>17732000
LOR (INTEGER (SLLSEGCNT)>SLLSEGLIMIT) THEN                     <<01913>>17734000
   BEGIN  <<CHOP TO MIN LOCALITY AND START SWAP OVER>>         <<01913>>17736000
   TOS:=SWAPINPROCINX;                                                  17738000
   ASMB(ZERO,DZRO);                                                     17740000
   TOS.INITLOCFLAG:=1;                                                  17742000
   ADJUSTLOCALITY(*,*,*,*);                                             17744000
   SWAPREQUIRED:=TRUE;                                                  17746000
   SLLMEMREQINX:=SLLFIRSTINX;                                           17748000
   SLLSCHEDTOIOMSG.SLLSTARTOVERFLAG:=0;                        <<04484>>17750000
   END;                                                                 17752000
SLLSCHEDTOIOMSG.SLLSWAPIPFLAG:=1;                              <<01913>>17754000
X:=SLLMEMREQINX;<<SYSDB INX OF NEXT SEG IN PROCESS' LOCALITY>>          17756000
WHILE <> DO                                                             17758000
   BEGIN                                                                17760000
   SLLREQINX:=X;                                                        17762000
   SEGIDENTIFIER:=SLLSEGIDENT;                                          17764000
   SPECIALREQFLAGS:=0;                                                  17766000
   TOS:=SLLFLAGS;                                                       17768000
   ASMB(TBC SLLFZREQBIT);                                               17770000
   IF <> THEN SPECIALREQFLAGS.FZREQFLAG:=1;                             17772000
   ASMB(TBC SLLLKREQBIT);                                               17774000
   IF <> THEN SPECIALREQFLAGS.LKREQFLAG:=1;                             17776000
   ASMB(TBC SLLBLKLOCKREQBIT);                                          17778000
   IF <> THEN SPECIALREQFLAGS.BKLKREQFLAG:=1;                           17780000
   ENABLE;                                                              17782000
   IF SLLFLAGS.SLLIMIFLAG  THEN TOS:=0                                  17784000
   ELSE TOS:=FETCHSEGMENT(SEGIDENTIFIER,SWAPINPROCINX,                  17786000
      SPECIALREQFLAGS,SLLREQINX,HARDREQUEST);                           17788000
   DISABLE;                                                             17790000
   SWAPIN:=S0; <<RETURN INFO TO DISPATCHER>>                            17792000
   IF TOS <> MMOK THEN                                         <<01987>>17794000
      BEGIN  <<FETCH COULDN'T COMPLETE>>                                17796000
      NEXTREQINX:=0;                                                    17798000
      IF TOS = 8 <<NO LOCK SPACE>>                                      17800000
      THEN SLLFLAGS.SLLTOSSENTRYFLAG:=1;                                17802000
      END                                                               17804000
   ELSE                                                                 17806000
      BEGIN  <<SEG ALLOCATED SUCCESSFULLY>>                             17808000
      ASMB(DEL);                                                        17810000
      GOTSOMEMEMORY:=TRUE;                                              17812000
      X:=SWAPINSLLINX;                                         <<04484>>17814000
      IF SLLSCHEDTOIOMSG.SLLSTARTOVERFLAG THEN                 <<04484>>17816000
         GO STARTSCANOVER;                                     <<04484>>17818000
      IF NOT SWAPREQUIRED THEN                                          17820000
         BEGIN <<ALL DONE WITH THIS GUY>>                               17822000
         X:=SWAPINSLLINX;                                               17824000
         SLLMEMREQINX:=NEXTREQINX:=0;                                   17826000
         END                                                            17828000
      ELSE                                                              17830000
         BEGIN  <<PUT NEXT REQUEST INTO MEMREQINX>>                     17832000
         X:=SLLREQINX;                                                  17834000
         NEXTREQINX:=SLLNEXTINX;                                        17836000
         X:=SWAPINSLLINX;                                               17838000
         SLLMEMREQINX:=NEXTREQINX;                                      17840000
         END;                                                           17842000
      END;                                                              17844000
   X:=NEXTREQINX;                                                       17846000
   END;                                                                 17848000
X:=SWAPINSLLINX;                                                        17850000
IF GOTSOMEMEMORY THEN SLLSCHEDTOIOMSG.SLLHASMEMFLAG:=1;                 17852000
IF RETURNVALUE=0 THEN                                                   17854000
   BEGIN <<SWAP COMPLETE>>                                              17856000
   TOS:=SLLSCHEDTOIOMSG;                                                17858000
   TOS.SLLSWAPREQFLAG:=0;                                               17860000
   TOS.SLLSWAPIPFLAG:=0;                                                17862000
   SLLSCHEDTOIOMSG:=S0;                                                 17864000
   X:=SWAPINPROCINX;                                                    17866000
   RESABORTINFO.SARFLAG:=0;  <<FLAG NO LONGER NEEDS SCHED>>    <<01941>>17868000
   RESABORTINFO.PCBSHORTWAITFLAG:=1;                                    17870000
   IF NOT PROCSTATE.SYSTEMPROCFLAG AND NOT QUEUEINGINFO.LSCHEDFLAG THEN 17872000
      BEGIN <<MAKE PRI ADJ SINCE SCHED ATTN NO LONGER REQ>>    <<01941>>17874000
      WORSTCPRI:=ICS(-ICS'WORSTCPRICELL);                      <<01941>>17876000
      WORSTDPRI:=ICS(-ICS'WORSTDPRICELL);                      <<01941>>17878000
      WORSTEPRI:=ICS(-ICS'WORSTEPRICELL);                      <<01941>>17880000
      X:=SWAPINPROCINX;                                        <<01941>>17882000
      IF QUEUEINGINFO.CSCHEDFLAG AND QUEUEINGINFO.PRIFIELD<>WORSTCPRI   17884000
      OR QUEUEINGINFO.DSCHEDFLAG AND QUEUEINGINFO.PRIFIELD<>WORSTDPRI   17886000
      OR QUEUEINGINFO.ESCHEDFLAG AND QUEUEINGINFO.PRIFIELD<>WORSTEPRI   17888000
      THEN                                                     <<01941>>17890000
         BEGIN <<MAKE PROCESS MORE URGENT>>                    <<01941>>17892000
         QUEUEINGINFO.PRIFIELD:=QUEUEINGINFO.PRIFIELD-1;       <<01941>>17894000
         QUEUEPROC(SWAPINPROCINX,DISPATCHINGQ,FRONTOFCLASS);   <<01941>>17896000
         END;                                                  <<01941>>17898000
      END;                                                     <<01941>>17900000
   IF TOS.SLLIOCOMPTOAWAKEFIELD = 0 THEN                                17902000
      BEGIN <<PROCESS IS READY TO BE LAUNCHED>>                         17904000
      ENABLE;                                                           17906000
      AWAKE(SWAPINPROCINX-PCBSYSBASEINX,MEMORYWAITCODE,NOWAIT);         17908000
      END;                                                              17910000
   END;                                                                 17912000
MSTATPARM2 := %100000;                                         <<01571>>17914000
MSTATPARM2.(1:1) := IF SWAPREQUIRED THEN 1 ELSE 0;             <<01571>>17916000
MSTATPARM2.(12:4):= RETURNVALUE;                               <<01571>>17918000
MMSTAT(8,(SWAPINPROCINX-PCBSYSBASEINX)/PCBSIZE,MSTATPARM2,     <<01770>>17920000
       HARDREQUEST);                                           <<01571>>17922000
IF GCLASSENABLEDMASK.CLASS0 THEN                                        17924000
   BEGIN  <<MEASURE SWAP-IN EVENT AND DURATION>>                        17926000
   TOS:=MEASSTATXDSBANK;                                                17928000
   TOS:=MEASSTATXDSBASE;                                                17930000
   TOS:=TOS+C0SUB0'SEGRELOFF+C'SWAPIN;                         <<RAY.V>>17932000
   ASMB(LSEA);                                                          17934000
   TOS:=TOS+1;                                                          17936000
   ASMB(SSEA);                                                          17938000
   TOS:=TOS-C'SWAPIN+C'CPUMEMORYALLOC;                         <<RAY.V>>17940000
   ASMB(LDEA);                                                          17942000
   TOS:=TIMER-SAVETIME;                                                 17944000
   ASMB(DADD;SDEA;DDEL);                                                17946000
   END;                                                                 17948000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01812>>17950000
   BEGIN <<PRCOESS LEVEL SWAPIN>>                              <<01812>>17952000
   TOS:=MEASPROCXDSBANK;                                       <<01812>>17954000
   TOS:=MEASPROCXDSBASE;                                       <<01812>>17956000
   TOS:=TOS+ICS(-ICS'CANDPINCELL)*                             <<01812>>17958000
        CLASS15'SUB0SIZE+CP'SWAPIN;                            <<01812>>17960000
   ASMB(LSEA);                                                 <<01812>>17962000
   TOS:=TOS+1;                                                 <<01812>>17964000
   ASMB(SSEA;DDEL);                                            <<01812>>17966000
   END;                                                        <<01812>>17968000
END  <<SWAPIN>>;                                                        17970000
                                                                        17972000
$PAGE "GARBAGE COLLECTION"                                              17974000
                                                                        17976000
PROCEDURE COLLECTGARBAGE(SINGLEHOLEBASE);                               17978000
VALUE SINGLEHOLEBASE;                                                   17980000
DOUBLE SINGLEHOLEBASE;                                                  17982000
OPTION PRIVILEGED,UNCALLABLE;                                           17984000
                                                                        17986000
COMMENT                                                                 17988000
                                                                        17990000
COLLECTGARBAGE COMBINES HOLES DURING OTHERWISE IDLE PERIODS.            17992000
SINCE GARBAGE COLLECTION IS A BACKGROUND ACTIVITY, THE                  17994000
AWAKETOSCHEDMSG IS SAMPLED AT CONVENIENT TIMES SO THAT MORE             17996000
URGENT PENDING ACTIVITY CAN BE RESPONDED TO.                            17998000
                                                                        18000000
THE SELECTED STRATEGY PROCEEDS FROM THE LARGEST TO THE SMALLEST         18002000
HOLE. IT IS FIRST ATTEMPTED TO COMBINE THE HOLE WITH THE PREVIOUS       18004000
HOLE IN THE BANK, THEN WITH THE FOLLOWING HOLE IN THE BANK.             18006000
THE COMBINATIONS ARE PERFORMED BY MOVING ALL SEGMENTS BETWEEN           18008000
THE LOWER AND UPPER HOLE TO THE BASE OF SOME OTHER SMALL HOLE.          18010000
THE COMBINATIONS WILL BE PERFORMED IF :                                 18012000
                                                                        18014000
   (I). THE MOVE OF THE INTERMEDIATE SEGMENTS DOES NOT EXCEED THE       18016000
        CONFIGURED MOVE THRESHOLD,                                      18018000
                                                                        18020000
  (II). NO INTERVENING SEGMENTS ARE LOCKED, FROZEN, OR I/O FROZEN,      18022000
                                                                        18024000
 (III). A SMALL DESTINATION HOLE WHICH IS CLEAN OF ONGOING INTERNAL     18026000
        I/O CAN BE OBTAINED.                                            18028000
                                                                        18030000
;                                                                       18032000
                                                                        18034000
BEGIN                                                                   18036000
                                                                        18038000
INTEGER MOVEPAGECNT:=0;                                                 18040000
                                                                        18042000
                                                                        18044000
DOUBLE NEXTCANDBASE:=0D,                                                18046000
       CURRENTHOLEBASE:=0D,                                             18048000
       FIRSTMEMORYADDRESS,                                              18050000
       CURRENTFLIPBASE,                                                 18052000
       UPPERBOUNDBASE,                                                  18054000
       NEXTFLIPBASE,                                                    18056000
       LOWERBOUNDBASE,                                                  18058000
       LOWERHOLEBASE,                                                   18060000
       UPPERHOLEBASE,                                                   18062000
       DESTHOLEBASE,                                                    18064000
       MOVESOURCE,                                                      18066000
       SAVETIME,                                                        18068000
       COMBINEDHOLEBASE;                                                18070000
                                                                        18072000
                                                                        18074000
INTEGER CURRENTHOLESIZE:=MAXHOLESIZE,                                   18076000
        THISREGIONSIZE,                                                 18078000
        SEGDESCSYSBASEINX,                                              18080000
        SEGDESCSTINX,                                                   18082000
        LOWERHOLESIZE,                                                  18084000
        UPPERHOLESIZE,                                                  18086000
        COMBINEDHOLESIZE;                                               18088000
                                                                        18090000
LOGICAL GOTONE,                                                         18092000
        CAN'TMOVE,                                                      18094000
        STARTOVER,                                                      18096000
        COMBINEBELOW,                                                   18098000
        COMBINEABOVE,                                                   18100000
        MOVED,                                                          18102000
        GETREADY,                                                       18104000
        READY,                                                          18106000
        GOONCE,                                                         18108000
        GOTNEXTHOLE,                                                    18110000
        SEGID,                                                          18112000
        GIVEUP;                                                         18114000
                                                                        18116000
SUBROUTINE SCANBACKBITMAP;                                              18118000
                                                                        18120000
COMMENT                                                                 18122000
                                                                        18124000
FINDS THE BITNUMBER OF THE PREVIOUS NON-EMPTY BIT IN THE ARSBM.         18126000
                                                                        18128000
;                                                                       18130000
                                                                        18132000
BEGIN                                                                   18134000
                                                                        18136000
CURRENTHOLESIZE:=CURRENTHOLESIZE-1; <<FIRST SIZE TO LOOK AT>>           18138000
X:=CURRENTHOLESIZE&LSR(4); <<WORD INDEX IN BIT MAP>>                    18140000
TOS:=ARSBM(X);                                                          18142000
<<MASK OFF BITS IN BITMAP ABOVE THE START BIT>>                         18144000
X:=15-CURRENTHOLESIZE.(12:4);                                           18146000
TOS:=TOS&LSR(X);                                                        18148000
TOS:=TOS&LSL(X);                                                        18150000
X:=CURRENTHOLESIZE&LSR(4);                                              18152000
<<FLIP BACK BITMAP TILL A NON-EMPTY WORD>>                              18154000
ASMB(TEST);                                                             18156000
WHILE = AND X > 0 DO                                                    18158000
   BEGIN                                                                18160000
   ASMB(DEL,DECX);                                                      18162000
   TOS:=ARSBM(X);                                                       18164000
   END;                                                                 18166000
ASMB(TEST);                                                             18168000
IF = THEN CURRENTHOLESIZE:=0 ELSE                                       18170000
   BEGIN  <<GET BITNUMBER OF LAST BIT ON IN THIS WORD>>                 18172000
   X:=X&LSL(4)-1; <<ADJUST X FOR SCAN>>                                 18174000
   DO ASMB(SCAN,X) UNTIL S0=0;                                          18176000
   CURRENTHOLESIZE:=X;                                                  18178000
   END;                                                                 18180000
ASMB(DEL);                                                              18182000
END <<SUBROUTINE SCANBACKBITMAP>>;                                      18184000
                                                                        18186000
                                                                        18188000
                                                                        18190000
SUBROUTINE SELECTNEXTCAND;                                              18192000
                                                                        18194000
COMMENT                                                                 18196000
                                                                        18198000
SELECTS THE NEXT IN THE LIST OF HOLES OF THE SIZE OF THE HOLE           18200000
IN THE LAST COMPACTION OR THE HEAD OF THE LIST OF HOLES OF              18202000
SIZE JUST SMALLER THAN THE LAST LIST WHEN THE LAST LIST IS EMPTY.       18204000
                                                                        18206000
;                                                                       18208000
                                                                        18210000
BEGIN                                                                   18212000
IF STARTOVER THEN CURRENTHOLESIZE:=MAXHOLESIZE;                         18214000
IF SINGLEHOLEBASE <> 0D THEN                                            18216000
   BEGIN <<JUST A SINGLE SHOT>>                                         18218000
   IF CURRENTHOLEBASE <> 0D THEN CURRENTHOLEBASE:=0D <<DONE>>           18220000
   ELSE CURRENTHOLEBASE:=SINGLEHOLEBASE;                                18222000
   END                                                                  18224000
ELSE IF NEXTCANDBASE <> 0D AND NOT STARTOVER                            18226000
THEN CURRENTHOLEBASE:=NEXTCANDBASE ELSE                                 18228000
   BEGIN <<JUST STARTING OR LIST IS EMPTY>>                             18230000
   SCANBACKBITMAP;                                                      18232000
   X:=CURRENTHOLESIZE;                                                  18234000
   IF = THEN CURRENTHOLEBASE:=0D ELSE                                   18236000
      BEGIN <<GOTONE>>                                                  18238000
      CURRENTHOLEBASE:=ARLD(X);                                         18240000
      IF = THEN SUDDENDEATH(619);                              <<01644>>18242000
      END;                                                              18244000
   END;                                                                 18246000
IF SINGLEHOLEBASE <> 0D THEN NEXTCANDBASE:=0D ELSE                      18248000
   BEGIN <<NOT JUST A SINGLE SHOT>>                                     18250000
   TOS:=CURRENTHOLEBASE;                                                18252000
   IF = THEN NEXTCANDBASE:=TOS ELSE                                     18254000
      BEGIN                                                             18256000
      TOS:=TOS+RBTONLDISP;                                              18258000
      ASMB(LDEA);                                                       18260000
      NEXTCANDBASE:=TOS;                                                18262000
      ASMB(DDEL);                                                       18264000
      END;                                                              18266000
   END;                                                                 18268000
TOS:=CURRENTHOLEBASE;                                                   18270000
IF = THEN                                                               18272000
   BEGIN <<SHOULD QUIT>>                                                18274000
   ASMB(DDEL);                                                          18276000
   CURRENTHOLESIZE:=0;                                                  18278000
   END                                                                  18280000
ELSE                                                                    18282000
   BEGIN                                                                18284000
   TOS:=TOS+RBTORSDISP;                                                 18286000
   ASMB(LSEA);                                                          18288000
   CURRENTHOLESIZE:=TOS;                                                18290000
   ASMB(DDEL);                                                          18292000
   END;                                                                 18294000
STARTOVER:=FALSE;                                                       18296000
IF CURRENTHOLESIZE=MAXHOLESIZE THEN SELECTNEXTCAND; <<RECURSIVE>>       18298000
END <<SUBROUTINE SELECTNEXTCAND>>;                                      18300000
                                                                        18302000
                                                                        18304000
SUBROUTINE UPDATEDESCRIPTORS;                                           18306000
                                                                        18308000
COMMENT                                                                 18310000
                                                                        18312000
FLIPS THROUGH THE REGIONS BEGINNING WITH LOWERBOUNDBASE                 18314000
AND TERMINATING AT UPPERBOUNDBASE.  AT EACH REGION,                     18316000
UPDATES THE CORRESPONDING SEGMENT'S DESCRIPTOR ADDRESS,                 18318000
AND MARKS THE SEGMENT PRESENT.                                          18320000
                                                                        18322000
;                                                                       18324000
                                                                        18326000
BEGIN                                                                   18328000
                                                                        18330000
CURRENTFLIPBASE:=LOWERBOUNDBASE;                                        18332000
DISABLE;                                                                18334000
WHILE CURRENTFLIPBASE <> UPPERBOUNDBASE OR GOONCE DO                    18336000
   BEGIN                                                                18338000
   GOONCE:=FALSE; <<DEGENERATE CASE AT END OF BANK>>                    18340000
   TOS:=CURRENTFLIPBASE;                                                18342000
   TOS:=TOS+RBTORASDISP;                                                18344000
   ASMB(LSEA);                                                          18346000
   tos.regreservedflag:=0;                                              18348000
   IF <> THEN SUDDENDEATH(614);                                <<01644>>18350000
   tos.regavailableflag:=0;                                             18352000
   if <> then asmb(del) else                                            18354000
      BEGIN                                                             18356000
      TOS.REGASSIGNEDFLAG:=0;                                           18358000
      ASMB(DEL);                                                        18360000
      IF = THEN SUDDENDEATH(614);                              <<01644>>18362000
      TOS:=TOS+RASTOSEGIDENTDISP;                                       18364000
      ASMB(LSEA);                                                       18366000
      IF = THEN SUDDENDEATH(614);                              <<01644>>18368000
      SEGID:=TOS;                                                       18370000
      IF SEGID.SEGIDTYPEFIELD=SEGIDDATATYPE                             18372000
      THEN SEGDESCSTINX:=SEGID&LSL(2) <<DATA SEG>>                      18374000
      ELSE SEGDESCSTINX:=CONVSEGIDTOSTINX(SEGID);                       18376000
      SEGDESCSYSBASEINX:=DSTSYSBASEINX+SEGDESCSTINX;                    18378000
      TOS:=TOS+SEGIDENTTORBDISP;                                        18380000
      X:=SEGDESCSYSBASEINX;                                             18382000
      SEGDESCFIRMINFO.ABSENTFLAG:=0;                                    18384000
      IF = THEN SUDDENDEATH(614);                              <<01644>>18386000
      SEGDESCADDR:=TOS;                                                 18388000
      SEGDESCBANK:=TOS;                                                 18390000
      IF SEGID.SEGIDTYPEFIELD=SEGIDDATATYPE THEN                        18392000
         BEGIN <<CHECK IF DISC TRAP WHILE MARKED ABSENT>>               18394000
         X:=DISCREQTABSYSBASEINX;                                       18396000
         IF DITQHEADP <> 0 THEN CHECKFORPNDGDISKIO(SEGID);              18398000
         END;                                                           18400000
      TOS:=CURRENTFLIPBASE;                                             18402000
      TOS:=TOS+RBTORASDISP;                                             18404000
      END;                                                              18406000
   TOS:=TOS+RASTORSDISP;                                                18408000
   ASMB(LSEA);                                                          18410000
   TOS:=TOS&LSL(PAGEPOWER);                                             18412000
   TOS:=TOS+RSTORBDISP;                                                 18414000
   ASMB(ADD);                                                           18416000
   CURRENTFLIPBASE:=TOS;                                                18418000
   END;                                                                 18420000
ENABLE;                                                                 18422000
END  <<UPDATEDESCRIPTORS>>;                                             18424000
                                                                        18426000
                                                                        18428000
                                                                        18430000
SUBROUTINE COMBINE;                                                     18432000
                                                                        18434000
COMMENT                                                                 18436000
                                                                        18438000
FLIP THROUGH THE REGIONS BELOW/ABOVE THE CURRENT                        18440000
HOLE UNTIL THE BEGINNING/END OF THE BANK OR THE PREV/NEXT AVAILABLE     18442000
REGION IS REACHED, OR UNTIL THE DISTANCE FLIPPED EXCEEDS THE            18444000
MOVE THRESHOLD.  ALONG THE WAY, ENCNTERED SEGMENTS ARE MARKED           18446000
ABSENT.  IF A LOCKED, FROZEN, OR IOFROZEN SEGMENT OR A RESERVED         18448000
REGION IS ENCNTERED, WE GIVEUP SINCE WE CAN'T MOVE OVER SUCH            18450000
MAIN MEMORY DOMAINS.  IF THE BASE OF THE BANK IS ENCNTERED,             18452000
WE GIVEUP SINCE WE CAN'T CROSS BANK BOUNDARIES.  IF WE EXCEEDED         18454000
THE MOVE THRESHOLD, THEN GIVEUP.  OTHERWISE, CLEAN THE                  18456000
PREV/NEXT HOLE.  IF THE PREV/NEXT HOLE HAS ONGOING I/O THEN GIVEUP.     18458000
                                                                        18460000
IF WE GAVEUP, THEN FLIP BACK DOWN FROM THE BEGINNING AND MARK           18462000
ALL THE INTERVENING SEGMENTS PRESENT AGAIN AND RETURN.  OTHERWISE,      18464000
WE WILL COMBINE THE TWO HOLES BY MOVING ALL INTERVENING ASSIGNED        18466000
REGIONS DOWN TO THE BASE OF THE PREVIOUS HOLE.  WHEN THE MOVE IS        18468000
COMPLETE, UPDATE THE NEW ADDRESS OF THE INTERVENING SEGMENTS AND        18470000
MARK THEM PRESENT.                                                      18472000
                                                                        18474000
;                                                                       18476000
                                                                        18478000
BEGIN                                                                   18480000
                                                                        18482000
MOVEPAGECNT:=0;                                                         18484000
MOVED:=GIVEUP:=READY:=GOONCE:=CAN'TMOVE:=GETREADY:=FALSE;               18486000
                                                                        18488000
<< FLIP DOWN/UP UNTIL LOWER/UPPER HOLE OR A GIVEUP CONDITION >>         18490000
                                                                        18492000
CURRENTFLIPBASE:=CURRENTHOLEBASE;                                       18494000
WHILE NOT GIVEUP AND NOT GETREADY DO                                    18496000
   BEGIN <<PREPARE PREVIOUS/NEXT REGION IN THE BANK>>                   18498000
   DISABLE;                                                             18500000
   TOS:=CURRENTFLIPBASE;                                                18502000
   IF COMBINEBELOW THEN                                                 18504000
      BEGIN                                                             18506000
      IF LS0 < PTRASTORBDISP OR FIRSTMEMORYADDRESS=CURRENTFLIPBASE THEN 18508000
         BEGIN  <<FIRST REGION IN BANK>>                                18510000
         LOWERBOUNDBASE:=TOS;                                           18512000
         GIVEUP:=TRUE;                                                  18514000
         END                                                            18516000
      ELSE                                                              18518000
         BEGIN <<DETERMINE NEXT FLIP BASE>>                             18520000
         TOS:=TOS+RBTOPTRSDISP;                                         18522000
         ASMB(LSEA);                                                    18524000
         TOS:=TOS&LSL(PAGEPOWER);                                       18526000
         ASMB(LSUB);                                                    18528000
         TOS:=TOS+PTRSTORBDISP;                                         18530000
         NEXTFLIPBASE:=TOS;                                             18532000
         END;                                                           18534000
      END                                                               18536000
   ELSE                                                                 18538000
      BEGIN  <<COMBINE ABOVE>>                                          18540000
      << DETERMINE IF THIS IS THE LAST REGION IN THE BANK>>             18542000
      TOS:=TOS+RBTORSDISP;                                              18544000
      ASMB(LSEA);                                                       18546000
      IF S0=MAXHOLESIZE THEN SUDDENDEATH(614);                 <<01788>>18548000
      TOS:=TOS&LSL(PAGEPOWER);                                          18550000
      TOS:=TOS+RSTORBDISP;                                              18552000
      ASMB(LADD);                                                       18554000
      IF CARRY THEN                                                     18556000
         BEGIN  <<LAST REGION IN BANK>>                                 18558000
         GIVEUP:=TRUE;                                                  18560000
         UPPERBOUNDBASE:=TOS;                                           18562000
         IF CURRENTFLIPBASE <> CURRENTHOLEBASE THEN GOONCE:=TRUE;       18564000
         END                                                            18566000
      ELSE NEXTFLIPBASE:=TOS;                                           18568000
      IF NEXTFLIPBASE >= LASTMEMORYADDRESS AND NOT GIVEUP THEN <<01616>>18570000
         BEGIN  <<PAST LAST HALF-BANK>>                                 18572000
         GIVEUP:=TRUE;                                                  18574000
         UPPERBOUNDBASE:=NEXTFLIPBASE;  <<FOR UPDATE DESC>>             18576000
         IF CURRENTFLIPBASE <> CURRENTHOLEBASE THEN GOONCE:=TRUE;       18578000
         END;                                                           18580000
      END;                                                              18582000
   IF NOT GIVEUP THEN                                                   18584000
      BEGIN                                                             18586000
      TOS:=NEXTFLIPBASE;                                                18588000
      TOS:=TOS+RBTORSDISP;                                              18590000
      ASMB(LSEA);                                                       18592000
      THISREGIONSIZE:=TOS;                                              18594000
      TOS:=TOS+RSTORASDISP;                                             18596000
      ASMB(LSEA);                                                       18598000
      IF LS0.REGAVAILABLEFLAG THEN                                      18600000
         BEGIN                                                          18602000
         ASMB(DEL,DDEL);                                                18604000
         IF COMBINEBELOW THEN                                           18606000
            BEGIN  <<GOT THE NEXT HOLE BELOW>>                          18608000
            LOWERHOLESIZE:=THISREGIONSIZE;                              18610000
            LOWERBOUNDBASE:=LOWERHOLEBASE:=NEXTFLIPBASE;                18612000
            END                                                         18614000
         ELSE                                                           18616000
            BEGIN  <<GOT THE NEXT HOLE ABOVE>>                          18618000
            UPPERHOLESIZE:=THISREGIONSIZE;                              18620000
            UPPERBOUNDBASE:=UPPERHOLEBASE:=NEXTFLIPBASE;                18622000
            END;                                                        18624000
         IF NEXTFLIPBASE = NEXTCANDBASE THEN                            18626000
            BEGIN <<GET A NEW NEXT CANDIDATE HOLE>>                     18628000
            TOS:=NEXTFLIPBASE;                                          18630000
            TOS:=TOS+RBTONLDISP;                                        18632000
            ASMB(LDEA);                                                 18634000
            NEXTCANDBASE:=TOS;                                          18636000
            ASMB(DDEL);                                                 18638000
            END;                                                        18640000
         GETREADY:=TRUE;                                                18642000
         IF COMBINEABOVE THEN                                           18644000
            BEGIN                                                       18646000
            TAKEOFFARL(UPPERHOLEBASE,UPPERHOLESIZE);                    18648000
            COMBINEDHOLEBASE:=CURRENTHOLEBASE;                          18650000
            COMBINEDHOLESIZE:=UPPERHOLESIZE+CURRENTHOLESIZE+MOVEPAGECNT;18652000
            END                                                         18654000
         ELSE                                                           18656000
            BEGIN <<COMBINEBELOW>>                                      18658000
            TAKEOFFARL(LOWERHOLEBASE,LOWERHOLESIZE);                    18660000
            COMBINEDHOLEBASE:=LOWERHOLEBASE;                            18662000
            COMBINEDHOLESIZE:=LOWERHOLESIZE+CURRENTHOLESIZE+MOVEPAGECNT;18664000
            END;                                                        18666000
         END                                                            18668000
      ELSE                                                              18670000
         BEGIN  <<RESERVED OR ASSIGNED>>                                18672000
         MOVEPAGECNT:=MOVEPAGECNT+THISREGIONSIZE;                       18674000
         TOS.REGRESERVEDFLAG:=0;                                        18676000
         IF <> THEN CAN'TMOVE:=TRUE;                                    18678000
         TOS:=TOS.REGNONMOVEFLAGS;                                      18680000
         ASMB(DEL);                                                     18682000
         IF <> THEN CAN'TMOVE:=TRUE;                                    18684000
         IF LS0 < PTRASTORBDISP OR CAN'TMOVE                            18686000
         OR MOVEPAGECNT > MOVETHRESHOLD THEN                            18688000
            BEGIN <<CAN'T GO THROUGH THIS REGION>>                      18690000
            GIVEUP:=TRUE;                                               18692000
            ASMB(DDEL);                                                 18694000
            IF COMBINEBELOW THEN LOWERBOUNDBASE:=CURRENTFLIPBASE        18696000
            ELSE UPPERBOUNDBASE:=NEXTFLIPBASE;                          18698000
            END                                                         18700000
         ELSE                                                           18702000
            BEGIN <<THIS GUY CAN BE MOVED-MARK ABSENT>>                 18704000
            TOS:=TOS+RASTOSEGIDENTDISP;                                 18706000
            ASMB(LSEA);                                                 18708000
            SEGID:=TOS;                                                 18710000
            IF SEGID.SEGIDTYPEFIELD=SEGIDDATATYPE                       18712000
            THEN SEGDESCSTINX:=SEGID&LSL(2) <<DATA SEG>>                18714000
            ELSE SEGDESCSTINX:=CONVSEGIDTOSTINX(SEGID);                 18716000
            SEGDESCSYSBASEINX:=DSTSYSBASEINX+SEGDESCSTINX;              18718000
            ASMB(DDEL);                                                 18720000
            DST(SEGDESCSTINX).ABSENTFLAG:=1;                            18722000
            END;                                                        18724000
         END;                                                           18726000
      END;                                                              18728000
   CURRENTFLIPBASE:=NEXTFLIPBASE;                                       18730000
   END;                                                                 18732000
IF GETREADY THEN                                                        18734000
   BEGIN <<SELECT A DESTINATION HOLE FOR SEGMENTS BETWEEN THE HOLES>>   18736000
   IF MOVEPAGECNT > MAXAVAILREG THEN TOS:=0D                            18738000
   ELSE TOS:=RESERVEREGION(MOVEPAGECNT,COMBINEDHOLESIZE,       <<01913>>18740000
               BKGRNDPRI-1,GARBCOLLCODE,0D);                   <<01913>>18742000
   ASMB(DTST);                                                          18744000
   DESTHOLEBASE:=TOS;                                                   18746000
   IF = THEN READY:=FALSE ELSE                                          18748000
      BEGIN  <<GOT A DESTINATION HOLE>>                                 18750000
      TOS:=DESTHOLEBASE;                                                18752000
      TOS:=TOS+RBTOINITMSGDISP;                                         18754000
      ASMB(LSEA);                                                       18756000
      TOS.MSGONGOINGIODISABLEDFLAG:=0;                                  18758000
      ASMB(DEL,DDEL);                                                   18760000
      IF <> THEN READY:=FALSE ELSE READY:=TRUE;                         18762000
      END;                                                              18764000
   IF NOT READY THEN                                                    18766000
      BEGIN  <<RETURN HOLES>>                                           18768000
      TOS:=DESTHOLEBASE;                                                18770000
      IF = THEN ASMB(DDEL) ELSE RELEASEREGION(*,0);                     18772000
      IF COMBINEABOVE THEN                                              18774000
         BEGIN                                                          18776000
         UPPERBOUNDBASE:=NEXTFLIPBASE;                                  18778000
         RELEASEREGION(UPPERHOLEBASE,0);                                18780000
         END                                                            18782000
      ELSE                                                              18784000
         BEGIN                                                          18786000
         LOWERBOUNDBASE:=NEXTFLIPBASE;                                  18788000
         RELEASEREGION(LOWERHOLEBASE,0);                                18790000
         END;                                                           18792000
      END                                                               18794000
   ELSE                                                                 18796000
      BEGIN <<DO THE MOVE>>                                             18798000
      STARTOVER:=TRUE;                                                  18800000
      MOVED:=TRUE;                                                      18802000
                                                                        18804000
      <<SET UP FOR THE MOVE>>                                           18806000
                                                                        18808000
      ENABLE;                                                           18810000
                                                                        18812000
<<BC>>TOS:=DESTHOLEBASE;                                                18814000
      TOS:=TOS+RBTORSDISP;                                              18816000
      ASMB(LSEA);                                                       18818000
      TOS:=MOVEPAGECNT;                                                 18820000
      ASMB(CMP);                                                        18822000
      IF <> THEN SUDDENDEATH(619);                             <<01644>>18824000
      ASMB(DDEL);                                                       18826000
                                                               <<01788>>18828000
      TOS:=DESTHOLEBASE;                                                18830000
      TOS:=TOS+RBTORASDISP; <<DESTINATION>>                             18832000
      IF COMBINEBELOW THEN                                              18834000
         BEGIN                                                          18836000
         IF LOWERHOLEBASE < SCANPOINT AND                               18838000
         SCANPOINT <=CURRENTHOLEBASE THEN SCANPOINT:=COMBINEDHOLEBASE;  18840000
         TOS:=LOWERHOLEBASE;                                            18842000
         TOS:=LOWERHOLESIZE&LSL(PAGEPOWER);                             18844000
         ASMB(LADD);                                                    18846000
         TOS:=TOS+RBTORASDISP;  <<SOURCE FOR MOVE>>                     18848000
         ASMB(DDUP);                                                    18850000
         MOVESOURCE:=TOS;                                               18852000
         END                                                            18854000
      ELSE                                                              18856000
         BEGIN <<COMBINEABOVE>>                                         18858000
         IF CURRENTHOLEBASE < SCANPOINT AND                             18860000
         SCANPOINT <= UPPERHOLEBASE THEN SCANPOINT:=COMBINEDHOLEBASE;   18862000
         TOS:=CURRENTHOLEBASE;                                          18864000
         TOS:=CURRENTHOLESIZE&LSL(PAGEPOWER);                           18866000
         ASMB(LADD);                                                    18868000
         TOS:=TOS+RBTORASDISP;                                          18870000
         ASMB(DDUP); <<SOURCE FOR MOVE>>                                18872000
         MOVESOURCE:=TOS;                                               18874000
         END;                                                           18876000
      TOS:=MOVEPAGECNT&LSL(PAGEPOWER);                                  18878000
      ASMB(MABS 5);  <<FIRE AWAY>>                             <<01788>>18880000
                                                               <<01788>>18882000
      <<MAKE AN MMSTAT RECORD>>                                <<01788>>18884000
                                                               <<01788>>18886000
      TOS:=7; <<EVENT NUMBER>>                                 <<01788>>18888000
      TOS:=MOVESOURCE;                                         <<01788>>18890000
      TOS:=MOVEPAGECNT;                                        <<01788>>18892000
      MMSTAT(*,*,*,*);                                         <<01788>>18894000
                                                                        18896000
<<bc>> TOS:=MOVESOURCE;                                                 18898000
       ASMB(LSEA);                                                      18900000
       TOS.REGASSIGNEDFLAG:=1;                                          18902000
       IF = THEN SUDDENDEATH(614);                             <<01644>>18904000
       ASMB(DEL,DDEL);                                                  18906000
                                                                        18908000
      <<FIX UP THE COMBINED HOLE>>                                      18910000
                                                                        18912000
      TOS:=MOVESOURCE;                                                  18914000
      TOS:=REGAVAILABLECODE;                                            18916000
      ASMB(SSEA);                                                       18918000
      TOS:=TOS+RASTORSDISP;                                             18920000
      TOS:=MOVEPAGECNT;                                                 18922000
      ASMB(SSEA);                                                       18924000
      TOS:=TOS+RSTOSSDISP;                                              18926000
      TOS:=MOVEPAGECNT;                                                 18928000
      ASMB(SSEA);                                                       18930000
      TOS:=TOS+SSTOSEGIDENTDISP;                                        18932000
      TOS:=0;                                                           18934000
      ASMB(SSEA);                                                       18936000
      TOS:=TOS+SEGIDENTTOPTRASDISP;                                     18938000
      TOS:=MOVEPAGECNT&LSL(PAGEPOWER);                                  18940000
      ASMB(LADD);                                                       18942000
      TOS:=REGAVAILABLECODE;                                            18944000
      ASMB(SSEA);                                                       18946000
      TOS:=TOS+TRASTOTRSDISP;                                           18948000
      TOS:=MOVEPAGECNT;                                                 18950000
      ASMB(SSEA);                                                       18952000
      TOS:=TOS+TRSTOTSSDISP;                                            18954000
      TOS:=MOVEPAGECNT;                                                 18956000
      ASMB(SSEA);                                                       18958000
      ASMB(DDEL);                                                       18960000
                                                                        18962000
      <<FILL IN THE PROPER HEADER INFORMATION>>                         18964000
                                                                        18966000
      TOS:=COMBINEDHOLEBASE;                                            18968000
      TOS:=TOS+RBTORSDISP;                                              18970000
      TOS:=COMBINEDHOLESIZE;                                            18972000
      ASMB(SSEA);                                                       18974000
                                                                        18976000
      <<NOW FIX UP THE TRAILER>>                                        18978000
                                                                        18980000
      TOS:=RSTOPTRSDISP+COMBINEDHOLESIZE&LSL(PAGEPOWER);                18982000
      ASMB(LADD);                                                       18984000
      TOS:=COMBINEDHOLESIZE;                                            18986000
      ASMB(SSEA);                                                       18988000
      ASMB(DDEL);                                                       18990000
                                                                        18992000
      <<NEW CURRENT HOLE>>                                              18994000
                                                                        18996000
      CURRENTHOLEBASE:=COMBINEDHOLEBASE;                                18998000
      CURRENTHOLESIZE:=COMBINEDHOLESIZE;                                19000000
      END;                                                              19002000
   END;                                                                 19004000
                                                                        19006000
<< UPDATE ADDRESSES OF MOVED SEGMENTS, MARK SEGMENTS PRESENT >>         19008000
                                                                        19010000
IF MOVED THEN                                                           19012000
   BEGIN                                                                19014000
   IF GCLASSENABLEDMASK.CLASS0 THEN                                     19016000
      BEGIN  <<MEASURE MOVE EVENT>>                                     19018000
      TOS:=MEASSTATXDSBANK;                                             19020000
      TOS:=MEASSTATXDSBASE;                                             19022000
      TOS:=TOS+C0SUB0'SEGRELOFF;                                        19024000
      IF SINGLEHOLEBASE=0D THEN TOS:=TOS+C'GARBMOVEBKRND       <<RAY.V>>19026000
         ELSE TOS:=TOS+C'GARBMOVEALLOCATE;                     <<RAY.V>>19028000
      ASMB(LSEA;INCA;SSEA;DDEL);                                        19030000
      END;                                                              19032000
   LOWERBOUNDBASE:=DESTHOLEBASE;                                        19034000
   TOS:=DESTHOLEBASE;                                                   19036000
   TOS:=MOVEPAGECNT&LSL(PAGEPOWER);                                     19038000
   ASMB(LADD);                                                          19040000
   UPPERBOUNDBASE:=TOS;                                                 19042000
   END                                                                  19044000
ELSE                                                                    19046000
   BEGIN                                                                19048000
   IF COMBINEBELOW THEN UPPERBOUNDBASE:=CURRENTHOLEBASE                 19050000
   ELSE LOWERBOUNDBASE:=CURRENTHOLEBASE;                                19052000
   END;                                                                 19054000
UPDATEDESCRIPTORS;                                                      19056000
ENABLE;                                                                 19058000
                                                                        19060000
END <<SUBROUTINE COMBINE>>;                                             19062000
                                                                        19064000
<<BEGIN OUTER BLOCK OF GARBAGE COLLECTION>>                             19066000
                                                                        19068000
IF GCLASSENABLEDMASK.CLASS0 THEN SAVETIME:=TIMER;                       19070000
STARTOVER:=TRUE;                                                        19072000
TOS:=FIRSTMEMBANK;                                                      19074000
TOS:=FIRSTMEMBASE;                                                      19076000
FIRSTMEMORYADDRESS:=TOS;                                                19078000
WHILE CURRACTPRI <= AWAKETOSCHEDMSG AND CURRENTHOLESIZE <> 0 DO         19080000
   BEGIN                                                                19082000
   SELECTNEXTCAND;                                                      19084000
   IF CURRENTHOLESIZE <> 0 THEN                                         19086000
      BEGIN  <<GOTONE>>                                                 19088000
      TAKEOFFARL(CURRENTHOLEBASE,CURRENTHOLESIZE);                      19090000
      COMBINEBELOW:=TRUE;                                               19092000
      COMBINEABOVE:=FALSE;                                              19094000
      COMBINE;                                                          19096000
      IF CURRACTPRI <= AWAKETOSCHEDMSG AND CURRENTHOLESIZE     <<01788>>19098000
      <> MAXHOLESIZE THEN                                      <<01788>>19100000
         BEGIN <<TIME TO COMBINE ABOVE>>                                19102000
         COMBINEBELOW:=FALSE;                                           19104000
         COMBINEABOVE:=TRUE;                                            19106000
         COMBINE;                                                       19108000
         END;                                                           19110000
      PUTONARL(CURRENTHOLEBASE,CURRENTHOLESIZE,PUTATFRONT);             19112000
      END;                                                              19114000
   END;                                                                 19116000
IF GCLASSENABLEDMASK.CLASS0  THEN                                       19118000
   BEGIN  <<MEASURE GARB COLL EVENT & DURATION>>                        19120000
   TOS:=MEASSTATXDSBANK;                                                19122000
   TOS:=MEASSTATXDSBASE;                                                19124000
   TOS:=TOS+C0SUB0'SEGRELOFF;                                           19126000
   IF SINGLEHOLEBASE=0D THEN TOS:=TOS+C'CPUGARBAGE             <<RAY.V>>19128000
      ELSE TOS:=TOS+C'CPUALLOCGARB;                            <<RAY.V>>19130000
   ASMB(LDEA);                                                          19132000
   TOS:=TIMER-SAVETIME;                                                 19134000
   ASMB(DADD;SDEA);                                                     19136000
   IF SINGLEHOLEBASE=0D THEN                                   <<RAY.V>>19138000
       BEGIN                                                   <<RAY.V>>19140000
       TOS:=TOS-C'CPUGARBAGE+C'GARBAGECNT;<<USE ADDR ON TOS>>  <<RAY.V>>19142000
       ASMB(LSEA);                                             <<RAY.V>>19144000
       TOS:=TOS+1;                                             <<RAY.V>>19146000
       ASMB(SSEA);                                             <<RAY.V>>19148000
       END;                                                    <<RAY.V>>19150000
   IF CURRACTPRI > AWAKETOSCHEDMSG THEN                                 19152000
      BEGIN <<PREEMPTED>>                                               19154000
      ASMB(DEL);                                                        19156000
      TOS:=MEASSTATXDSBASE;                                             19158000
      TOS:=TOS+C0SUB0'SEGRELOFF+C'GARBGIVEUPPREEMPT;           <<RAY.V>>19160000
      ASMB(LSEA;INCA;SSEA);                                   <<RAY.V>> 19162000
      END;                                                              19164000
   ASMB(DDEL);                                                 <<RAY.V>>19166000
   END;                                                                 19168000
END  <<COLLECTGARBAGE>>;                                                19170000
                                                                        19172000
$PAGE "PROCESS SCHEDULER MESSAGES"                                      19174000
PROCEDURE PROCESSSCHEDMSGS;                                             19176000
OPTION PRIVILEGED,UNCALLABLE;                                           19178000
                                                                        19180000
COMMENT                                                                 19182000
                                                                        19184000
PROCESSSCHEDMSGS IS CALLED BY A CPU'S DISPATCHER TO SERVICE             19186000
REQUESTS FOR RELEASING REGIONS, PERFORMING MOVES OR FETCHING            19188000
SEGMENTS FOR I/O DEVICE MONITORS.  THESE REQUESTS WERE GENERATED        19190000
ON THE ICS, BUT COULDN'T BE COMPLETED THERE.                            19192000
                                                                        19194000
PROCESSSCHEDMSGS RETURNS CONDCODE=CCE IF ALL MESSAGES WERE     <<01557>>19196000
SUCCESSFULLY PROCESSED, AND CONDCODE=CCL IF A FETCHSEGMENT REQU<<01557>>19198000
FOR THE I/O SYSTEM FAILED DUE TO LACK OF SPACE.                <<01557>>19200000
                                                               <<01557>>19202000
;                                                                       19204000
                                                                        19206000
BEGIN                                                                   19208000
INTEGER MOSTURGPORTNUM,                                                 19210000
        REQPROCINX,                                                     19212000
        IOQSYSBASEINX,                                                  19214000
        DESCSTINX;                                                      19216000
LOGICAL SPECIALFLAGS;                                                   19218000
LOGICAL SEGIDENT;                                                       19220000
DOUBLE REGIONBASE;                                                      19222000
INTEGER SPECREQINDEX,                                                   19224000
        PREV'SPECREQ,     << FOR SCANNING QUEUE >>             <<01559>>19226000
        NEWSIZE,                                                        19228000
        READDISP,                                                       19230000
        MOVELENGTH;                                                     19232000
INTEGER OLDSIZE;                                               <<01557>>19234000
INTEGER CONDCODE:=CCE;                                         <<01557>>19236000
                                                                        19238000
DISABLE;                                                                19240000
MOSTURGPORTNUM:=PORTSTATUS(-1);                                         19242000
WHILE <> DO                                                             19244000
   BEGIN  <<GOT A MESSAGE>>                                             19246000
   X:=MOSTURGPORTNUM;                                                   19248000
   ASMB(BR * +1,X;  <<SWITCH TO THE SERVICE ROUTINE FOR THE PORT>>      19250000
        BR MAKEABSENTPORTSERVICE;                                       19252000
        BR MOVEREQPORTSERVICE;                                          19254000
        BR RELREGREQPORTSERVICE;                                        19256000
        BR IOSEGREQPORTSERVICE);                                        19258000
                                                                        19260000
                                                                        19262000
   MAKEABSENTPORTSERVICE:                                               19264000
      ASMB(ADDS 2);                                                     19266000
      RECEIVEMSG(X,2,0);                                                19268000
      IF <> THEN SUDDENDEATH(620);                                      19270000
      REQPROCINX:=TOS;                                                  19272000
      SEGIDENT:=S0;                                                     19274000
      IF S0.SEGIDTYPEFIELD<>SEGIDDATATYPE                      <<01644>>19276000
      THEN SUDDENDEATH(619);                                   <<01644>>19278000
      DESCSTINX:=TOS&LSL(2);                                            19280000
      DST(DESCSTINX+1).SEGMODREQFLAG:=1;                                19282000
      DST(X).FWIPFLAG:=1;                                               19284000
      X:=REQPROCINX;                                                    19286000
      TOS:=SLLPTR;                                                      19288000
      TOS:=SEGIDENT;                                                    19290000
      TOS:=0;                                                           19292000
      IF STKINFO.STKDSTFIELD=SEGIDENT THEN TOS.PROCSSTKFLAG:=1;         19294000
      TOS.SETMEMREQPTRFLAG:=1;                                          19296000
      ADDTOLOCALITY(*,*,*);                                             19298000
      X:=DSTSYSBASEINX+DESCSTINX;                                       19300000
      SEGDESCFIRMINFO.ABSENTFLAG:=1;                                    19302000
      TOS:=SEGDESCBANK;                                                 19304000
      TOS:=SEGDESCADDR;                                                 19306000
      RELEASEREGION(*,0);                                               19308000
      ENABLE;                                                           19310000
      <<GET WRITE GOING>>                                      <<01816>>19312000
      STARTSEGWRITE(SEGIDENT,FORCEDWRITEPRI);                  <<01816>>19314000
      <<REPLACE MEMORY ADDR WITH DISC ADDR IN DESCRIPTOR>>     <<01816>>19316000
      TOS:=SEGDESCBANK;                                        <<01816>>19318000
      TOS:=SEGDESCADDR;                                        <<01816>>19320000
      TOS:=TOS+RBTOHODADISP;                                   <<01816>>19322000
      ASMB(LDEA);                                              <<01816>>19324000
      SEGDESCLODA:=TOS;                                        <<01816>>19326000
      SEGDESCHODA:=TOS;                                        <<01816>>19328000
      ASMB(DDEL);                                              <<01816>>19330000
      GO CHECKFORMOREMSGS;                                              19332000
                                                                        19334000
   MOVEREQPORTSERVICE:                                                  19336000
      ASMB(ADDS 1);                                                     19338000
      RECEIVEMSG(X,1,0);                                                19340000
      IF <> THEN SUDDENDEATH(620);                                      19342000
      ENABLE;                                                           19344000
      SEGIDENT:=S0;                                                     19346000
      IF S0.SEGIDTYPEFIELD<>SEGIDDATATYPE                      <<01644>>19348000
      THEN SUDDENDEATH(619);                                   <<01644>>19350000
      DESCSTINX:=S0&LSL(2);                                             19352000
      DST(X:=DESCSTINX+1).SEGMODREQFLAG:=0;                             19354000
      IF = THEN SUDDENDEATH(619);                              <<01644>>19356000
                                                                        19358000
      <<FIND OUT PARAMETERS FOR MOVE>>                                  19360000
                                                                        19362000
      X:=SPECQHEAD;                                                     19364000
      << SEARCH FOR NEEDED SPECIAL REQUEST ENTRY >>            <<01559>>19366000
      WHILE ENTRYWORD01 <> SEGIDENT DO                         <<01559>>19368000
         BEGIN                                                 <<01559>>19370000
         PREV'SPECREQ := X;     << REMEMBER PREV ENTRY >>      <<01559>>19372000
         X := ENTRYWORD00;      << PTR TO NEXT ENTRY >>        <<01559>>19374000
         END;                                                  <<01559>>19376000
      << DELINK THE SPECIAL REQUEST ENTRY FROM THE QUEUE >>    <<01559>>19378000
      SPECREQINDEX := X;                                       <<01559>>19380000
      IF X = SPECQHEAD THEN                                    <<01559>>19382000
         SPECQHEAD := ENTRYWORD00                              <<01559>>19384000
      ELSE                                                     <<01559>>19386000
         BEGIN                                                 <<01559>>19388000
         TOS := ENTRYWORD00;    << PTR TO NEXT ENTRY >>        <<01559>>19390000
         X := PREV'SPECREQ;     << POINT TO PREV ENTRY >>      <<01559>>19392000
         ENTRYWORD00 := TOS;    << DELINK - SET NEW NEXT PTR >><<01559>>19394000
         END;                                                  <<01559>>19396000
      X := SPECREQINDEX;        << POINT TO SPECIAL REQ >>     <<01559>>19398000
      NEWSIZE:=ENTRYWORD02;                                             19400000
      READDISP:=ENTRYWORD03;                                            19402000
      MOVELENGTH:=ENTRYWORD04;                                          19404000
      RELSYSTABENTRY(SPECREQTABSYSBASEINX, SPECREQINDEX);      <<01559>>19406000
      OLDSIZE:=DST(DESCSTINX).DATASIZEFIELD;                   <<01557>>19408000
      DST(DESCSTINX).DATASIZEFIELD:=NEWSIZE;                            19410000
      TOS:=DST(X:=X+2);                                                 19412000
      TOS:=DST(X:=X+1);                                                 19414000
      REGIONBASE:=TOS;                                                  19416000
      IF LOGICAL(DST(X:=DESCSTINX+1)).STKFLAG THEN                      19418000
         BEGIN <<CHECK FOR INTERNAL MOVES REQUIRED>>                    19420000
         IF MOVELENGTH <> 0 THEN                                        19422000
            BEGIN <<PCBX MOVE REQUIRED>>                                19424000
            TOS:=REGIONBASE;                                            19426000
            ASMB(DDUP);                                                 19428000
            TOS:=TOS+READDISP; <<SOURCE ADDR>>                          19430000
            TOS:=MOVELENGTH; <<SIGNED MOVE COUNT>>                      19432000
            ASMB(MABS 5);                                               19434000
            <<ZERO OUT THE EXPANDED AREA>>                     <<01557>>19436000
            TOS:=REGIONBASE;                                   <<01557>>19438000
            TOS:=TOS+MOVELENGTH+1;     <<DEST. FOR ZEROING OUT><<01557>>19440000
            ASMB(DDUP,DECA);      <<SOURCE FOR ZEROING OUT>>   <<01557>>19442000
            TOS:=0;                                            <<01557>>19444000
            ASMB(SSEA);      <<ZERO FIRST WORD FOR TEMPLATE>>  <<01557>>19446000
            TOS:=READDISP-1; <<# WORDS TO ZERO OUT W/ MOVE>>   <<01557>>19448000
            ASMB(MABS 5);                                      <<01557>>19450000
            END;                                                        19452000
         END;                                                           19454000
      <<ZERO OUT EXPANDED AREA>>                               <<01557>>19456000
      IF MOVELENGTH = 0 THEN                                   <<01557>>19458000
         BEGIN <<EXPANDED SEGMENT ON THE END>>                 <<01557>>19460000
         TOS:=REGIONBASE;                                      <<01557>>19462000
         TOS:=TOS+OLDSIZE&LSL(2)+1; <<DESTINATION>>            <<01557>>19464000
         ASMB(DDUP,DECA); <<SOURCE>>                           <<01557>>19466000
         TOS:=0;                                               <<01557>>19468000
         ASMB(SSEA); <<TEMPLATE FOR MOVE>>                     <<01557>>19470000
         TOS:=(NEWSIZE&LSL(2)-OLDSIZE&LSL(2))-1; <<MOVECNT>>   <<01557>>19472000
         ASMB(MABS 5);                                         <<01557>>19474000
         END;                                                  <<01557>>19476000
      DISABLE;                                                          19478000
      PROCESSCOMPMSG(REGIONBASE,SEGIDENT,DESCSTINX);                    19480000
      GO CHECKFORMOREMSGS;                                              19482000
                                                                        19484000
   RELREGREQPORTSERVICE:                                                19486000
      ASMB(ADDS 2); <<FOR REGION BASE>>                                 19488000
      RECEIVEMSG(X,2,0);                                                19490000
      IF <> THEN SUDDENDEATH(620);                             <<01644>>19492000
      ENABLE;                                                           19494000
      RELEASEREGION(*,0);                                               19496000
      GO CHECKFORMOREMSGS;                                              19498000
                                                                        19500000
   IOSEGREQPORTSERVICE:                                                 19502000
      ASMB(ADDS 3);                                                     19504000
      RECEIVEMSG(X,3,NONDESTRUCTREAD);                         <<01557>>19506000
      IF <> THEN SUDDENDEATH(620);                                      19508000
      ENABLE;                                                           19510000
      TOS:=0;                                                           19512000
      TOS.IOSYSREQFLAG:=1;                                              19514000
      SPECIALFLAGS:=TOS;                                                19516000
      TOS.MSGIOFZREQFLAG:=0;                                            19518000
      IF <> THEN SPECIALFLAGS.IOFZREQFLAG:=1;                           19520000
      ASMB(DEL);                                                        19522000
      IOQSYSBASEINX:=TOS;                                               19524000
      SEGIDENT:=TOS;                                                    19526000
      TOS:=FETCHSEGMENT(SEGIDENT,IOQSYSBASEINX,SPECIALFLAGS,0,1);       19528000
      IF TOS<>MMOK THEN CONDCODE:=CCL <<WON'T FIT NOW>> ELSE   <<01987>>19532000
         BEGIN <<SUCCESS>>                                              19534000
         IF DST(X:=CONVSEGIDTOSTINX(SEGIDENT)).ABSENTFLAG=0             19536000
         THEN AWAKEDEVICE(IOQSYSBASEINX,SEGIDENT,0);                    19538000
         ASMB(ADDS 3); <<SOME ROOM FOR MESSAGE>>               <<01921>>19540000
         RECEIVEMSG(IOSEGREQPORT,3,0);                         <<01557>>19542000
         IF <> THEN SUDDENDEATH(620);                          <<01557>>19544000
         ASMB(DEL,DDEL); <<FINISHED IT OFF>>                   <<01557>>19546000
         END;                                                           19548000
      GO CHECKFORMOREMSGS;                                              19550000
                                                                        19552000
   CHECKFORMOREMSGS:                                                    19554000
      DISABLE;                                                          19556000
      MOSTURGPORTNUM:=PORTSTATUS(-1);                                   19558000
   END;                                                                 19560000
CC:=CONDCODE;                                                  <<01557>>19562000
END  <<PROCESSSCHEDMSGS>>;                                              19564000
                                                                        19566000
$PAGE "DISPATCHER"                                                      19568000
PROCEDURE DSP;                                                          19570000
OPTION PRIVILEGED,UNCALLABLE;                                           19572000
                                                                        19574000
                                                                        19576000
COMMENT                                                                 19578000
                                                                        19580000
THE DISPATCHER IS LAUNCHED VIA MICROCODE SOON AFTER THE                 19582000
EXECUTION OF A DISP INSTRUCTION (WHEN THE PDISABLE                      19584000
COUNT FALLS TO ZERO).  ALTHOUGH IMPLEMENTED AS A PROCE-                 19586000
DURE, DISPATCHER MAY NOT BE PCALED SINCE PROCESS                        19588000
SWITCHING MAY BE DISABLED LEVELS DEEP UNKNOWN TO THE                    19590000
CALLER, AND THE USER'S STK, THE ICS, AND THE DISPATCER                  19592000
DB AND ENTRY POINT MUST BE SET UP BY THE MICROCODE FOR                  19594000
THE DISPATCHER ENVIRONMENT TO BE PROPERLY INITIALIZED.                  19596000
                                                                        19598000
THE DISPATCHER HAS TWO FUNCTIONS: I). SAVING THE REGISTER               19600000
STATE, RESCHEDULING, AND UPDATING AND ACCOUNTING FOR THE                19602000
USAGE OF THE CPU, MAIN MEMORY AND DISC RESOURCES OF THE LAST            19604000
LAUNCHED PROCESS, AND II). SELECTING AND INITIATING THE NEXT            19606000
MOST URGENT CPU ACTIVITY (LAUNCHING A PROCESS IF THAT IS THE            19608000
MOST URGENT PENDING ACTIVITY, RESERVING MEMORY REGIONS                  19610000
FOR A PROCESS IF IT HAD TRAPPED OR IT'S DEEMED SAFE TO TRY              19612000
TO INCREASE THE MULTIPROGRAMMING LEVEL, FIX UP MEMORY                   19614000
THROUGH GARBAGE COLLECTION IF THAT'S DEEMED THE MOST WORTH-             19616000
WHILE THING TO DO FOR THE TIME BEING, OR PAUSE IF THERE'S               19618000
NOTHING WORTHWHILE TO DO).                                              19620000
                                                                        19622000
;                                                                       19624000
                                                                        19626000
                                                                        19628000
BEGIN                                                                   19630000
                                                                        19632000
                                                                        19634000
<<FIRMWARE ASSIGNMENTS IN Q-0 THRU Q-31>>                               19636000
                                                                        19638000
INTEGER ICS'PDISABLEDCNT=Q-ICS'PDISCNTCELL,                             19640000
        ICS'STKDST=Q-ICS'STKDSTCELL,                                    19642000
        ICS'PISTATUS=Q-ICS'PISTATUSCELL,                                19644000
        ICS'PIDELTAP=Q-ICS'PIDELTAPCELL,                                19646000
        ICS'CURPROCPCBPT=Q-ICS'CURPCBPTCELL,                            19648000
        ICS'JCUT=Q-ICS'JCUTCELL,                                        19650000
        ICS'STKBASE=Q-ICS'STKBASECELL,                                  19652000
        ICS'STKDBRELZ=Q-ICS'STKDBRELZCELL,                              19654000
        ICS'STKDBRELDL=Q-ICS'STKDBRELDLCELL,                            19656000
        ICS'STKDBRELS=Q-ICS'STKDBRELSCELL,                              19658000
        ICS'STKBANK=Q-ICS'STKBANKCELL,                                  19660000
        ICS'ABSSTKDB=Q-ICS'ABSSTKDBCELL;                                19662000
                                                                        19664000
<< SOFTWARE ASSIGNMENTS IN Q-32 THROUGH Q-63 >>                         19666000
                                                                        19668000
INTEGER WORSTCPRI=Q-ICS'WORSTCPRICELL, <<C,D,E SCHEDULING LIMITS>>      19670000
        WORSTDPRI=Q-ICS'WORSTDPRICELL,                                  19672000
        WORSTEPRI=Q-ICS'WORSTEPRICELL,                                  19674000
        CSCHEDBASE=Q-ICS'CSCHEDBASECELL, <<C,D,E SCHEDULING BASES>>     19676000
        DSCHEDBASE=Q-ICS'DSCHEDBASECELL,                                19678000
        ESCHEDBASE=Q-ICS'ESCHEDBASECELL;                                19680000
LOGICAL MINCFILTER=Q-ICS'MINCFILTERCELL, <<C,D,E SCHEDULING FILTERS>>   19682000
        MAXCFILTER=Q-ICS'MAXCFILTERCELL,                                19684000
        CURRENTCFILTER=Q-ICS'CURCFILTERCELL,                            19686000
        DENOM=Q-ICS'CWTDENOMCELL,                              <<01840>>19688000
        OLDFILTER'WT=Q-ICS'CWTOLDFILTWTCELL,                   <<01840>>19690000
        BACKGROUNDFILTER=Q-ICS'CURDFILTERCELL,                          19692000
        EFILTER=Q-ICS'CUREFILTERCELL,                                   19694000
        LISTSTATE=Q-ICS'LISTSTATECELL,<<MEASUREMENT CELLS>>    <<01812>>19696000
        CANDPIN=Q-ICS'CANDPINCELL;                             <<01812>>19698000
DOUBLE  SAVEPAUSETIME=Q-ICS'PAUSETIMECELL; <<DOUBLE>>                   19700000
LOGICAL LASTTRANS'WT=Q-ICS'CWTLASTTRANSWTCELL;                 <<01840>>19702000
                                                                        19704000
INTEGER LASTPROCINX=Q+4,                                                19706000
        LASTSTKSYSBASEINX=Q+5,                                          19708000
        LASTPROCNEWPRI=Q+6,                                             19710000
        INCOREPROTECTCNT=Q+7,                                           19712000
        LAUNCHPROCINX=Q+8,                                              19714000
        BPTINX=Q+9;                                                     19716000
                                                                        19718000
LOGICAL SWAPINPROCINX=Q+10,                                             19720000
        HARDREQUEST=Q+11;                                               19722000
                                                                        19724000
INTEGER MOREURGENTSWCNT=Q+12,                                           19726000
        LASTPROCNEWPRIOFFSET=Q+13;                                      19728000
                                                                        19730000
EQUATE  WORSTPRI=256;                                                   19732000
                                                                        19734000
LOGICAL QUANTUMOUT=Q+15,                                                19736000
        PIFLAG=Q+16;                                                    19738000
                                                                        19740000
DOUBLE  LASTSTKADDR=Q+17,                                               19742000
        LAUNCHSTKADDR=Q+19,                                             19744000
        LAUNCHDB=Q+21;                                                  19746000
                                                                        19748000
LOGICAL DONTDEALLOCATE=Q+23;                                            19750000
LOGICAL STKRELDB=Q+24;                                                  19752000
INTEGER CANDPROCINX=Q+25;                                               19754000
INTEGER LASTREFSWAPSEG=Q+26;                                            19756000
INTEGER SWAPFENCE=Q+27;                                                 19758000
LOGICAL SWAPDELAY=Q+28;                                                 19760000
LOGICAL MEMORYPRESSURE=Q+30;                                            19762000
DOUBLE CURRENTAPPROXTIME=Q+31;                                          19764000
DOUBLE LASTMAKEROOMAPPROXTIME=Q+33,                                     19766000
       MEMPRESSINTERVAL=Q+35;                                           19768000
INTEGER LASTPROCOLDPRI=Q+37;                                   <<01840>>19770000
DOUBLE LASTTRANS'TERM=Q+40,                                    <<01840>>19772000
       OLDFILTER'TERM=Q+42,                                    <<01840>>19774000
       TERM'SUM=Q+44;                                          <<01840>>19776000
INTEGER SWAPSTATUS=Q+46;                                       <<01987>>19778000
DEFINE PROCIMIFLAG=(0:1)#,                                              19780000
       PROCDISCIOFLAG=(1:1)#;                                           19782000
LOGICAL TOSRELSTOPREASON = S-4;                                <<01812>>19784000
DOUBLE  TOSRELLASTSTOPTIME = S-5;                              <<01812>>19786000
                                                                        19788000
    << THESE ARE PARAMETERS TO HELP DETECT WHEN POWERFAIL >>   <<02096>>19790000
    << HAS OCCURRED. THIS IS DONE SO WE WILL NOT LAUNCH   >>   <<02096>>19792000
    << ANY ONE ELSE UNTIL THE POWERFAIL PROCESS IS DONE.  >>   <<02096>>19794000
                                                               <<02096>>19796000
EQUATE   PFAILPIN    = % 144,      <<PFAIL PROCESS PIN>>       <<02096>>19798000
               QI    =    %5;      <<ICS INITIAL Q>>           <<02096>>19800000
                                                               <<02096>>19802000
DEFINE   PF    = ABS(ABS(QI)-12)#,                             <<02096>>19804000
         PPIN  = ABS(SYSBASE+PFAILPIN)#;                       <<02096>>19806000
                                                               <<02096>>19808000
$TITLE " DISPATCHER : SAVESTATE"                                        19810000
SUBROUTINE SAVESTATE;                                                   19812000
                                                                        19814000
<<                                                                      19816000
SUBROUTINE SAVESTATE GETS THE S REGISTER VALUE FROM                     19818000
THE LAST LAUNCHED PROCESS FROM THE ICS AND STICKS IT INTO               19820000
THE PROCESS' PCBX.                                                      19822000
IT IS ALSO CHECKED IF A STACK MODIFICATION IS REQUIRED.                 19824000
IF SO, THE STACK IS WRITTEN TO DISC AND THE PROCESS QUEUED ON IT.       19826000
>>                                                                      19828000
                                                                        19830000
BEGIN                                                                   19832000
                                                                        19834000
<<                                                                      19836000
                                                                        19838000
UPDATE S REGISTER VALUE FIRMWARE PLACED IN ICS                          19840000
>>                                                                      19842000
                                                                        19844000
TOS:=LASTSTKADDR;                                                       19846000
TOS:=TOS+SBTODBRELSDISP;                                                19848000
TOS:=ICS'STKDBRELS;                                                     19850000
ASMB(SSEA);                                                             19852000
ASMB(DDEL);                                                             19854000
                                                                        19856000
<<SAVE THE TIME THE PROCESS STOPPED IN PCBX FOR MEAS INTF>>    <<01812>>19858000
<<IF PROCESS STATISTICS ENABLED, ELSE STORE 0D>>               <<01925>>19860000
TOS:=LASTSTKADDR;                                              <<01812>>19862000
TOS:=TOS+SBTOMEASSTOPTIME;                                     <<01812>>19864000
TOS:=IF GCLASSENABLEDMASK.CLASS15 THEN TIMER ELSE 0D;          <<01925>>19866000
ASMB(SDEA;DDEL);                                               <<01812>>19868000
IF WAITTODISPMSG.PREEMPTEDFLAG THEN                            <<04774>>19870000
   BEGIN                                                       <<04774>>19872000
   TOS:=ICS(-ICS'STKBANKCELL);                                 <<04774>>19874000
   TOS:=ICS(-ICS'STKBASECELL);                                 <<04774>>19876000
   TOS:=TOS+SBTOMEASSTOPREASON;                                <<04774>>19878000
   TOS:=STOPACTIVE;                                            <<04774>>19880000
   ASMB(SSEA;DDEL);                                            <<04774>>19882000
   END;                                                        <<04774>>19884000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01812>>19886000
   BEGIN <<COPY REASON STOPPED FROM PCBX TO PROCSTAT XDS>>     <<01812>>19888000
   TOS:=LASTSTKADDR;                                           <<01812>>19890000
   TOS:=TOS+SBTOMEASSTOPREASON;                                <<01812>>19892000
   ASMB(LSEA);                                                 <<01812>>19894000
   TOS:=MEASPROCXDSBANK;                                       <<01812>>19896000
   TOS:=MEASPROCXDSBASE;                                       <<01812>>19898000
   TOS:=TOS+((LASTPROCINX+SYSBASE-ABS(PCBP))/PCBSIZE)*         <<01812>>19900000
        CLASS15'SUB0SIZE+CP'PROCQUESTOPWORD;                   <<01812>>19902000
   ASMB(LSEA);                                                 <<01812>>19904000
   TOS.STOPFLD:=S3;                                            <<01812>>19906000
   ASMB(SSEA;DDEL;DEL;DDEL); <<BANK,ADDR,REASON,BANK,ADDR>>    <<01812>>19908000
   END;                                                        <<01812>>19910000
<<                                                                      19912000
SET PCB FLAGS OF PROCESS                                                19914000
>>                                                                      19916000
                                                                        19918000
X:=LASTPROCINX;                                                         19920000
DISABLE;                                                                19922000
STKINFO.STOVRALLFLAG:=0; <<CLEAR STOVRFLOW SEMAPHORE SET IN ININ>>      19926000
IF <> THEN                                                     <<01941>>19928000
   BEGIN   <<PROCESS JUST HAD A STACK OVERFLOW>>               <<01941>>19930000
   DST(ICS'STKDST&LSL(2)).ABSENTFLAG:=1; <<MARK STK ABS>>      <<01941>>19932000
   X:=LASTPROCINX;                                             <<01941>>19934000
   END;                                                        <<01941>>19936000
IF WAITTODISPMSG.MEMTRAPFLAG THEN                                       19938000
   BEGIN <<SET WAIT ON MEMORY FLAGS>>                                   19940000
   RESABORTINFO.SARFLAG:=1;                                             19942000
   WAKEMASK.MEMORYWAITFLAG:=1;                                          19944000
   END;                                                                 19946000
IF WAITTODISPMSG.DISCWAITFLAG THEN RESABORTINFO.PCBSHORTWAITFLAG:=1     19948000
ELSE RESABORTINFO.PCBSHORTWAITFLAG:=0;                                  19950000
IF WAITTODISPMSG.TRANSCOMPFLAG THEN RESABORTINFO.PCBLONGWAITFLAG:=1     19952000
ELSE RESABORTINFO.PCBLONGWAITFLAG:=0;                                   19954000
IF WAITTODISPMSG.TERMREADFLAG THEN RESABORTINFO.PCBTERMREADFLAG:=1      19956000
ELSE RESABORTINFO.PCBTERMREADFLAG:=0;                                   19958000
CPUNUM;                   << GET CPU NUMBER >>                 <<04663>>19960000
IF TOS= SERIES64 THEN UPDATE'PCBXBNDS'FLAG;                    <<04663>>19962000
ENABLE;                                                                 19964000
                                                                        19966000
<<ADD LAST REF SWAP CODE SEG TO MIN LOCALITY IF MEMORY PRESSURE>>       19968000
                                                                        19970000
IF NOT MEMORYPRESSURE THEN LASTREFCODESEG:=0 ELSE                       19972000
   BEGIN  <<ADD MOST RECENT SWAP SEG TO MIN LOCALITY>>                  19974000
   LASTREFSWAPSEG:=0;                                                   19976000
   TOS:=ICS'STKBANK;                                                    19978000
   TOS:=ICS'ABSSTKDB+ICS'STKDBRELS-3;<<LAST STATUS ADDR>>               19980000
   DO                                                                   19982000
      BEGIN                                                             19984000
      ASMB(LSEA);                                                       19986000
      TOS:=TOS.(8:8);                                                   19988000
      IF S0 > %300 THEN                                                 19990000
         BEGIN                                                          19992000
         TOS:=TOS-%300;                                                 19994000
         X:=LASTPROCINX;                                                19996000
         TOS.SEGIDPBXFIELD:=PBX;                                        19998000
         TOS.SEGIDPBXFLAG:=1;                                           20000000
         LASTREFSWAPSEG:=TOS;                                           20002000
         END                                                            20004000
      ELSE                                                              20006000
         BEGIN                                                          20008000
         IF NOT LOGICAL(SL(S0&LSL(2)+1)).SEGRESIDENTFLAG THEN           20010000
            BEGIN                                                       20012000
            TOS.SEGIDTYPEFIELD:=SEGIDSLTYPE;                            20014000
            LASTREFSWAPSEG:=TOS;                                        20016000
            END                                                         20018000
         ELSE                                                           20020000
            BEGIN                                                       20022000
            ASMB(DEL,INCA); <<ADDR OF THIS MARKER'S DELTAQ>>            20024000
            ASMB(LSEA;INCA,SUB); <<ADDR OF PREV MARKER'S STATUS>>       20026000
            END;                                                        20028000
         END;                                                           20030000
      END                                                               20032000
   UNTIL LASTREFSWAPSEG <> 0;                                           20034000
   ASMB(DDEL);  <<ADDRESS OF MARKER>>                                   20036000
   X:=LASTPROCINX;                                                      20038000
   LASTREFCODESEG:=LASTREFSWAPSEG;                                      20040000
   ADDTOLOCALITY(SLLPTR,LASTREFSWAPSEG,0);                              20042000
   IF DBXDSINFO.XDSDSTFIELD <> 0                               <<01913>>20044000
   THEN ADDTOLOCALITY(SLLPTR,DBXDSINFO.XDSDSTFIELD,0);         <<01913>>20046000
   END;                                                                 20048000
END  <<SUBROUTINE SAVESTATE>>;                                          20050000
                                                                        20052000
                                                                        20054000
$TITLE "DISPATCHER : RESCHEDULE"                                        20056000
SUBROUTINE RESCHEDULE;                                                  20058000
                                                                        20060000
<<                                                                      20062000
                                                                        20064000
RESCHEDULE IS CALLED BY THE SCHEDULER AFTER THE STATE OF THE            20066000
LAST LAUCHED PROCESS HAS BEEN SAVED IN ORDER TO ACCOUNT FOR             20068000
THE CPU TIME USED BY THE PROCESS, AND, BASED ON CPU TIME USED           20070000
TOGETHER WITH THE CAUSE OF THE PROCESSING BLOCKING AND ITS              20072000
SCHEDULING CLASS, TO CALCULATE THE PROCESSES NEW PRIORITY               20074000
AND MERGE IT INTO THE PROPER SCHEDULING QUEUE.                          20076000
                                                                        20078000
>>                                                                      20080000
                                                                        20082000
BEGIN                                                                   20084000
TOS:=LASTSTKADDR;                                                       20086000
X:=LASTPROCINX;                                                         20088000
                                                                        20090000
<<UPDATE CPU TIME USED, CHECK FOR JOB CUTOFF>>                          20092000
                                                                        20094000
IF NOT PROCSTATE.SYSTEMPROCFLAG THEN                                    20096000
   BEGIN <<UPDATE PROCTIME, CHECK JOB CUTOFF OF USER PROCS>>            20098000
   <<UPDATE PROCESS' CUMULATIVE CPU TIME USED CELL IN PCBX>>            20100000
   TOS:=TOS+SBTOPROCTIMEDISP;                                           20102000
   ASMB(LDEA;ZERO;RCLK;DADD;SDEA);                                      20104000
   <<IF THESE'S A CUTOFF CPU TIME ON THE JOB, UPDATE TIME               20106000
     LEFT, AND IF THIS FALLS BELOW ZERO, KILL THE JOB>>                 20108000
   TOS:=TOS+PROCTIMETOJCIDISP;                                          20110000
   ASMB(LSEA);                                                          20112000
   TOS:=TOS.(0:8); <<INDEX INTO JCUT>>                                  20114000
   IF = THEN ASMB(DEL) ELSE                                             20116000
      BEGIN                                                             20118000
      TOS:=TOS*3;                                                       20120000
      TOS:=TOS+ICS'JCUT;                                                20122000
      X:=TOS; <<ABS ADDR OF JOB'S JCUT ENTRY>>                          20124000
      TOS:=TOS+JCITOJROLSDISP;                                          20126000
      ASMB(LSEA;RCLK;LADD);                                             20128000
      IF NOCARRY AND S0 < 1000 THEN ASMB(SSEA) ELSE                     20130000
         BEGIN <<TACK ON ANOTHER 1000 MS USED>>                         20132000
         ASMB(ZERO,XCH);<<MAKE A DOUBLE WORD>>                          20134000
         TOS:=ABSOLUTE(X:=X+1);                                         20136000
         TOS:=ABSOLUTE(X:=X+1);                                         20138000
         ASMB(DADD,DDUP);<<UPDATED CUMULATIVE TIME USED>>               20140000
         ABSOLUTE(X):=TOS;                                              20142000
         ABSOLUTE(X:=X-1):=TOS;                                         20144000
         TOS:=0;                                                        20146000
         TOS:=ABSOLUTE(X:=X-1); <<JOB LIMIT IN MILLE-SECONDS>>          20148000
         TOS:=1000D;                                                    20150000
         ASMB(DMUL;DCMP);                                               20152000
         IF > THEN                                                      20154000
            BEGIN <<SET FATHER'S SOFTKILL PSEUDO-INTERRUPT FLAG>>       20156000
            X:=LASTPROCINX;                                             20158000
            WHILE PROCSTATE.PTYPEFIELD <> MAIN                          20160000
            DO X:=(FATHERSONINFO.FATHERPINFIELD)*PCBSIZE                20162000
             +LOGICAL(PCBSYSBASEINX);                                   20164000
            IF PROCSTATE.ALIVEFLAG                                      20166000
            THEN SET'PSIF(X-PCBSYSBASEINX,SOFTKILL);                    20168000
            END;                                                        20170000
         TOS:=0;                                                        20172000
         ASMB(SSEA);                                                    20174000
                                                               <<02029>>20176000
         END;                                                           20178000
      TOS:=TOS+FROLSTOJCIDISP;                                 <<02029>>20180000
      END;                                                              20182000
      TOS:=TOS+JCITOSBDISP;                                             20184000
   END;                                                                 20186000
X:=LASTPROCINX;                                                         20188000
TOS:=TOS+SBTOTSSWAPINDISP;                                              20190000
                                                                        20192000
<<UPDATE TIME SINCE SWAP-IN AND INCORE PROTECT FLAG>>                   20194000
                                                                        20196000
IF NOT QUEUEINGINFO.PROCRESIDENTFLAG THEN                               20198000
   BEGIN                                                                20200000
   ASMB(LSEA;RCLK;LADD);                                                20202000
   IF CARRY THEN S0:=-1;                                                20204000
   ASMB(SSEA);                                                          20206000
   END;                                                                 20208000
TOS:=TOS+TSLSWAPINTOTSLRDISP;                                           20210000
                                                                        20212000
<<UPDATE TIME SINCE LAST TRANSACTION BEGAN AND PCBXQCNT>>               20214000
                                                                        20216000
IF QUEUEINGINFO.LSCHEDFLAG THEN TOS:=TOS+TSLRTOQCNTDISP ELSE            20218000
   BEGIN                                                                20220000
   ASMB(LSEA;RCLK;LADD);                                                20222000
   IF CARRY THEN S0:=-1;                                                20224000
   IF LOGICAL(WAITTODISPMSG).TRANSCOMPFLAG THEN                         20226000
      BEGIN                                                             20228000
      S0:=0;                                                            20230000
      RESABORTINFO.USEDQUANTUMFLAG:=0;                                  20232000
      END                                                               20234000
   ELSE IF QUEUEINGINFO.CSCHEDFLAG AND LS0>CURRENTCFILTER THEN          20236000
      BEGIN  <<CONSUMED A QUANTUM SINCE LAST RESCHEDULED>>              20238000
      QUANTUMOUT:=TRUE;                                                 20240000
      RESABORTINFO.USEDQUANTUMFLAG:=1;                                  20242000
      S0:=0;                                                            20244000
      END                                                               20246000
   ELSE IF LS0 > BACKGROUNDFILTER THEN                                  20248000
      BEGIN  <<BATCH JOB CONSUMED A QUANTUM SINCE LAST RESCHEDULED>>    20250000
      QUANTUMOUT:=TRUE;                                                 20252000
      S0:=0;                                                            20254000
      END;                                                              20256000
   ASMB(SSEA);                                                          20258000
   TOS:=TOS+TSLRTOTSTBDISP;<<PCBX' TIME SINCE TRANSACTION BEGAN>>       20260000
   ASMB(LSEA;RCLK;LADD);                                                20262000
   IF CARRY THEN S0:=-1;                                                20264000
                                                                        20266000
   <<TUNE C FILTER IF TRANSACTION COMPLETED>>                           20268000
                                                                        20270000
   IF RESABORTINFO.PCBTERMREADFLAG THEN                                 20272000
      BEGIN                                                             20274000
      LASTTRANS'TERM:=DOUBLE(TOS);   << TRANSACTION TIME >>    <<01840>>20276000
      LASTTRANS'TERM:=DOUBLE(LASTTRANS'WT)*LASTTRANS'TERM;     <<01840>>20278000
      IF OVERFLOW THEN TOS := CURRENTCFILTER                   <<01840>>20280000
      ELSE                                                     <<01840>>20282000
         BEGIN  << FORM 2ND TERM >>                            <<01840>>20284000
         OLDFILTER'TERM:=                                      <<01840>>20286000
            DOUBLE(OLDFILTER'WT)*DOUBLE(CURRENTCFILTER);       <<01840>>20288000
         IF OVERFLOW THEN TOS:=CURRENTCFILTER                  <<01840>>20290000
         ELSE                                                  <<01840>>20292000
            BEGIN  << FORM SUM OF TERMS >>                     <<01840>>20294000
            TERM'SUM:=LASTTRANS'TERM+OLDFILTER'TERM;           <<01840>>20296000
            IF OVERFLOW THEN TOS:=CURRENTCFILTER               <<01840>>20298000
            ELSE                                               <<01840>>20300000
               BEGIN  << FORM QUOTIENT >>                      <<01840>>20302000
               TOS:=TERM'SUM/DOUBLE(DENOM);                    <<01840>>20304000
               IF S1 <> 0 THEN                                 <<01840>>20306000
                  BEGIN                                        <<01840>>20308000
                  DDEL;   << THE BAD DOUBLE WORD FILTER >>     <<01840>>20310000
                  TOS:=CURRENTCFILTER;                         <<01840>>20312000
                  END                                          <<01840>>20314000
               ELSE                                            <<01840>>20316000
                  << THE NEW CFILTER WAS COMPUTED OK >>        <<01840>>20318000
                  DELB;   << MAKE IT A SINGLE WORD >>          <<01840>>20320000
               END << FINAL DIVIDE >>;                         <<01840>>20322000
            END << FORM SUM >>;                                <<01840>>20324000
         END << FORM 2ND TERM >>;                              <<01840>>20326000
      IF LS0>=MAXCFILTER THEN                                           20328000
         BEGIN <<SHOULD CRASH'>>                                        20330000
         ASMB(DEL);                                                     20332000
         TOS:=MAXCFILTER;                                               20334000
         END                                                            20336000
      ELSE IF LS0<=MINCFILTER THEN                                      20338000
         BEGIN                                                          20340000
         ASMB(DEL);                                                     20342000
         TOS:=MINCFILTER;                                               20344000
         END;                                                           20346000
      CURRENTCFILTER:=TOS;                                              20348000
      TOS:=0; <<FOR NEW VALUE OF TIME SINCE TRANS BEGAN>>               20350000
      END;                                                              20352000
   ASMB(SSEA);                                                          20354000
   TOS:=TOS+TSTBTOQCNTDISP;                                             20356000
   ASMB(LSEA);                                                          20358000
   IF QUANTUMOUT THEN                                          <<01880>>20360000
      BEGIN                                                    <<01880>>20362000
      TOS := TOS + 1;                                          <<01880>>20364000
      IF CARRY THEN S0 := -1; << Hold at max, do not rollover>><<01880>>20366000
      END;                                                     <<01880>>20368000
   IF LOGICAL(WAITTODISPMSG).TRANSCOMPFLAG THEN ASMB(DEL,ZERO);         20370000
   LASTPROCNEWPRIOFFSET := IF 0<=S0<=127  THEN  S0*2           <<01880>>20372000
      ELSE 256;                                                <<01880>>20374000
   ASMB(SSEA);                                                 <<01944>>20376000
   END;                                                                 20378000
ASMB(DDEL);                                                    <<01944>>20380000
<<CALCULATE PROC'S NEW PRIORITY, AND MERGE INTO PROPER QUEUE>>          20382000
                                                                        20384000
X:=LASTPROCINX;                                                         20386000
IF QUEUEINGINFO.LSCHEDFLAG THEN                                         20388000
LASTPROCNEWPRI:=QUEUEINGINFO.PRIFIELD ELSE                              20390000
   BEGIN <<RECALCULATE PROCESS' SCHEDULING PRIORITY>>                   20392000
   LASTPROCOLDPRI:=QUEUEINGINFO.PRIFIELD;                               20394000
   IF RESABORTINFO.HOLDIMPPRIFLAG OR RESABORTINFO.HOLDSIRPRIFLAG        20396000
   THEN LASTPROCNEWPRI:=QUEUEINGINFO.PRIFIELD ELSE                      20398000
      BEGIN                                                             20400000
      IF QUEUEINGINFO.CSCHEDFLAG THEN                                   20402000
         BEGIN                                                          20404000
         TOS:=CSCHEDBASE+LASTPROCNEWPRIOFFSET;                          20406000
         IF WAITTODISPMSG.MEMTRAPFLAG THEN TOS:=TOS+1;         <<01941>>20408000
         IF S0 > WORSTCPRI  THEN S0:= WORSTCPRI;                        20410000
         LASTPROCNEWPRI:=TOS;                                           20412000
         END                                                            20414000
      ELSE                                                              20416000
         BEGIN                                                          20418000
         IF QUEUEINGINFO.DSCHEDFLAG  THEN                               20420000
            BEGIN                                                       20422000
            TOS:=DSCHEDBASE+LASTPROCNEWPRIOFFSET;                       20424000
            IF WAITTODISPMSG.MEMTRAPFLAG THEN TOS:=TOS+1;      <<01941>>20426000
            IF S0 > WORSTDPRI THEN S0:=WORSTDPRI;                       20428000
            LASTPROCNEWPRI:=TOS;                                        20430000
            END                                                         20432000
         ELSE                                                           20434000
            BEGIN                                                       20436000
            TOS:=ESCHEDBASE+LASTPROCNEWPRIOFFSET;                       20438000
            IF WAITTODISPMSG.MEMTRAPFLAG THEN TOS:=TOS+1;      <<01941>>20440000
            IF S0 > WORSTEPRI THEN S0:=WORSTEPRI;                       20442000
            LASTPROCNEWPRI:=TOS;                                        20444000
            END;                                                        20446000
         END;                                                           20448000
      END;                                                              20450000
   END;                                                                 20452000
DISABLE;                                                                20454000
QUEUEINGINFO.PRIFIELD:=LASTPROCNEWPRI;                                  20456000
IF WAITTODISPMSG.MEMTRAPFLAG                                   <<01941>>20458000
THEN QUEUEPROC(LASTPROCINX,DISPATCHINGQ,FRONTOFCLASS)          <<01941>>20460000
ELSE IF (RESABORTINFO.PCBSHORTWAITFLAG                         <<01941>>20462000
   LOR WAKEMASK=0) LAND (LASTPROCOLDPRI <> LASTPROCNEWPRI      <<01696>>20464000
   LOR QUANTUMOUT)  <<ONLY MOVE IN QUEUE IF NECESSARY>>        <<01696>>20466000
   THEN QUEUEPROC(LASTPROCINX,DISPATCHINGQ,ENDOFCLASS);                 20468000
ENABLE;                                                                 20470000
END;  <<SUBROUTINE RESCHEDULE>>                                         20472000
                                                                        20474000
$TITLE "DISPATCHER : LAUNCH"                                            20476000
SUBROUTINE LAUNCH;                                                      20478000
                                                                        20480000
<<                                                                      20482000
LAUNCH IS CALLED BY THE CPU'S DISPATCHER TO SET UP THE ENVIRONMENT      20484000
ON THE ICS FOR THE LAUNCH OF LAUNCHPROCINX.                             20486000
>>                                                                      20488000
                                                                        20490000
                                                                        20492000
BEGIN                                                                   20494000
                                                                        20496000
<<                                                                      20498000
FIX UP LOW CORE CELLS                                                   20500000
>>                                                                      20502000
                                                                        20504000
ABSOLUTE(CPCB):=LAUNCHPROCINX+SYSBASE;                                  20506000
X:=LAUNCHPROCINX;                                                       20508000
X:=PBX;                                                                 20510000
IF <> THEN                                                              20512000
   BEGIN <<FILL IN THE ST PROGRAM BLOCK BASE>>                          20514000
   TOS:=CSTXBLK(X);                                                     20516000
   TOS:=TOS+ABSOLUTE(DSTP);                                             20518000
   ABSOLUTE(CSTXP):=TOS;                                                20520000
   END;                                                                 20522000
                                                                        20524000
<<                                                                      20526000
STORE THE PROCESS' REGISTER VALUES INTO THE ICS                         20528000
>>                                                                      20530000
                                                                        20532000
X:=LAUNCHPROCINX;                                                       20534000
                                                               <<02016>>20536000
ICS'CURPROCPCBPT:=X-PCBSYSBASEINX;   <<CHANGE THIS IN NEXT VERSION>>    20538000
                                                               <<01788>>20540000
<<MAKE SURE STK AND XDS AROUND>>                               <<01788>>20542000
                                                               <<01788>>20544000
ICS'STKDST:=STKINFO.STKDSTFIELD;                               <<01788>>20546000
STKRELDB:=DBXDSINFO.XDSDSTFIELD; <<SAVE :X REG PROB>>          <<01788>>20548000
IF (STKRELDB<>0 LAND DST(STKRELDB&LSL(2))<0)                   <<01788>>20550000
LOR (DST(ICS'STKDST&LSL(2))<0) THEN                            <<01788>>20552000
   BEGIN <<STK OR DB XDS ABSENT>>                              <<01788>>20554000
   FLAGPROCABSENT(LAUNCHPROCINX,STKRELDB);                     <<01788>>20556000
   ABSOLUTE(CPCB):=0; <<CHANGED OUR MINDS>>                             20558000
   ASMB(DEL); <<RETURN DELTAP FOR S EXIT>>                              20560000
   GO STARTSCANOVER;                                                    20562000
   END;                                                                 20564000
                                                               <<01788>>20566000
X:=ICS'STKDST&LSL(2)+DSTSYSBASEINX; <<SET X TO STK DESC>>      <<01788>>20568000
SEGDESCFIRMINFO.REFERENCEDFLAG:=1;<<FOR CLOCK ALG>>                     20570000
TOS:=SEGDESCBANK;                                                       20572000
ICS'STKBANK:=S0;                                                        20574000
TOS:=SEGDESCADDR;                                                       20576000
ICS'STKBASE:=S0;                                                        20578000
TOS:=TOS+SBTOSTKRELDBDISP;                                              20580000
ASMB(LSEA); <<DB OFFSET FROM STACK'S BASE>>                             20582000
STKRELDB:=S0; <<SAVE FOR DL REL DB CALCULATION>>                        20584000
ASMB(DDUP,LADD);                                                        20586000
ICS'ABSSTKDB:=TOS+STKRELDBTOSBDISP;                                     20588000
ASMB(DEL);                                                              20590000
TOS:=TOS+STKDBTOSTKDLDISP;                                              20592000
ASMB(LSEA);                                                             20594000
ICS'STKDBRELDL:=TOS-STKRELDB;                                           20596000
IF > THEN SUDDENDEATH(680);                                    <<01644>>20598000
TOS:=TOS+STKDLTODBRELZDISP;                                             20600000
ASMB(LSEA);                                                             20602000
ICS'STKDBRELZ:=TOS;                                                     20604000
TOS:=TOS+DBRELZTODBRELSDISP;                                            20606000
ASMB(LSEA);                                                             20608000
ICS'STKDBRELS:=TOS;                                                     20610000
                                                                        20612000
<<                                                                      20614000
FIX UP PROCESS' MARKER FOR LAUNCH                                       20616000
>>                                                                      20618000
                                                                        20620000
ASMB(DEL);                                                              20622000
TOS:=ICS'ABSSTKDB+ICS'STKDBRELS;<<ABS ADDR OF S>>                       20624000
CPUNUM;             << GET CPU NUMBER >>                       <<04663>>20626000
IF TOS= SERIES64 THEN GET'PCBXBNDS'FLAG;                       <<04663>>20628000
<<FIGURE OUT PROCESS' DB VALUE>>                                        20630000
X:=LAUNCHPROCINX;                                                       20632000
TOS:=DBXDSINFO;                                                         20634000
IF < THEN                                                               20636000
   BEGIN <<DB AT AN ABS LOCATION, SO S0,S1 SHOULD BE VALID>>            20638000
   ASMB(DEL,DECA);                                                      20640000
   END                                                                  20642000
ELSE                                                                    20644000
   BEGIN                                                                20646000
   TOS:=TOS.XDSDSTFIELD&LSL(2);                                         20648000
   IF = THEN                                                            20650000
      BEGIN  <<DB AT THE STK>>                                          20652000
      ASMB(DEL);                                                        20654000
      TOS:=ICS'ABSSTKDB;                                                20656000
      ASMB(SSEA);                                                       20658000
      TOS:=TOS-1;                                                       20660000
      TOS:=ICS'STKBANK;                                                 20662000
      ASMB(SSEA);                                                       20664000
      END                                                               20666000
   ELSE                                                                 20668000
      BEGIN <<DB GOES TO BASE OF AN XDS>>                               20670000
      X:=TOS+DSTSYSBASEINX;                                             20672000
      IF SEGDESCFIRMINFO.ABSENTFLAG THEN                                20674000
      SUDDENDEATH(619);                                        <<01788>>20676000
      CPUNUM;           << GET CPU NUMBER >>                   <<04663>>20678000
      IF TOS= SERIES64 THEN GET'XDSEG'LIMITS;                  <<04663>>20680000
      SEGDESCFIRMINFO.REFERENCEDFLAG:=1;                                20682000
      TOS:=SEGDESCADDR;                                                 20684000
      ASMB(SSEA);                                                       20686000
      TOS:=TOS-1;                                                       20688000
      TOS:=SEGDESCBANK;                                                 20690000
      ASMB(SSEA);                                                       20692000
      END;                                                              20694000
   END;                                                                 20696000
IF GCLASSENABLEDMASK.CLASS15 THEN                              <<01812>>20698000
   BEGIN <<UPDATE REASON STOPTIME>>                            <<01812>>20700000
   TOS:=ICS'STKBANK;                                           <<01812>>20702000
   TOS:=ICS'STKBASE+SBTOMEASSTOPREASON;                        <<01812>>20704000
   ASMB(LSEA);                                                 <<01812>>20706000
   IF <> THEN                                                  <<01812>>20708000
      BEGIN <<PROCESS STOPPED FOR REASON INTF KNOWS ABOUT>>    <<01812>>20710000
      ASMB(CAB,CAB); <<PUT BANK & ADDR BACK ON TOS>>           <<01812>>20712000
      TOS:=TOS-SBTOMEASSTOPREASON+SBTOMEASSTOPTIME;            <<01812>>20714000
      ASMB(LDEA); <<TIME LAST STOPPED>>                        <<01812>>20716000
      IF = THEN <<PROCESS STOPPED BEFORE STATS ENABLED, USE>>  <<01925>>20718000
         BEGIN<<STARTTIME OF STATS GATHERING AS PROC STOPTIME>><<01925>>20720000
         ASMB(DDEL); <<GET RID OF 0D FOR A STOPTIME>>          <<01925>>20722000
         TOS:=MEASPROCXDSBANK;                                 <<01925>>20724000
         TOS:=MEASPROCXDSBASE+2;<<TIME STATS WAS ENABLED>>     <<01925>>20726000
         ASMB(LDEA);                                           <<01925>>20728000
         ASMB(DXCH;DDEL); << DEL BANK AND ADDR>>               <<01925>>20730000
         END;                                                  <<01925>>20732000
      TOS:=TIMER;                                              <<01812>>20734000
      ASMB(DXCH;DSUB); <<TOS ==> TOTAL TIME STOPPED>>          <<01812>>20736000
      ASMB(DXCH;DDEL); <<DEL STKBANK & STKBASE>>               <<01812>>20738000
      <<TOS NOW HAS THE REASON AND TOTAL TIME STOPPED>>        <<01812>>20740000
      <<NOW ADD TO APPROPIATE COUNTER IN MEAS XDS>>            <<01812>>20742000
      TOS:=MEASPROCXDSBANK;                                    <<01812>>20744000
      TOS:=MEASPROCXDSBASE;                                    <<01812>>20746000
      TOS:=TOS+((ABS(CPCB)-ABS(PCBP))/PCBSIZE)*                <<01812>>20748000
           CLASS15'SUB0SIZE;                                   <<01812>>20750000
      TOS:=TOS+CP'PAUSESWAPTIME-2+TOSRELSTOPREASON*2;          <<01812>>20752000
      ASMB(LDEA); <<OLD CUMMLATIVE TIME STOPPED>>              <<01812>>20754000
      TOS:=TOSRELLASTSTOPTIME;  <<FROM S-5, >>                 <<01812>>20756000
      ASMB(DADD;SDEA); <<STUFF AWAY NEW TIME>>                 <<01812>>20758000
      ASMB(DDEL;DDEL;DEL);<<REASON, TIME STOPPPED,BANK,ADDR>>  <<01812>>20760000
      END                                                      <<01812>>20762000
   ELSE                                                        <<01812>>20764000
      ASMB(DDEL;DEL); <<BANK, BASE, AND REASON>>               <<01812>>20766000
   END;                                                        <<01812>>20768000
<<UNCONDITIONALY ZERO OUT THE MEASSTOPREASON IN THE USERS>>    <<01812>>20770000
<<PCBX FOR HISTORY AND SYNCRONIZATION WHEN USING MEAS INTF>>   <<01812>>20772000
TOS:=ICS'STKBANK;                                              <<01812>>20774000
TOS:=ICS'STKBASE+SBTOMEASSTOPREASON;                           <<01812>>20776000
ASMB(ZERO;SSEA;DDEL);                                          <<01812>>20778000
<<                                                                      20780000
IF PROCESS HAS A PENDING PSEUDO-INTERRUPT, PUT A MARKER                 20782000
ONTO HIS STK SO HE'LL BE LAUNCHED INTO THE INTERRUPT HANDLER            20784000
>>                                                                      20786000
X:=LAUNCHPROCINX;                                                       20788000
DISABLE;                                                                20790000
IF PROCSTATE.PIFLAGSFIELD <>0 OR LOGICAL(PROCSTATE).STOVFLAG   <<04128>>20792000
    LAND NOT LOGICAL(STKINFO).INSYSTEMFLAG                     <<04483>>20794000
    LAND NOT LOGICAL(RESABORTINFO).HASSIRFLAG                  <<04483>>20796000
    LAND NOT LOGICAL(RESABORTINFO).CRITFLAG THEN               <<04483>>20798000
   BEGIN <<PROCESS HAS A PENDING PSEUDO OR SOFT INTERRUPT>>    <<03041>>20800000
   IF NOT RESABORTINFO.HASSIRFLAG AND NOT RESABORTINFO.CRITFLAG         20802000
   OR RESABORTINFO.RITBRKFLAG THEN                                      20804000
      BEGIN <<BUILD MARKER TO PSEUDOINT>>                               20806000
      PIFLAG:=TRUE;                                                     20808000
      RESABORTINFO.PIOVRFLAG:=0;                                        20810000
      <<ADD A MARKER TO PSEUDOINT>>                                     20812000
      ASMB(LDEA);                                                       20814000
      LAUNCHDB:=TOS;                                                    20816000
      TOS:=0;                                                           20818000
      ASMB(SSEA); <<DON'T CARE ABOUT X>>                                20820000
      TOS:=TOS+1;                                                       20822000
      TOS:=ICS'PIDELTAP;                                                20824000
      ASMB(SSEA);                                                       20826000
      TOS:=TOS+1;                                                       20828000
      TOS:=ICS'PISTATUS;                                                20830000
      ASMB(SSEA);                                                       20832000
      TOS:=TOS+1;                                                       20834000
      TOS:=4;                                                           20836000
      ASMB(SSEA);                                                       20838000
      TOS:=TOS+1;                                                       20840000
      TOS:=LAUNCHDB;                                                    20842000
      ASMB(SDEA);                                                       20844000
      ICS'STKDBRELS:=ICS'STKDBRELS+4;                                   20846000
      END;                                                              20848000
   END;                                                                 20850000
                                                                        20852000
<<                                                                      20854000
SET THE PROCESS' BREAKPOINTS                                            20856000
>>                                                                      20858000
                                                                        20860000
BPTINX:=PIMPPINBKLINK.BREAKPTLINKFIELD;                        <<MM.IV>>20862000
IF BPTINX<>0 THEN                                              <<MM.IV>>20864000
   BEGIN                                                       <<MM.IV>>20866000
   << EXCHDB TO BREAKPOINT TABLE  >>                           <<MM.IV>>20868000
   << TABLE HAD BETTER BE PRESENT >>                           <<MM.IV>>20870000
   IF NOT BPT'TAB'LOCKED THEN SUDDENDEATH (199);               <<MM.IV>>20872000
   TOS := DST(BPT'DST'IND+2);                                  <<MM.IV>>20874000
   TOS := DST(X+1);                                            <<MM.IV>>20876000
   ASMB(XCHD);                                                 <<MM.IV>>20878000
   BPTINX := BPT(BPTINX);          << INDEX OF 1ST ENTRY   >>  <<MM.IV>>20880000
                                                               <<MM.IV>>20882000
   WHILE BPTINX <> 0 DO                                        <<MM.IV>>20884000
      BEGIN                                                    <<MM.IV>>20886000
      << CONVERT SEGIDENT TO DST INX >>                        <<01609>>20888000
      X := CONVSEGIDTOSTINX (BPT(BPTINX+1));                   <<01609>>20890000
      IF DST(X) > 0 THEN                                       <<MM.IV>>20892000
         BEGIN                     << SET BREAK POINT      >>  <<MM.IV>>20894000
         TOS := DST(X:=X+2);       << GET INSTR.           >>  <<MM.IV>>20896000
         TOS := DST(X:=X+1);                                   <<MM.IV>>20898000
         TOS := TOS+BPT(BPTINX+2); << PLOC OF INSTR.       >>  <<MM.IV>>20900000
         ASMB(LSEA);                                           <<MM.IV>>20902000
         IF S0 = %36000 THEN                                   <<MM.IV>>20904000
            DEL                                                <<MM.IV>>20906000
         ELSE                                                  <<MM.IV>>20908000
            BEGIN                                              <<MM.IV>>20910000
            BPT(BPTINX+3) := TOS;  << SAVE INSTR.          >>  <<MM.IV>>20912000
            TOS := %36000;                                     <<MM.IV>>20914000
            ASMB(SSEA);                                       <<<MM.IV>>20916000
            BPT(BPTINX).(3:1) := 1;<< SET VALIDITY FLAG    >>  <<MM.IV>>20918000
            END;                                               <<MM.IV>>20920000
         DDEL;                     << REMOVE ADDRESS       >>  <<MM.IV>>20922000
         END;                                                  <<MM.IV>>20924000
      BPTINX := BPT(BPTINX+4);     << NEXT ENTRY           >>  <<MM.IV>>20926000
      END;                                                     <<MM.IV>>20928000
                                                               <<MM.IV>>20930000
   ASMB(XCHD); DDEL;               << SET DB TO ORIG STATE >>  <<MM.IV>>20932000
   END;                                                        <<MM.IV>>20934000
                                                               <<MM.IV>>20936000
                                                                        20938000
X:=LAUNCHPROCINX;                                                       20940000
DISABLE;                                                                20942000
                                                                        20944000
<<                                                                      20946000
FILL IN THE DISP, AWAKE, AND WAIT COMMUNICATION CELLS                   20948000
>>                                                                      20950000
                                                                        20952000
TOS:=0;                                                        <<02827>>20954000
TOS.CURPROCQUEUE:=QUEUEINGINFO.QUEUEFIELD;                     <<02827>>20956000
TOS.CURPROCPRI:=QUEUEINGINFO.PRIFIELD;                         <<02827>>20958000
<<Determine if process is preemptable by another process in>>  <<02827>>20960000
<<same queue.                                              >>  <<02827>>20962000
IF RESABORTINFO.USEDQUANTUMFLAG OR QUEUEINGINFO.LSCHEDFLAG     <<02827>>20964000
THEN TOS.PREEMPTOKFLAG:=1; <<ENABLE PREEMPTION>>                        20966000
DISPTOAWAKEMSG:=TOS;                                                    20968000
WAITTODISPMSG:=0;                                                       20970000
                                                                        20972000
IF PIFLAG THEN ICS'PDISABLEDCNT:=2; <<LAUNCH PDISABLED>>                20974000
PENABLE;  <<SERIES 33 REQUIRES>>                                        20976000
<<                                                                      20978000
ZERO OUT PROCESS CLOCK                                                  20980000
>>                                                                      20982000
                                                                        20984000
TOS:=0;                                                                 20986000
SETCLOCK;                                                               20988000
                                                                        20990000
<<                                                                      20992000
ARM CPU BOUND PROTECT INTERRUPT                                         20994000
>>                                                                      20996000
                                                                        20998000
IF PROCSTATE.SYSTEMPROCFLAG THEN TRL(4):=-1 <<NO TIMEOUT FOR SYSTEM>>   21000000
ELSE TRL(4):=3; <<SET TIMEOUT FOR APPROX 300 MS>>              <<01799>>21002000
                                                                        21004000
<<                                                                      21006000
IXIT INTO THE PROCESS                                                   21008000
>>                                                                      21010000
                                                                        21012000
ASMB( IXIT );                                                           21014000
END;  <<SUBROUTINE LAUNCH>>                                             21016000
                                                                        21018000
                                                                        21020000
                                                                        21022000
$PAGE "DISPATCHER : DSP"                                                21024000
<<                                                                      21026000
MICROCODE LAUNCH POINT OF DISPATCHER-                                   21028000
EXTERNAL INTERRUPTS AND TRAPS ARE DISABLED,                             21030000
DB IS SET AT SYSDB                                                      21032000
>>                                                                      21034000
                                                                        21036000
PDISABLE;<<WE DON'T WANT THE DISPATCHER TO RESTART UNLESS               21038000
          HE HAS PAUSED.  THE DISPATCHER IS EXPLICITLY IN-              21040000
          FORMED OF MORE URGENT ACTIVITY THROUGH THE AWAKETO-           21042000
          DISP COMMUNICATIONS CELL. INSTEAD OF HAVING AWAKE             21044000
          DO A DISP TO RESTART THE DISPATCHER, DISPATCHER               21046000
          STAYS PDISABLED UNTIL LAUNCHING OR PAUSING, AND               21048000
          CHECKS AWAKE'S COMMUNICATIONS AT CONVENIENT TIMES             21050000
          TO SEE IF THERE'S SOMETHING MORE URGENT TO DO.>>              21052000
                                                                        21054000
<<                                                                      21056000
MAKE ROOM ON THE ICS FOR DISPATCHER'S LOCAL VARIABLES, INITIALIZE       21058000
>>                                                                      21060000
                                                                        21062000
ASMB(ADDS 48);  <<FOR DISPATCHER'S LOCAL VARIABLES>>           <<01987>>21064000
                                                               <<01788>>21066000
<<FIGURE OUT IF THERE'S BEEN MEMORY PRESSURE LATELY>>          <<01788>>21068000
                                                               <<01788>>21070000
TOS:=TRL(5);                                                   <<01925>>21072000
TOS:=TRL(6);                                                   <<01925>>21074000
CURRENTAPPROXTIME:=TOS;                                        <<01925>>21076000
TOS:=HOTIMELASTMAKEROOM;                                                21078000
TOS:=LOTIMELASTMAKEROOM;                                                21080000
LASTMAKEROOMAPPROXTIME:=TOS;                                            21082000
TOS:=0;                                                                 21084000
TOS:=MEMPRESSDUREXT;                                                    21086000
MEMPRESSINTERVAL:=TOS;                                                  21088000
IF CURRENTAPPROXTIME-LASTMAKEROOMAPPROXTIME < 0D               <<01788>>21090000
THEN MEMORYPRESSURE:=FALSE<<CLOCK ROLLOVER SINCE MAKEROOM>>    <<01788>>21092000
ELSE IF CURRENTAPPROXTIME-LASTMAKEROOMAPPROXTIME               <<01788>>21094000
< MEMPRESSINTERVAL THEN MEMORYPRESSURE:=TRUE <<RECENT MAKEROOM><<01788>>21096000
ELSE MEMORYPRESSURE:=FALSE;                                    <<01788>>21098000
                                                                        21100000
ASMB(DZRO,DZRO);                                                        21102000
LASTPROCNEWPRIOFFSET:=TOS;                                              21104000
DONTDEALLOCATE:=TOS;                                                    21106000
PIFLAG:=TOS;                                                            21108000
QUANTUMOUT:=TOS;                                                        21110000
                                                                        21112000
<<                                                                      21114000
INFORM SYSTEM THAT DISPATCHER IS RUNNING,NOT PAUSED                     21116000
>>                                                                      21118000
                                                                        21120000
TOS:=ABSOLUTE(CPCB);                                                    21122000
COMMENT : SETUP FOR CALL TO MMSTAT ( DONE HERE TO PRESERVE     <<04485>>21124000
 THE PIN OF THE LAST RUNNING PROCESS;                          <<04485>>21126000
                                                               <<04485>>21128000
ASMB(TEST);                                                    <<04485>>21130000
IF <> THEN                                                     <<04485>>21132000
   BEGIN                                                       <<04485>>21134000
   X:=ABSOLUTE(CPCB)-SYSBASE;                                  <<04485>>21136000
   MMSTAT(40,RESABORTINFO,WAKEMASK,QUEUEINGINFO)               <<04485>>21138000
   END;                                                        <<04485>>21140000
                                                                        21142000
ASMB(ZERO,DZRO);                                                        21144000
TOS.DISPRUNNINGFLAG:=1;                                                 21146000
DISPTOAWAKEMSG:=TOS; <<==>DISPATCHER RUNNING,NOT PAUSED>>               21148000
ABSOLUTE(CPCB):=TOS;                                                    21150000
TRL(4):=TOS; <<SET QTIME TO 0 - DON'T WANT CLOCK INTERRUPTING>>         21152000
ENABLE;                                                                 21154000
                                                                        21156000
                                                                        21158000
<<                                                                      21160000
WHO WAS RUNNING LAST?                                                   21162000
>>                                                                      21164000
                                                                        21166000
ASMB(TEST);                                                             21168000
IF <> THEN                                                              21170000
   BEGIN <<A PROCESS WAS RUNNING>>                                      21172000
   IF S0=-1 THEN                                                        21174000
      BEGIN  <<SYSTEM JUST COMING UP>>                                  21176000
      ASMB(DEL);                                                        21178000
      INITIO(2); <<INITIALIZE SYSTEM DISC>>                             21180000
      STARTCLOCK(0,0D); <<GET CLOCK MOVING>>                   <<01770>>21182000
      END                                                               21184000
   ELSE                                                                 21186000
      BEGIN                                                             21188000
      LASTPROCINX:=TOS-SYSBASE;                                         21190000
      LASTSTKSYSBASEINX:=ICS'STKDST&LSL(2)+DSTSYSBASEINX;               21192000
      IF GCLASSENABLEDMASK.CLASS0 THEN                                  21194000
         BEGIN  <<MEASURE PROCESS BURST EVENT AND DURATION>>            21196000
         TOS:=MEASSTATXDSBANK;                                          21198000
         TOS:=MEASSTATXDSBASE;                                          21200000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'LAUNCH;                   <<RAY.V>>21202000
         ASMB(LSEA);                                                    21204000
         TOS:=TOS+1;                                                    21206000
         ASMB(SSEA);  << CUM # OF LAUNCHES>>                            21208000
         TOS:=TOS-C'LAUNCH+C'CPUPROCESS;                       <<RAY.V>>21210000
         ASMB(LDEA);                                                    21212000
         ASMB(ZERO;RCLK);                                               21214000
         ASMB(DADD);                                                    21216000
         ASMB(SDEA;DDEL); <<CUM CPU TIME ON PROCESSES>>                 21218000
         END;                                                           21220000
      IF GCLASSENABLEDMASK.CLASS15 THEN                        <<01812>>21222000
         BEGIN <<CPU TIME & NUMBER OF LAUNCHES>>               <<01812>>21224000
         TOS:=MEASPROCXDSBANK;                                 <<01812>>21226000
         TOS:=MEASPROCXDSBASE;                                 <<01812>>21228000
         TOS:=TOS+((LASTPROCINX+SYSBASE-ABS(PCBP))/PCBSIZE)*   <<01812>>21230000
              CLASS15'SUB0SIZE+CP'LAUNCH;                      <<01812>>21232000
         ASMB(LSEA);                                           <<01812>>21234000
         TOS:=TOS+1;                                           <<01812>>21236000
         ASMB(SSEA);                                           <<01812>>21238000
         TOS:=TOS-CP'LAUNCH+CP'CPUTIME;                        <<01812>>21240000
         ASMB(LDEA);                                           <<01812>>21242000
         ASMB(ZERO;RCLK);                                      <<01812>>21244000
         ASMB(DADD;SDEA;DDEL);                                 <<01812>>21246000
         END;                                                  <<01812>>21248000
      END;                                                              21250000
   END                                                                  21252000
ELSE                                                                    21254000
   BEGIN <<SYSTEM WAS PAUSED>>                                          21256000
   LASTPROCINX:=TOS;                                                    21258000
   IF GCLASSENABLEDMASK.CLASS0 THEN                                     21260000
      BEGIN  <<MEASUREMENT ENABLED FOR THIS STATISTICS CLASS>>          21262000
      TOS:=MEASSTATXDSBANK;                                             21264000
      TOS:=MEASSTATXDSBASE;                                             21266000
      TOS:=TOS+C0SUB0'SEGRELOFF;                                        21268000
      IF LISTSTATE.PROCIMIFLAG AND LISTSTATE.PROCDISCIOFLAG             21270000
      THEN TOS:=TOS+C'PAUSEBOTHTIME <<PAUSE MM AND USER IO>>   <<RAY.V>>21272000
      ELSE IF LISTSTATE.PROCIMIFLAG THEN                       <<RAY.V>>21274000
           TOS:=TOS+C'PAUSESWAPTIME                            <<RAY.V>>21276000
      ELSE IF LISTSTATE.PROCDISCIOFLAG  THEN                   <<RAY.V>>21278000
           TOS:=TOS+C'PAUSEDISCTIME                            <<RAY.V>>21280000
      ELSE TOS:=TOS+C'PAUSEIDLETIME;                           <<RAY.V>>21282000
      ASMB(LDEA);                                                       21284000
      TOS:=TIMER-SAVEPAUSETIME;                                         21286000
      ASMB(DADD;SDEA;DDEL);  <<WHY ARE WE PAUSING>>                     21288000
      END;                                                              21290000
                                                                        21292000
   END;                                                                 21294000
                                                                        21296000
<<                                                                      21298000
IF A PROCESS WAS RUNNING, LOG ITS QUIESCE, SAVE ITS REGISTER            21300000
STATES, RESCHEDULE IT, ACCOUNT FOR AND UPDATE RESOURCE USAGE            21302000
>>                                                                      21304000
                                                                        21306000
X:=LASTPROCINX;                                                         21308000
IF <> THEN   <<IF = THEN DISPATCHER HAD BEEN PAUSED>>                   21310000
   BEGIN                                                                21312000
   TOS:=ICS'STKBANK;                                                    21316000
   TOS:=ICS'STKBASE;                                                    21318000
   LASTSTKADDR:=TOS;                                                    21320000
   SAVESTATE;                                                           21322000
   X:=LASTPROCINX;                                                      21324000
   IF NOT PROCSTATE.SYSTEMPROCFLAG THEN RESCHEDULE ELSE        <<01913>>21326000
      BEGIN <<UPDATE CPU TIME USED FOR SYSTEM PROCESSES>>      <<01913>>21328000
      TOS:=LASTSTKADDR;                                        <<01913>>21330000
      TOS:=TOS+SBTOPROCTIMEDISP;                               <<01913>>21332000
      ASMB(LDEA;ZERO;RCLK;DADD;SDEA;DDEL);                     <<01913>>21334000
      END;                                                     <<01913>>21336000
   END;                                                                 21338000
                                                                        21340000
<<                                                                      21342000
DEVOTE THE CPU TO THE MOST URGENT PENDING ACTIVITY                      21344000
>>                                                                      21346000
                                                                        21348000
STARTSCANOVER:                                                          21350000
                                                                        21352000
ENABLE;                                                                 21354000
LISTSTATE:=MOREURGENTSWCNT:=0;                                          21356000
SWAPDELAY:=FALSE;                                                       21358000
SWAPFENCE:=WORSTPRI;                                                    21360000
CURRACTPRI:=0; <<MOST URGENT>>                                          21362000
                                                               <<01679>>21364000
<<CHECK FOR SCHEDULER MESSAGES>>                               <<01679>>21366000
                                                               <<01679>>21368000
TOS:=DST(MSGHARBTABDSTN&LSL(2)+2); <<BANK OF MSGHARB>>       <<<<01679>>21370000
TOS:=DST(X:=X+1); <<OFFSET INTO BANK>>                         <<01679>>21372000
TOS:=TOS+MSGPORTWORDNUM;<<ADDR OF SCHEDULER'S MSG PORT MASK>>  <<01679>>21374000
DISABLE;                                                       <<01679>>21376000
ASMB(LSEA;DEL,DDEL); <<SETS CC IF NON-ZERO>>                   <<01679>>21378000
IF <> THEN                                                     <<01679>>21380000
BEGIN                                                          <<01679>>21382000
PROCESSSCHEDMSGS; <<PROCESS MSGS FROM ICS MONITORS>>                    21384000
IF <> THEN                                                     <<01557>>21386000
   BEGIN  <<COULDN'T FIT IN A SEG FOR THE I/O SYSTEM>>         <<01557>>21388000
   SWAPDELAY:=TRUE;  <<SET CLOCK TO CHECK LATER>>              <<01557>>21390000
   SWAPFENCE:=0;  <<DON'T SCHEDULE MEMORY FOR ANY PROCESSES>>  <<01557>>21392000
   END;                                                        <<01557>>21394000
END;                                                           <<01679>>21396000
                                                                        21398000
<<                                                                      21400000
SCAN THE DISPQ, WORK ON MOST URGENT PROCESS READY OR REQUIRING ATTENTION21402000
>>                                                                      21404000
                                                                        21406000
DISABLE;                                                                21408000
AWAKETOSCHEDMSG:=WORSTPRI;                                              21410000
CANDPROCINX:=DISPQHEAD;                                        <<01987>>21412000
WHILE CANDPROCINX <> 0 DO                                      <<01987>>21414000
   BEGIN <<LAUNCH OR SWAP-IN THE PROCESS>>                              21416000
   CANDPIN:=((CANDPROCINX+SYSBASE-ABS(PCBP))/PCBSIZE);         <<01812>>21420000
   IF PF <> 0 THEN       <<POWERFAIL RECOVERY IN PROGRESS>>    <<02096>>21422000
       IF CANDPIN <> (PPIN/PCBSIZE) THEN  <<NOT PFAIL PIN>>    <<02096>>21424000
          GO TO PFAIL;                                         <<02096>>21426000
                                                               <<02096>>21428000
   X:=CANDPROCINX; <<FOR FAST ADDRESSING- DB DIRECT INDEXED>>  <<01987>>21430000
   TOS:=PROCSTATE.PIFLAGSFIELD;                                         21432000
   IF = THEN ASMB(DEL) ELSE                                             21434000
      BEGIN <<PENDING PSEUDO INTERRUPT>>                                21436000
      TOS:=TOS&LSL(9);                                                  21438000
      ASMB(SCAN 0;DEL);                                                 21440000
      IF X <> 4 AND X <> 3 THEN X:=CANDPROCINX ELSE                     21442000
         BEGIN << 3==>STOP,4==> HYB >>                                  21444000
         X:=CANDPROCINX;                                                21446000
         IF NOT RESABORTINFO.CRITFLAG                                   21448000
         AND NOT RESABORTINFO.HASSIRFLAG THEN                           21450000
            BEGIN <<THROW HIM OUT>>                                     21452000
            QUEUEPROC(CANDPROCINX,NOQUEUE,NOINFO);                      21454000
            GO STARTSCANOVER;                                           21456000
            END;                                                        21458000
         END;                                                           21460000
      END;                                                              21462000
   IF NOT RESABORTINFO.PCBSHORTWAITFLAG AND WAKEMASK.(0:15)<>0 THEN     21464000
      BEGIN                                                             21466000
      QUEUEPROC(X,NOQUEUE,NOINFO);                                      21468000
      GO STARTSCANOVER;                                                 21470000
      END;                                                              21472000
   IF WAKEMASK=0 THEN                                                   21474000
      BEGIN  <<PROCESS IS LAUNCHABLE>>                                  21476000
      LAUNCHPROCINX:=X;                                                 21478000
      ENABLE;                                                           21480000
      LAUNCH; <<NO RETURN>>                                             21482000
      END                                                               21484000
   ELSE                                                                 21486000
      BEGIN <<PROCESS NOT LAUNCHABLE>>                                  21488000
      IF NOT RESABORTINFO.SARFLAG THEN                                  21490000
         BEGIN  <<SOON LAUNCHABLE-DISC I/O OR SEGS ON WAY IN>>          21492000
         IF WAKEMASK.MEMORYWAKEFLAG THEN LISTSTATE.PROCIMIFLAG:=1       21494000
         ELSE LISTSTATE.PROCDISCIOFLAG:=1;                              21496000
         MOREURGENTSWCNT:=MOREURGENTSWCNT+1;                            21498000
         IF MEMORYPRESSURE THEN                                         21500000
            BEGIN                                                       21502000
            TOS:=X;                                                     21504000
            TOS:=0D;                                                    21506000
            TOS:=0;                                                     21508000
            ASMB(TSBC REFMINLOCBIT);                                    21510000
            ADJUSTLOCALITY(*,*,*,*);                                    21512000
            END;                                                        21514000
         CANDPROCINX:=NQPTR;  <<NEXT PROCESS TO CONSIDER>>     <<01987>>21516000
         END                                                            21518000
      ELSE                                                              21520000
         BEGIN  <<PROCESS NEEDS SOME MAIN MEMORY SCHEDULING>>           21522000
         IF(MEMORYPRESSURE LAND MOREURGENTSWCNT>=STATICMPLFENCE<<01913>>21526000
         LAND STATICMPLFENCE > 0)                              <<01987>>21528000
         LOR (INTEGER(QUEUEINGINFO).PRIFIELD >= SWAPFENCE) THEN<<01913>>21530000
            BEGIN <<NO ROOM FOR THIS PROCESS>>                          21532000
            CANDPROCINX:=NQPTR;<<NEXT PROC TO CONSIDER>>       <<01987>>21534000
            END                                                         21536000
         ELSE                                                           21538000
            BEGIN <<PROCESS REQUIRES SOME SEGMENTS>>                    21540000
            SWAPINPROCINX:=X;                                           21542000
            CURRACTPRI:=QUEUEINGINFO.PRIFIELD;                          21544000
            ENABLE;                                                     21546000
            SWAPSTATUS:=SWAPIN(SWAPINPROCINX,SOFTSWAP);        <<01987>>21548000
            IF SWAPSTATUS=MMOK THEN                            <<01987>>21552000
               BEGIN  <<SUCCESSFUL SWAP-IN>>                            21554000
               IF CURRACTPRI >= AWAKETOSCHEDMSG THEN           <<03766>>21558000
                  GO STARTSCANOVER;                            <<03766>>21560000
               MOREURGENTSWCNT:=MOREURGENTSWCNT+1; <<ON ITS WAY IN>>    21562000
               DISABLE; <<Q LINK INTEGRITY>>                            21564000
               CANDPROCINX:=NQPTR;<<NEXT  TO CONSIDER>>        <<01987>>21566000
               END                                                      21568000
            ELSE                                                        21570000
               BEGIN <<SWAPIN INCOMPLETE>>                              21572000
               IF SWAPSTATUS=MMIOERR THEN                      <<01987>>21574000
                  BEGIN <<DISC I/O ERROR-ABORT THE PROCESS>>            21576000
                  X:=SWAPINPROCINX;                                     21580000
                  ABORTPROCESS(SWAPINPROCINX,MAKEPRESIOERR);            21582000
                  GO STARTSCANOVER;                                     21584000
                  END                                                   21586000
               ELSE                                                     21588000
                  BEGIN                                                 21590000
                  IF AWAKETOSCHEDMSG < CURRACTPRI THEN                  21592000
                     BEGIN <<MORE URGENT PENDING ACTIVITY>>             21594000
                     IF GCLASSENABLEDMASK.CLASS0 THEN                   21598000
                        BEGIN  <<MEASURE GIVEUP>>                       21600000
                        TOS:=MEASSTATXDSBANK;                           21602000
                        TOS:=MEASSTATXDSBASE;                           21604000
                        TOS:=TOS+C0SUB0'SEGRELOFF+C'GIVEUP;    <<RAY.V>>21606000
                        ASMB(LSEA;INCA;SSEA;DDEL);                      21608000
                        END;                                            21610000
                     GO STARTSCANOVER;                                  21612000
                     END                                                21614000
                  ELSE                                                  21616000
                     BEGIN  <<NO ROOM OR DELAY>>                        21618000
                     SWAPDELAY:=TRUE;                                   21620000
                     IF SWAPSTATUS<>MMSEGBUSY                  <<01987>>21622000
                     THEN SWAPFENCE:=QUEUEINGINFO.PRIFIELD;    <<01987>>21624000
                     IF MOREURGENTSWCNT <> 0                   <<01987>>21626000
                     OR SWAPSTATUS = MMSEGBUSY THEN            <<01987>>21628000
                        BEGIN <<CONTINUE ON>>                  <<01987>>21630000
                        IF GCLASSENABLEDMASK.CLASS0 THEN       <<02007>>21634000
                           BEGIN                               <<02007>>21636000
                           IF SWAPSTATUS=MMTHRASHDANGER THEN   <<02007>>21638000
                              BEGIN  <<MEAS SWAPIN DEFERRAL>>  <<02007>>21640000
                              TOS:=MEASSTATXDSBANK;            <<02007>>21642000
                              TOS:=MEASSTATXDSBASE;            <<02007>>21644000
                              TOS:=TOS+C0SUB0'SEGRELOFF+       <<02007>>21646000
                                   C'DEFERRAL;                 <<02007>>21648000
                              ASMB(LSEA);                      <<02007>>21650000
                              TOS:=TOS+1;                      <<02007>>21652000
                              ASMB(SSEA;DDEL);                 <<02007>>21654000
                              END;                             <<02007>>21656000
                           END;                                <<02007>>21658000
                        DISABLE;                                        21660000
                        X:=CANDPROCINX;                                 21662000
                        CANDPROCINX:=NQPTR;                    <<01987>>21664000
                        END                                             21666000
                     ELSE                                               21668000
                        BEGIN <<HAVE TO MAKE SPACE-NOONE ELSE WILL RUN>>21670000
                        SWAPSTATUS:=SWAPIN(SWAPINPROCINX,HARDSWAP);     21672000
                        IF SWAPSTATUS=MMOK                     <<01987>>21674000
                        OR AWAKETOSCHEDMSG < CURRACTPRI THEN   <<01987>>21676000
                           BEGIN                               <<RAY.V>>21678000
                           IF SWAPSTATUS=MMOK THEN             <<01987>>21682000
                              BEGIN                            <<RAY.V>>21684000
                              IF GCLASSENABLEDMASK.CLASS0 THEN <<RAY.V>>21686000
                                 BEGIN                         <<RAY.V>>21688000
                                 TOS:=MEASSTATXDSBANK;         <<RAY.V>>21690000
                                 TOS:=MEASSTATXDSBASE;         <<RAY.V>>21692000
                                 TOS:=TOS+C0SUB0'SEGRELOFF;    <<RAY.V>>21694000
                                 TOS:=TOS+C'HARDREQUEST;       <<RAY.V>>21696000
                                 ASMB(LSEA);                   <<RAY.V>>21698000
                                 TOS:=TOS+1;                   <<RAY.V>>21700000
                                 ASMB(SSEA;DDEL);              <<RAY.V>>21702000
                                 END;                          <<RAY.V>>21704000
                              END                              <<02007>>21706000
                           ELSE                                <<02007>>21708000
                              IF GCLASSENABLEDMASK.CLASS0 THEN <<02007>>21710000
                                 BEGIN <<MEASURE SWAPIN GIVEUP><<02007>>21712000
                                 TOS:=MEASSTATXDSBANK;         <<02007>>21714000
                                 TOS:=MEASSTATXDSBASE;         <<02007>>21716000
                                 TOS:=TOS+C0SUB0'SEGRELOFF+    <<02007>>21718000
                                      C'GIVEUP;                <<02007>>21720000
                                 ASMB(LSEA);                   <<02007>>21722000
                                 TOS:=TOS+1;                   <<02007>>21724000
                                 ASMB(SSEA;DDEL);              <<02007>>21726000
                                 END;                          <<02007>>21728000
                           GO STARTSCANOVER;                            21730000
                           END                                          21732000
                        ELSE                                   <<RAY.V>>21734000
                           BEGIN                               <<RAY.V>>21736000
                           CANDPROCINX:=0;                     <<01987>>21738000
                           SWAPDELAY:=TRUE;                    <<RAY.V>>21740000
                           END;                                <<RAY.V>>21742000
                        END;                                            21744000
                     END;                                               21746000
                  END;                                                  21748000
               END;                                                     21750000
            END;                                                        21752000
         END;                                                           21754000
      END;                                                              21756000
   END;                                                                 21758000
                                                                        21760000
                                                                        21762000
<<                                                                      21764000
NOBODY TO LAUNCH OR SWAP-IN, SO FIX UP MEMORY UNTIL A PROCESS           21766000
BECOMES ACTIVE OR SWAP DELAY EXPIRES                                    21768000
>>                                                                      21770000
                                                                        21772000
CURRACTPRI:=WORSTPRI;                                                   21774000
ENABLE;                                                                 21776000
IF LOGICAL(GARBCOLLENABLED) AND MEMORYPRESSURE THEN COLLECTGARBAGE(0D); 21778000
DISABLE;                                                                21780000
                                                               <<02096>>21782000
PFAIL:       <<ONLY SWAP IN AND LAUNCH POWERFAIL PROCESS>>     <<02096>>21784000
             <<DO NOT LAUNCH ANY ONE ELSE>>                    <<02096>>21786000
                                                               <<02096>>21788000
IF AWAKETOSCHEDMSG < CURRACTPRI THEN GO STARTSCANOVER ELSE     <<03766>>21790000
   BEGIN  <<NOTHING WORTHWHILE TO DO, SO PAUSE>>                        21792000
   IF SWAPDELAY THEN TRL(4):=1;<<ALARM CLOCK>>                          21794000
   TOS:=0;                                                              21796000
   TOS.DISPRUNNINGFLAG:=1;                                              21798000
   TOS.PAUSEDFLAG:=1;                                                   21800000
   DISPTOAWAKEMSG:=TOS;                                                 21802000
   PENABLE;  <<WILL CAUSE DISPATCHER TO START OVER AFTER NEXT DISP>>    21804000
                                                                        21806000
   IF GCLASSENABLEDMASK.CLASS0 THEN                                     21808000
      BEGIN  <<MEASUREMENT ENABLED FOR THIS STATISTICS CLASS>>          21810000
      SAVEPAUSETIME:=TIMER;                                             21812000
      TOS:=MEASSTATXDSBANK;                                             21814000
      TOS:=MEASSTATXDSBASE;                                             21816000
      TOS:=TOS+C0SUB0'SEGRELOFF;                                        21818000
      IF DISPQHEAD=0 THEN TOS:=TOS+C'PAUSEIDLECNT              <<RAY.V>>21820000
      ELSE IF LISTSTATE.PROCIMIFLAG AND LISTSTATE.PROCDISCIOFLAG        21822000
      THEN TOS:=TOS+C'PAUSEBOTHCNT                             <<RAY.V>>21824000
      ELSE IF LISTSTATE.PROCIMIFLAG THEN                       <<RAY.V>>21826000
           TOS:=TOS+C'PAUSESWAPCNT                             <<RAY.V>>21828000
      ELSE IF LISTSTATE.PROCDISCIOFLAG THEN                    <<RAY.V>>21830000
           TOS:=TOS+C'PAUSEDISCCNT;                            <<RAY.V>>21832000
      ASMB(LSEA);                                                       21834000
      TOS:=TOS+1;                                                       21836000
      ASMB(SSEA;DDEL);  <<WHY ARE WE PAUSING>>                          21838000
      END;                                                              21840000
                                                                        21842000
   ENABLE;                                                              21844000
                                                               <<02091>>21846000
PAUSELOOP:                                                     <<02091>>21848000
IF ICS(-ICS'PDISCNTCELL) <> 0 THEN                             <<02091>>21850000
                                                               <<02091>>21852000
   COMMENT:  The purpose of the following code is to cover up  <<02091>>21854000
             a pdisable problem in which an interrupt handler  <<02091>>21856000
             appears to execute a pdisable without a           <<02091>>21858000
             corresponding penable.  This strange problem      <<02091>>21860000
             always appears to leave the pdisable count at 1.  <<02091>>21862000
             If this condition is met, we shall execute a      <<02091>>21864000
             penable on behalf of the defective software       <<02091>>21866000
             [a small prayer is in order here] and continue    <<02091>>21868000
             execution.  Otherwise we shall HALT the machine.  <<02091>>21870000
             Previously, the software crashed the machine      <<02091>>21872000
             with a SUDDENDEATH(634).  When this problem is    <<02091>>21874000
             corrected the SUDDENDEATH should be implemented;  <<02091>>21876000
                                                               <<02091>>21878000
   IF ICS(-ICS'PDISCNTCELL) = 1 THEN                           <<02091>>21880000
      PENABLE   <<It's a miracle>>                             <<02091>>21882000
   ELSE                                                        <<02091>>21884000
      IF TRUE THEN                                             <<02091>>21886000
         ASSEMBLE (HALT 7)  <<The Lord giveth and . . . >>     <<02091>>21888000
      ELSE                                                     <<02091>>21890000
         SUDDENDEATH(634);  <<Leave the SF hook in>>           <<02091>>21892000
   ASSEMBLE(PAUS);                                             <<02091>>21894000
   GO TO PAUSELOOP;                                            <<02091>>21896000
                                                               <<02091>>21898000
   HELP;                                                                21900000
   END;                                                                 21902000
END  <<DSP>>;                                                           21904000
                                                                        21906000
                                                                        21908000
$CONTROL SEGMENT=MAIN                                                   21910000
END  <<KERNELC>>.                                                       21912000
